一 請求傳參
在某種情況下,我們要爬取的數據會在不同的頁面中。例如:我們爬取一個電影的網站時,電影的評分和名稱在第一個頁面中,而要爬取的電影詳情在其的子頁面中。這時我們就需要動態傳參來實現。
需求: 爬取https://www.4567tv.tv/frim/index1.html中的電影名和導演名稱
# -*- coding: utf-8 -*-
import scrapy
from moviePro.items import MovieproItem
#請求傳參 重點*****
#item不能是全局的
class MovieSpider(scrapy.Spider):
name = 'movie'
# allowed_domains = ['www.xxx.com']
start_urls = ['https://www.4567tv.tv/frim/index1.html']
#模擬parse來寫
def parse_detail(self,response):
#通過response 來獲取回調函數傳遞過來的item
item = response.meta['item']
actor = response.xpath('/html/body/div[1]/div/div/div/div[2]/p[3]/a/text()').extract_first()
item['actor'] =actor
#提交item
yield item
#item 寫在這 因為parse中的request 才能實現請求傳參
def parse(self, response):
li_list = response.xpath('//li[@class="col-md-6 col-sm-4 col-xs-3"]')
for li in li_list:
item = MovieproItem()
name = li.xpath('./div/a/@title').extract_first()
detail_url = 'https://www.4567tv.tv'+li.xpath('./div/a/@href').extract_first()
#發送的為get請求 callback 是一個回調函數
item['name']=name
#meta是一個字典類型 將item傳遞給回調函數的response參數(也就是回調方法) 請求傳參
yield scrapy.Request(url=detail_url,callback=self.parse_detail,meta={'item':item})
items文件
import scrapy
class MovieproItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
actor = scrapy.Field()
二 Scrapy中的日志等級
在使用scrap crawl filename運行程序時,在終端打印輸入的就是Scrapy日志信息
日志信息的種類:
? ERROR:一般錯誤
? WARIING:警告
? INFO:一般信息
? DEBUG:調試信息
設置日志指定輸入:
在settings.py配置文件中,加入:
LOG_LEVEL ='指定日志信息的種類即可'
LOG_FILE = 'log.txt'表示的是將日志信息寫入到指定的文件中進行存儲
如何提高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
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态