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实现的一只从百度开始不断搜索的小爬虫
Aug 13 Python
举例讲解Python中is和id的用法
Apr 03 Python
Python中每次处理一个字符的5种方法
May 21 Python
python中字典(Dictionary)用法实例详解
May 30 Python
Python使用cookielib模块操作cookie的实例教程
Jul 12 Python
对Python3中bytes和HexStr之间的转换详解
Dec 04 Python
django orm 通过related_name反向查询的方法
Dec 15 Python
解决项目pycharm能运行,在终端却无法运行的问题
Jan 19 Python
Python实现截取PDF文件中的几页代码实例
Mar 11 Python
Tensorflow 卷积的梯度反向传播过程
Feb 10 Python
python GUI库图形界面开发之PyQt5图片显示控件QPixmap详细使用方法与实例
Feb 27 Python
简单了解Java Netty Reactor三种线程模型
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 数组二分法查找函数代码
2010/02/16 PHP
PHP 反向排序和随机排序代码
2010/06/30 PHP
php检查字符串中是否有外链的方法
2015/07/29 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
php使用PDO下exec()函数查询执行后受影响行数的方法
2017/03/28 PHP
JS 页面自动加载函数(兼容多浏览器)
2009/05/18 Javascript
xml转json的js代码
2012/08/28 Javascript
jsp+javascript打造级连菜单的实例代码
2013/06/14 Javascript
JS 实现Table相同行的单元格自动合并示例代码
2013/08/27 Javascript
jQuery validate+artdialog+jquery form实现弹出表单思路详解
2016/04/18 Javascript
Sequelize中用group by进行分组聚合查询
2016/12/12 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
微信小程序提取公用函数到util.js及使用方法示例
2019/01/10 Javascript
JS使用cookie保存用户登录信息操作示例
2019/05/30 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
vue 遮罩层阻止默认滚动事件操作
2020/07/28 Javascript
vue style width a href动态拼接问题的解决
2020/08/07 Javascript
[48:45]Ti4 循环赛第二日 NEWBEE vs EG
2014/07/11 DOTA
[01:06]DOTA2小知识课堂 Ep.01 TP出门不要忘记帮队友灌瓶哦
2019/12/05 DOTA
Python自动化运维之IP地址处理模块详解
2017/12/10 Python
python获取代理IP的实例分享
2018/05/07 Python
Tensorflow使用tfrecord输入数据格式
2018/06/19 Python
基于python实现的百度新歌榜、热歌榜下载器(附代码)
2019/08/05 Python
python+selenium 鼠标事件操作方法
2019/08/24 Python
python操作gitlab API过程解析
2019/12/27 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
贝尔帐篷精品店:Bell Tent Boutique
2019/06/12 全球购物
Tomcat中怎么使用log4j输出所有的log
2016/07/07 面试题
腾讯技术类校园招聘笔试试题
2014/05/06 面试题
介绍一下EJB的体系结构
2012/08/01 面试题
项目经理聘任书
2014/03/29 职场文书
第二批党的群众路线教育实践活动个人整改方案
2014/10/31 职场文书
高考作弊检讨书1500字
2015/02/16 职场文书
python实现自动化群控的步骤
2021/04/11 Python
MySQL索引失效场景及解决方案
2022/07/23 MySQL