第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器

编写spiders爬虫文件循环抓取内容

Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数,
  参数:
  url='url'
  callback=页面处理函数
  使用时需要yield Request()

parse.urljoin()方法,是urllib库下的方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request #导入url返回给下载器的方法
from urllib import parse #导入urllib库里的parse模块 class PachSpider(scrapy.Spider):
name = 'pach'
allowed_domains = ['blog.jobbole.com'] #起始域名
start_urls = ['http://blog.jobbole.com/all-posts/'] #起始url def parse(self, response):
"""
获取列表页的文章url地址,交给下载器
"""
#获取当前页文章url
lb_url = response.xpath('//a[@class="archive-title"]/@href').extract() #获取文章列表url
for i in lb_url:
# print(parse.urljoin(response.url,i)) #urllib库里的parse模块的urljoin()方法,是自动url拼接,如果第二个参数的url地址是相对路径会自动与第一个参数拼接
yield Request(url=parse.urljoin(response.url, i), callback=self.parse_wzhang) #将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环
x_lb_url = response.xpath('//a[@class="next page-numbers"]/@href').extract() #获取下一页文章列表url
if x_lb_url:
yield Request(url=parse.urljoin(response.url, x_lb_url[0]), callback=self.parse) #获取到下一页url返回给下载器,回调给parse函数循环进行 def parse_wzhang(self,response):
title = response.xpath('//div[@class="entry-header"]/h1/text()').extract() #获取文章标题
print(title)

Request()函数在返回url时,同时可以通过meta属性返回一个自定义字典给回调函数

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request #导入url返回给下载器的方法
from urllib import parse #导入urllib库里的parse模块
from adc.items import AdcItem #导入items数据接收模块的接收类 class PachSpider(scrapy.Spider):
name = 'pach'
allowed_domains = ['blog.jobbole.com'] #起始域名
start_urls = ['http://blog.jobbole.com/all-posts/'] #起始url def parse(self, response):
"""
获取列表页的文章url地址,交给下载器
"""
#获取当前页文章url
lb = response.css('div .post.floated-thumb') #获取文章列表区块,css选择器
# print(lb)
for i in lb:
lb_url = i.css('.archive-title ::attr(href)').extract_first('') #获取区块里文章url
# print(lb_url) lb_img = i.css('.post-thumb img ::attr(src)').extract_first('') #获取区块里文章缩略图
# print(lb_img) yield Request(url=parse.urljoin(response.url, lb_url), meta={'lb_img':parse.urljoin(response.url, lb_img)}, callback=self.parse_wzhang) #将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环
x_lb_url = response.css('.next.page-numbers ::attr(href)').extract_first('') #获取下一页文章列表url
if x_lb_url:
yield Request(url=parse.urljoin(response.url, x_lb_url), callback=self.parse) #获取到下一页url返回给下载器,回调给parse函数循环进行 def parse_wzhang(self,response):
title = response.css('.entry-header h1 ::text').extract() #获取文章标题
# print(title) tp_img = response.meta.get('lb_img', '') #接收meta传过来的值,用get获取防止出错
# print(tp_img) shjjsh = AdcItem() #实例化数据接收类
shjjsh['title'] = title #将数据传输给items接收模块的指定类
shjjsh['img'] = tp_img yield shjjsh #将接收对象返回给pipelines.py处理模块

Scrapy内置图片下载器使用

Scrapy给我们内置了一个图片下载器在crapy.pipelines.images.ImagesPipeline,专门用于将爬虫抓取到图片url后将图片下载到本地

第一步、爬虫抓取图片URL地址后,填充到 items.py文件的容器函数

  爬虫文件

# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request #导入url返回给下载器的方法
from urllib import parse #导入urllib库里的parse模块
from adc.items import AdcItem #导入items数据接收模块的接收类 class PachSpider(scrapy.Spider):
name = 'pach'
allowed_domains = ['blog.jobbole.com'] #起始域名
start_urls = ['http://blog.jobbole.com/all-posts/'] #起始url def parse(self, response):
"""
获取列表页的文章url地址,交给下载器
"""
#获取当前页文章url
lb = response.css('div .post.floated-thumb') #获取文章列表区块,css选择器
# print(lb)
for i in lb:
lb_url = i.css('.archive-title ::attr(href)').extract_first('') #获取区块里文章url
# print(lb_url) lb_img = i.css('.post-thumb img ::attr(src)').extract_first('') #获取区块里文章缩略图
# print(lb_img) yield Request(url=parse.urljoin(response.url, lb_url), meta={'lb_img':parse.urljoin(response.url, lb_img)}, callback=self.parse_wzhang) #将循环到的文章url添加给下载器,下载后交给parse_wzhang回调函数 #获取下一页列表url,交给下载器,返回给parse函数循环
x_lb_url = response.css('.next.page-numbers ::attr(href)').extract_first('') #获取下一页文章列表url
if x_lb_url:
yield Request(url=parse.urljoin(response.url, x_lb_url), callback=self.parse) #获取到下一页url返回给下载器,回调给parse函数循环进行 def parse_wzhang(self,response):
title = response.css('.entry-header h1 ::text').extract() #获取文章标题
# print(title) tp_img = response.meta.get('lb_img', '') #接收meta传过来的值,用get获取防止出错
# print(tp_img) shjjsh = AdcItem() #实例化数据接收类
shjjsh['title'] = title #将数据传输给items接收模块的指定类
shjjsh['img'] = [tp_img] yield shjjsh #将接收对象返回给pipelines.py处理模块

第二步、设置 items.py 文件的容器函数,接收爬虫获取到的数据填充

# -*- 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 #items.py,文件是专门用于,接收爬虫获取到的数据信息的,就相当于是容器文件 class AdcItem(scrapy.Item): #设置爬虫获取到的信息容器类
title = scrapy.Field() #接收爬虫获取到的title信息
img = scrapy.Field() #接收缩略图
img_tplj = scrapy.Field() #图片保存路径

第三步、在pipelines.py使用crapy内置的图片下载器

1、首先引入内置图片下载器

2、自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类

3、使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径

4、在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
from scrapy.pipelines.images import ImagesPipeline #导入图片下载器模块 class AdcPipeline(object): #定义数据处理类,必须继承object
def process_item(self, item, spider): #process_item(item)为数据处理函数,接收一个item,item里就是爬虫最后yield item 来的数据对象
print('文章标题是:' + item['title'][0])
print('文章缩略图url是:' + item['img'][0])
print('文章缩略图保存路径是:' + item['img_tplj']) #接收图片下载器填充的,图片下载后的路径 return item class imgPipeline(ImagesPipeline): #自定义一个图片下载内,继承crapy内置的ImagesPipeline图片下载器类
def item_completed(self, results, item, info): #使用ImagesPipeline类里的item_completed()方法获取到图片下载后的保存路径
for ok, value in results:
img_lj = value['path'] #接收图片保存路径
# print(ok)
item['img_tplj'] = img_lj #将图片保存路径填充到items.py里的字段里
return item #将item给items.py 文件的容器函数 #注意:自定义图片下载器设置好后,需要在

在settings.py设置文件里,注册自定义图片下载器类,和设置图片保存路径

IMAGES_URLS_FIELD 设置要下载图片的url地址,一般设置的items.py里接收的字段
IMAGES_STORE 设置图片保存路径

# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'adc.pipelines.AdcPipeline': 300, #注册adc.pipelines.AdcPipeline类,后面一个数字参数表示执行等级,
'adc.pipelines.imgPipeline': 1, #注册自定义图片下载器,数值越小,越优先执行
} IMAGES_URLS_FIELD = 'img' #设置要下载图片的url字段,就是图片在items.py里的字段里
lujin = os.path.abspath(os.path.dirname(__file__))
IMAGES_STORE = os.path.join(lujin, 'img') #设置图片保存路径

