Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码


Posted in Python onMarch 04, 2018

大家可以在Github上clone全部源码。

Github:https://github.com/williamzxl/Scrapy_CrawlMeiziTu

Scrapy官方文档:http://scrapy-chs.readthedocs.io/zh_CN/latest/index.html

基本上按照文档的流程走一遍就基本会用了。

Step1:

在开始爬取之前,必须创建一个新的Scrapy项目。 进入打算存储代码的目录中,运行下列命令:

scrapy startproject CrawlMeiziTu

该命令将会创建包含下列内容的 tutorial 目录:

CrawlMeiziTu/
 scrapy.cfg
 CrawlMeiziTu/
  __init__.py
  items.py
  pipelines.py
  settings.py

 middlewares.py
  spiders/
   __init__.py
   ...
cd CrawlMeiziTu
scrapy genspider Meizitu http://www.meizitu.com/a/list_1_1.html

该命令将会创建包含下列内容的 tutorial 目录:

CrawlMeiziTu/
 scrapy.cfg
 CrawlMeiziTu/

 __init__.py
  items.py
  pipelines.py
  settings.py


 middlewares.py
  spiders/



 Meizitu.py
   __init__.py
   ...

我们主要编辑的就如下图箭头所示:

Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码

main.py是后来加上的,加了两条命令,

from scrapy import cmdline
cmdline.execute("scrapy crawl Meizitu".split())

主要为了方便运行。

Step2:编辑Settings,如下图所示

BOT_NAME = 'CrawlMeiziTu' 
 SPIDER_MODULES = ['CrawlMeiziTu.spiders']
 NEWSPIDER_MODULE = 'CrawlMeiziTu.spiders'
 ITEM_PIPELINES = {
 'CrawlMeiziTu.pipelines.CrawlmeizituPipeline': 300,
 }
 IMAGES_STORE = 'D://pic2'
 DOWNLOAD_DELAY = 0.3

 USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
 ROBOTSTXT_OBEY = True

主要设置USER_AGENT,下载路径,下载延迟时间

Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码

Step3:编辑Items.

Items主要用来存取通过Spider程序抓取的信息。由于我们爬取妹子图,所以要抓取每张图片的名字,图片的连接,标签等等

# -*- coding: utf-8 -*-
# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html
import scrapy
class CrawlmeizituItem(scrapy.Item):
 # define the fields for your item here like:
 # name = scrapy.Field()
 #title为文件夹名字
 title = scrapy.Field()
 url = scrapy.Field()
 tags = scrapy.Field()
 #图片的连接
 src = scrapy.Field()
 #alt为图片名字
 alt = scrapy.Field()

Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码

Step4:编辑Pipelines

Pipelines主要对items里面获取的信息进行处理。比如说根据title创建文件夹或者图片的名字,根据图片链接下载图片。

# -*- coding: utf-8 -*-
import os
import requests
from CrawlMeiziTu.settings import IMAGES_STORE
class CrawlmeizituPipeline(object):
 def process_item(self, item, spider):
  fold_name = "".join(item['title'])
  header = {
   'USER-Agent': 'User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36',
   'Cookie': 'b963ef2d97e050aaf90fd5fab8e78633',
   #需要查看图片的cookie信息,否则下载的图片无法查看
  }
  images = []
  # 所有图片放在一个文件夹下
  dir_path = '{}'.format(IMAGES_STORE)
  if not os.path.exists(dir_path) and len(item['src']) != 0:
   os.mkdir(dir_path)
  if len(item['src']) == 0:
   with open('..//check.txt', 'a+') as fp:
    fp.write("".join(item['title']) + ":" + "".join(item['url']))
    fp.write("\n")
  for jpg_url, name, num in zip(item['src'], item['alt'],range(0,100)):
   file_name = name + str(num)
   file_path = '{}//{}'.format(dir_path, file_name)
   images.append(file_path)
   if os.path.exists(file_path) or os.path.exists(file_name):
    continue
   with open('{}//{}.jpg'.format(dir_path, file_name), 'wb') as f:
    req = requests.get(jpg_url, headers=header)
    f.write(req.content)
  return item

Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码

Step5:编辑Meizitu的主程序。

最重要的主程序:

