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中常用检测字符串相关函数汇总
Apr 15 Python
python模拟登录并且保持cookie的方法详解
Apr 04 Python
python先序遍历二叉树问题
Nov 10 Python
Python实现读取json文件到excel表
Nov 18 Python
Windows下Anaconda2安装NLTK教程
Sep 19 Python
使用python对文件中的单词进行提取的方法示例
Dec 21 Python
python3.6连接mysql数据库及增删改查操作详解
Feb 10 Python
python设置表格边框的具体方法
Jul 17 Python
Python实现手绘图效果实例分享
Jul 22 Python
Pycharm快捷键配置详细整理
Oct 13 Python
python collections模块的使用
Oct 16 Python
基于Python爬取素材网站音频文件
Oct 21 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
DC的38部超级英雄动画电影
2020/03/03 欧美动漫
CI框架开发新浪微博登录接口源码完整版
2014/05/28 PHP
PHP is_subclass_of函数的一个BUG和解决方法
2014/06/01 PHP
php实现给一张图片加上水印效果
2016/01/02 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
PHP var关键字相关原理及使用实例解析
2020/07/11 PHP
VBScript版代码高亮
2006/06/26 Javascript
javascript OFFICE控件测试代码
2009/12/08 Javascript
javascript中利用数组实现的循环队列代码
2010/01/24 Javascript
EasyUI中的tree用法介绍
2011/11/01 Javascript
JS getAttribute和setAttribute(取得和设置属性)的使用介绍
2013/07/10 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
JavaScript中的数据类型转换方法小结
2015/10/26 Javascript
Javascript实现从小到大的数组转换成二叉搜索树
2017/06/13 Javascript
JS实现处理时间,年月日,星期的公共方法示例
2019/05/31 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
详解Python的Django框架中的模版相关知识
2015/07/15 Python
详解Python中的变量及其命名和打印
2016/03/11 Python
python如何在终端里面显示一张图片
2016/08/17 Python
django开发之settings.py中变量的全局引用详解
2017/03/29 Python
利用python打印出菱形、三角形以及矩形的方法实例
2017/08/08 Python
django如何通过类视图使用装饰器
2019/07/24 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
python批量替换文件名中的共同字符实例
2020/03/05 Python
django 装饰器 检测登录状态操作
2020/07/02 Python
Django nginx配置实现过程详解
2020/09/10 Python
Python+unittest+requests 接口自动化测试框架搭建教程
2020/10/09 Python
美国手机支架公司:PopSockets
2019/11/27 全球购物
GOLFINO英国官网:高尔夫服装
2020/04/11 全球购物
中学生运动会通讯稿大全
2014/09/18 职场文书
师德先进个人材料
2014/12/20 职场文书
2016大一新生军训心得体会
2016/01/11 职场文书
mysql 直接拷贝data 目录下文件还原数据的实现
2021/07/25 MySQL
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL