共计 7914 个字符,预计需要花费 20 分钟才能阅读完成。
【百度云搜索,搜各种资料:http://bdy.lqkweb.com】
【搜网盘,搜各种资料:http://www.swpan.cn】
编写 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') #设置图片保存路径
【转载自:http://www.lqkweb.com】