# -*- coding: utf-8 -*-
import scrapy
from CrawlMeiziTu.items import CrawlmeizituItem
#from CrawlMeiziTu.items import CrawlmeizituItemPage
import time
class MeizituSpider(scrapy.Spider):
 name = "Meizitu"
 #allowed_domains = ["meizitu.com/"]
 start_urls = []
 last_url = []
 with open('..//url.txt', 'r') as fp:
  crawl_urls = fp.readlines()
  for start_url in crawl_urls:
   last_url.append(start_url.strip('\n'))
 start_urls.append("".join(last_url[-1]))
 def parse(self, response):
  selector = scrapy.Selector(response)
  #item = CrawlmeizituItemPage()
  next_pages = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()
  next_pages_text = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/text()').extract()
  all_urls = []
  if '下一页' in next_pages_text:
   next_url = "http://www.meizitu.com/a/{}".format(next_pages[-2])
   with open('..//url.txt', 'a+') as fp:
    fp.write('\n')
    fp.write(next_url)
    fp.write("\n")
   request = scrapy.http.Request(next_url, callback=self.parse)
   time.sleep(2)
   yield request
  all_info = selector.xpath('//h3[@class="tit"]/a')
  #读取每个图片夹的连接
  for info in all_info:
   links = info.xpath('//h3[@class="tit"]/a/@href').extract()
  for link in links:
   request = scrapy.http.Request(link, callback=self.parse_item)
   time.sleep(1)
   yield request
  # next_link = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/@href').extract()
  # next_link_text = selector.xpath('//*[@id="wp_page_numbers"]/ul/li/a/text()').extract()
  # if '下一页' in next_link_text:
  #  nextPage = "http://www.meizitu.com/a/{}".format(next_link[-2])
  #  item['page_url'] = nextPage
  #  yield item

   #抓取每个文件夹的信息
 def parse_item(self, response):
   item = CrawlmeizituItem()
   selector = scrapy.Selector(response)

   image_title = selector.xpath('//h2/a/text()').extract()
   image_url = selector.xpath('//h2/a/@href').extract()
   image_tags = selector.xpath('//div[@class="metaRight"]/p/text()').extract()
   if selector.xpath('//*[@id="picture"]/p/img/@src').extract():
   image_src = selector.xpath('//*[@id="picture"]/p/img/@src').extract()
   else:
   image_src = selector.xpath('//*[@id="maincontent"]/div/p/img/@src').extract()
   if selector.xpath('//*[@id="picture"]/p/img/@alt').extract():
    pic_name = selector.xpath('//*[@id="picture"]/p/img/@alt').extract()
   else:
   pic_name = selector.xpath('//*[@id="maincontent"]/div/p/img/@alt').extract()
   #//*[@id="maincontent"]/div/p/img/@alt
   item['title'] = image_title
   item['url'] = image_url
   item['tags'] = image_tags
   item['src'] = image_src
   item['alt'] = pic_name
   print(item)
   time.sleep(1)
   yield item

Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码

总结

以上所述是小编给大家介绍的Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码,希望对大家有所帮助,如果大家啊有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
python实现k均值算法示例(k均值聚类算法)
Mar 16 Python
python制作花瓣网美女图片爬虫
Oct 28 Python
【Python】Python的urllib模块、urllib2模块批量进行网页下载文件
Nov 19 Python
Python3实现简单可学习的手写体识别(实例讲解)
Oct 21 Python
Pycharm远程调试openstack的方法
Nov 21 Python
Python 用Redis简单实现分布式爬虫的方法
Nov 23 Python
python从子线程中获得返回值的方法
Jan 30 Python
python多线程高级锁condition简单用法示例
Nov 07 Python
PyTorch实现更新部分网络,其他不更新
Dec 31 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 Python
Django使用channels + websocket打造在线聊天室
May 20 Python
方法汇总:Python 安装第三方库常用
Apr 26 Python
Python爬虫框架Scrapy实例代码
Mar 04 #Python
详解python中asyncio模块
Mar 03 #Python
python3.6+django2.0开发一套学员管理系统
Mar 03 #Python
python爬虫面试宝典(常见问题)
Mar 02 #Python
Python基于Flask框架配置依赖包信息的项目迁移部署
Mar 02 #Python
谈谈python中GUI的选择
Mar 01 #Python
纯python实现机器学习之kNN算法示例
Mar 01 #Python
You might like
PHP链接MySQL的常用扩展函数
2014/10/23 PHP
推荐十款免费 WordPress 插件
2015/03/24 PHP
javascript基于jQuery的表格悬停变色/恢复,表格点击变色/恢复,点击行选Checkbox
2008/08/05 Javascript
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
JS的get和set使用示例
2014/02/20 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
js实现楼层效果的简单实例
2016/07/15 Javascript
JavaScript结合Bootstrap仿微信后台多图文界面管理
2016/07/22 Javascript
深入浅出ES6新特性之函数默认参数和箭头函数
2016/08/01 Javascript
javaScript中封装的各种写法示例(推荐)
2017/07/03 Javascript
详解JS数值Number类型
2018/02/07 Javascript
使用vue-router beforEach实现判断用户登录跳转路由筛选功能
2018/06/25 Javascript
vue 基于element-ui 分页组件封装的实例代码
2018/12/10 Javascript
countUp.js实现数字滚动效果
2019/10/18 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
2020/08/04 Javascript
简介Python设计模式中的代理模式与模板方法模式编程
2016/02/02 Python
Python 正则表达式入门(中级篇)
2016/12/07 Python
python try except 捕获所有异常的实例
2018/10/18 Python
强悍的Python读取大文件的解决方案
2019/02/16 Python
Python实现的企业粉丝抽奖功能示例
2019/07/26 Python
python通过链接抓取网站详解
2019/11/20 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
2020/04/26 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
pytorch查看模型weight与grad方式
2020/06/24 Python
opencv+pyQt5实现图片阈值编辑器/寻色块阈值利器
2020/11/13 Python
详解python3 GUI刷屏器(附源码)
2021/02/18 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
公司员工的自我评价范例
2013/11/01 职场文书
医学院学生的自我评价分享
2013/11/19 职场文书
合同审查法律意见书
2015/06/04 职场文书
感恩父母主题班会
2015/08/12 职场文书
学雷锋广播稿大全
2015/08/19 职场文书
如何在CocosCreator里画个炫酷的雷达图
2021/04/16 Javascript
Java Dubbo框架知识点梳理
2021/06/26 Java/Android
Java 数组内置函数toArray详解
2021/06/28 Java/Android
分享python函数常见关键字
2022/04/26 Python