第三百四十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器的更多相关文章

  1. 二十 Python分布式爬虫打造搜索引擎Scrapy精讲—编写spiders爬虫文件循环抓取内容—meta属性返回指定值给回调函数—Scrapy内置图片下载器

    编写spiders爬虫文件循环抓取内容 Request()方法,将指定的url地址添加到下载器下载页面,两个必须参数, 参数: url='url' callback=页面处理函数 使用时需要yield ...

  2. 第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

    第三百四十二节,Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存 注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 ...

  3. 二十一 Python分布式爬虫打造搜索引擎Scrapy精讲—爬虫数据保存

    注意:数据保存的操作都是在pipelines.py文件里操作的 将数据保存为json文件 spider是一个信号检测 # -*- coding: utf-8 -*- # Define your ite ...

  4. 第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中

    第三百五十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—将selenium操作谷歌浏览器集成到scrapy中 1.爬虫文件 dispatcher.connect()信号分发器,第一个参数信 ...

  5. 第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

    第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到 ...

  6. 第三百六十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引

    第三百六十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)倒排索引 倒排索引 倒排索引源于实际应用中需要根据属性的值来查找记录.这种索引表中的每一项都包 ...

  7. 第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用、自动限速、自定义spider的settings,对抗反爬机制

    第三百四十九节,Python分布式爬虫打造搜索引擎Scrapy精讲—cookie禁用.自动限速.自定义spider的settings,对抗反爬机制 cookie禁用 就是在Scrapy的配置文件set ...

  8. 第三百四十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware中间件全局随机更换user-agent浏览器用户代理

    第三百四十七节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过downloadmiddleware随机更换user-agent浏览器用户代理 downloadmiddleware介绍中间件是 ...

  9. 第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍

    第三百四十六节,Python分布式爬虫打造搜索引擎Scrapy精讲—Requests请求和Response响应介绍 Requests请求 Requests请求就是我们在爬虫文件写的Requests() ...

随机推荐

  1. 每天一个linux命令(4) df命令

    linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...

  2. spark快速上手

    spark快速上手 前言 基于Spark 2.1版本 仅仅是快速上手,没有深究细节 主要参考是官方文档 代码均为官方文档中代码,语言为Scala 进入spark-shell 终端输入spark-she ...

  3. MFC中获取命令行参数的几种方法

    在MFC程序中,可以用以下几种方法来获取命令行参数. 为方便说明,我们假设执行了命令:C:\test\app.exe -1 -2 方法一 ::GetCommandLine(); 将获取到 " ...

  4. FIDDLER的使用方法及技巧总结(连载四)FIDDLER通用规则更改

    四.FIDDLER通用规则更改 To make custom changes to web requests and responses, use FiddlerScript to add rules ...

  5. SQL Server 2008 R2升级到SQL Server 2012 SP1

    1.建议对生产环境对的数据库升级之前做好备份,以防不测. 2.从SQL Server 2008 R2 升级到SQL Server 2012 SP1,需要先安装SQL Server 2008 R2 的S ...

  6. OpenCV探索之路(十七):Mat和IplImage访问像素的方法总结

    在opencv的编程中,遍历访问图像元素是经常遇到的操作,掌握其方法非常重要,无论是Mat类的像素访问,还是IplImage结构体的访问的方法,都必须扎实掌握,毕竟,图像处理本质上就是对像素的各种操作 ...

  7. iOS开发:一个高仿美团的团购ipad客户端的设计和实现(功能:根据拼音进行检索并展示数据,离线缓存团购数据,浏览记录与收藏记录的批量删除等)

    大致花了一个月时间,利用各种空闲时间,将这个客户端实现了,在这里主要是想记录下,设计的大体思路以及实现过程中遇到的坑...... 这个项目的github地址:https://github.com/wz ...

  8. 基于jquery地图特效全国网点查看代码

    基于jquery地图特效全国网点查看代码.这是一款简单实用的jQuery地图特效,主要知识点是jquery和css实现了中图地图,提示层效果.效果图如下: 在线预览   源码下载 实现的代码. htm ...

  9. 一个JS引发的血案

    转载一篇大师傅的文章: 原文链接:http://xn--i2r.ml/index.php/2017/08/05/39.html 又到了周末,闲来无聊,挖挖补天 找了个目标,发现一个站 查看源码发现一个 ...

  10. docker探索-docker安装运行tomcat(六)

    前言      本地已经搭建好了,tomcat容器,本来想自己写一篇,在开源中国一篇不错的教程,就转载过来了 本文转自:https://my.oschina.net/sunchp/blog/61652 ...