scrapy发送翻页请求
1.翻頁請求的思路
對于要提取如下圖中所有頁面上的數據該怎么辦?
回顧requests模塊是如何實現翻頁請求的:
scrapy實現翻頁的思路:
2.scrapy實現翻頁請求
2.1 實現方法
callback:指定解析函數名稱,表示該請求返回的響應使用哪一個函數進行解析
2.2 騰訊招聘爬蟲
通過爬取騰訊招聘的頁面的招聘信息,學習如何實現翻頁請求
地址:http://hr.tencent.com/position.php
思路分析:
注意:
1.可以在settings中設置ROBOTS協議
# False表示忽略網站的robots.txt協議,默認為True ROBOTSTXT_OBEY = False2.可以在settings中設置User-Agent:
# scrapy發送的每一個請求的默認UA都是設置的這個User-Agent USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTM2.3 代碼實現
在爬蟲文件的parse方法中:
# 提取下一頁的href并拼接url next_url = 'https://hr.tencent.com/' + response.xpath('//a[text()="下一頁"]/@href').extract_first() # 判斷是否是最后一頁 if response.xpath('//a[text()="下一頁"]/@href').extract_first() != 'javascript:;':# 構造scrapy.Request對象,并yield給引擎# 利用callback參數指定該Request對象之后獲取的響應用哪個函數進行解析# 利用meta參數將本函數中提取的數據傳遞給callback指定的函數# 注意這里是yieldyield scrapy.Request(next_url, callback=self.parse)2.4 scrapy.Request的更多參數
scrapy.Request(url[,callback,method="GET",headers,body,cookies,\ meta,dont_filter=False])參數解釋
3.meta參數的使用
meta的形式:字典
meta的作用:meta可以實現數據在不同的解析函數中的傳遞參數
在爬蟲文件的parse方法中,提取詳情頁增加之前
def parse(self,response):...yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item}) ...def parse_detail(self,response):#獲取之前傳入的itemitem = resposne.meta["item"]特別注意:
1.meta參數是一個字典
2.meta字典中有一個固定的鍵proxy,表示代理ip,關于代理ip的使用我們將在scrapy的下載中間件的學習中進行介紹
4. item的使用
4.1 Item能夠做什么
定義item即提前規劃好哪些字段需要抓取,scrapy.Field()僅僅是提前占坑,通過item.py能夠讓別人清楚自己的爬蟲是在抓取什么,同時定義好哪些字段是需要抓取的,沒有定義的字段不能使用,防止手誤
在python大多數框架中,大多數框架都會自定義自己的數據類型(在python自帶的數據結構基礎上進行封裝),目的是增加功能,增加自定義異常
4.2 定義Item
在items.py文件中定義要提取的字段:
class TencentItem(scrapy.Item): name = scrapy.Field() # 招聘標題address = scrapy.Field() # 工作地址time = scrapy.Field() # 發布時間job_content = scrapy.Field() # 工作職責4.3 使用Item
Item使用之前需要先導入并且實例化,之后的使用方法和使用字典相同
修改爬蟲文件itcast.py:
注意:
總結
1.1 在items.py中完善要爬取的字段
1.2 在爬蟲文件中先導入Item
1.3 實力化Item對象后,像字典一樣直接使用
2.1 導入scrapy.Request類
2.2 在解析函數中提取url
2.3 yield scrapy.Request(url, callback=self.parse_detail, meta={})
3.1 通過前一個解析函數 yield scrapy.Request(url, callback=self.xxx, meta={}) 來傳遞meta
3.2 在self.xxx函數中 response.meta.get(‘key’, ‘’) 或 response.meta[‘key’] 的方式取出傳遞的數據
參考代碼
Tencent/spiders/tencent.py
import scrapy from Tencent.items import TencentItem # 導入Item,注意路徑class TencentSpider(scrapy.Spider):name = 'tencent'allowed_domains = ['hr.tencent.com']start_urls = ['http://hr.tencent.com/position.php']def parse(self, response):tr_list = response.xpath('//*[@class="tablelist"]//tr')[1:-1]for tr in tr_list:meta_dict = {}meta_dict['name'] = tr.xpath('.//a[1]/text()').extract_first()meta_dict['address'] = tr.xpath('./td[4]/text()').extract_first()meta_dict['time'] = tr.xpath('./td[5]/text()').extract_first()meta_dict['href'] = tr.xpath('.//a[1]/@href').extract_first()detail_url = 'https://hr.tencent.com/' + meta_dict['href']yield scrapy.Request(detail_url, callback=self.parse_detail, meta=meta_dict)# 提取下一頁的href并拼接urlnext_url = 'https://hr.tencent.com/' + response.xpath('//a[text()="下一頁"]/@href').extract_first()# 判斷是否是最后一頁if response.xpath('//a[text()="下一頁"]/@href').extract_first() != 'javascript:;':# 構造scrapy.Request對象,并yield給引擎# 利用callback參數指定該Request對象之后獲取的響應用哪個函數進行解析# 利用meta參數將本函數中提取的數據傳遞給callback指定的函數# 注意這里是yieldyield scrapy.Request(next_url, callback=self.parse)def parse_detail(self,response):meta_dict = response.meta # 獲取傳入的metaitem = TencentItem() # 實例化后可直接使用item['name'] = meta_dict['name']item['address'] = meta_dict['address']item['time'] = meta_dict['time']# 加入崗位職責數據item['job_content'] = response.xpath('//ul[@class="squareli"]/li/text()').extract()print(item)Tencent/items.py
import scrapyclass TencentItem(scrapy.Item):name = scrapy.Field() # 招聘標題address = scrapy.Field() # 工作地址time = scrapy.Field() # 發布時間job_content = scrapy.Field() # 工作職責Tencent/settings.py
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'ROBOTSTXT_OBEY = False總結
以上是生活随笔為你收集整理的scrapy发送翻页请求的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: scrapy框架的概念和流程
- 下一篇: python 爬取今日头条热点新闻