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通过加号运算符操作列表的方法
Jul 28 Python
python变量不能以数字打头详解
Jul 06 Python
利用Python为iOS10生成图标和截屏
Sep 24 Python
深入理解python中的atexit模块
Mar 07 Python
Python实现的rsa加密算法详解
Jan 24 Python
python Django的web开发实例(入门)
Jul 31 Python
节日快乐! Python画一棵圣诞树送给你
Dec 24 Python
浅谈selenium如何应对网页内容需要鼠标滚动加载的问题
Mar 14 Python
pycharm安装及如何导入numpy
Apr 03 Python
Keras 中Leaky ReLU等高级激活函数的用法
Jul 05 Python
最新Python idle下载、安装与使用教程图文详解
Nov 28 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 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的varchar字段的长度范围
2011/06/24 PHP
PHP扩展CURL的用法详解
2014/06/20 PHP
php获取json数据所有的节点路径
2015/05/17 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
Yaf框架封装的MySQL数据库操作示例
2019/03/06 PHP
window.open的功能全解析
2006/10/10 Javascript
js滚动条回到顶部的代码
2011/12/06 Javascript
js螺旋动画效果的具体实例
2013/11/15 Javascript
Javascript实现滚动图片新闻的实例代码
2013/11/27 Javascript
jscript读写二进制文件的方法
2015/04/22 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
微信JS-SDK坐标位置如何转换为百度地图坐标
2016/07/04 Javascript
AngularJS动态生成div的ID源码解析
2016/08/29 Javascript
jQuery EasyUI tree 使用拖拽时遇到的错误小结
2016/10/10 Javascript
AngularJs中Bootstrap3 datetimepicker使用实例
2016/12/13 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
2017/02/06 Javascript
nodejs 日志模块winston的使用方法
2018/05/02 NodeJs
js 计算图片内点个数的示例代码
2019/04/04 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
python使用calendar输出指定年份全年日历的方法
2015/04/04 Python
python 查找文件名包含指定字符串的方法
2018/06/05 Python
Window 64位下python3.6.2环境搭建图文教程
2018/09/19 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
python环境下安装opencv库的方法
2020/03/05 Python
Python grequests模块使用场景及代码实例
2020/08/10 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
大一期末自我鉴定
2013/12/13 职场文书
致长跑运动员广播稿
2014/01/31 职场文书
班级入场式解说词
2014/02/01 职场文书
篮球比赛策划方案
2014/06/05 职场文书
假如给我三天光明读书笔记
2015/06/26 职场文书
初中生入团申请书范文(五篇)
2019/10/16 职场文书
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
详解Mysql数据库平滑扩容解决高并发和大数据量问题
2022/05/25 MySQL