- 基于Spider父类进行全站数据的爬取
- 全站数据的爬取:将所有页码对应的页面数据进行爬取
- 手动请求的发送(get):
yield scrapy.Request(url,callback)
- 对yield的总结:
- 向管道提交item的时候:yield item
- 手动请求发送:yield scrapy.Request(url,callback)
- 手动发起post请求:
yield scrapy.FormRequest(url,formdata,callback) formdata是一个字典表示的是请求参数
- scrapy的请求传参
- 作用:实现深度爬取。
- 使用场景:如果使用scrapy爬取的数据没有存在同一张页面中
- 传递item:yield scrapy.Request(url,callback,meta)
- 接收item:response.meta
# -*- coding: utf-8 -*-
import scrapy
from MovieAll.items import MovieallItem
class MovieSpider(scrapy.Spider):
name = 'movie'
# allowed_domains = ['www.xx.com']
start_urls = ['https://www.4567tv.tv/index.php/vod/show/class/喜剧/id/6/page/1.html']
url = 'https://www.4567tv.tv/index.php/vod/show/class/喜剧/id/1/page/%d.html'
page = 1
def parse(self, response):
print('正在爬取第%d页的数据......' % self.page)
li_list = response.xpath('/html/body/div[1]/div/div/div/div[2]/ul/li')
for li in li_list:
item = MovieallItem()
name = li.xpath('./div/a/@title').extract_first()
item['name'] = name
detail_url = 'https://www.4567tv.tv'+li.xpath('./div/a/@href').extract_first()
print('detail_url',detail_url)
#可以对详情页的url进行手动请求的发送
#请求传参:让Request将一个数据值(字典)传递给回调函数
yield scrapy.Request(detail_url, callback=self.parse_detail, meta={'item': item})
if self.page < 3:
self.page += 1
print('!!!!!!!!!!!!!!!!!!!!!!!!')
new_url = format(self.url % self.page)
yield scrapy.Request(new_url, callback=self.parse)
def parse_detail(self, response):
item = response.meta['item']
desc = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[5]/span[2]/text()').extract_first()
item['desc'] = desc
# 如果要继续深入爬取 就在这里继续让Request将一个数据值(字典)传递给新的回调函数
# yield scrapy.Request(detail_url, callback=self.parse_detail, meta={'item': item})
# 然后把本方法里面的yield item写到新的回调函数里面
yield item
ps: 可以提升scrapy爬取数据的效率的方法
- 在配置文件中进行相关的配置即可:
增加并发:
默认scrapy开启的并发线程为32个,可以适当进行增加。在settings配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100。
降低日志级别:
在运行scrapy时,会有大量日志信息的输出,为了减少CPU的使用率。可以设置log输出信息为INFO或者ERROR即可。在配置文件中编写:LOG_LEVEL = ‘INFO’
禁止cookie:
如果不是真的需要cookie,则在scrapy爬取数据时可以禁止cookie从而减少CPU的使用率,提升爬取效率。在配置文件中编写:COOKIES_ENABLED = False
禁止重试:
对失败的HTTP进行重新请求(重试)会减慢爬取速度,因此可以禁止重试。在配置文件中编写:RETRY_ENABLED = False
减少下载超时:
如果对一个非常慢的链接进行爬取,减少下载超时可以能让卡住的链接快速被放弃,从而提升效率。在配置文件中进行编写:DOWNLOAD_TIMEOUT = 10 超时时间为10s