廣東出現(xiàn)新病毒是真的嗎關(guān)鍵詞優(yōu)化方法有什么步驟
scrapy數(shù)據(jù)建模與請求
學(xué)習(xí)目標:
- 應(yīng)用 在scrapy項目中進行建模
- 應(yīng)用 構(gòu)造Request對象,并發(fā)送請求
- 應(yīng)用 利用meta參數(shù)在不同的解析函數(shù)中傳遞數(shù)據(jù)
1. 數(shù)據(jù)建模
通常在做項目的過程中,在items.py中進行數(shù)據(jù)建模
1.1 為什么建模
- 定義item即提前規(guī)劃好哪些字段需要抓,防止手誤,因為定義好之后,在運行過程中,系統(tǒng)會自動檢查
- 配合注釋一起可以清晰的知道要抓取哪些字段,沒有定義的字段不能抓取,在目標字段少的時候可以使用字典代替
- 使用scrapy的一些特定組件需要Item做支持,如scrapy的ImagesPipeline管道類,百度搜索了解更多
1.2 如何建模
在items.py文件中定義要提取的字段:
# Define here the models for your scraped items
# See documentation in:
# https://docs.scrapy.org/en/latest/topics/items.htmlimport scrapy
class DoubanItem(scrapy.Item):# define the fields for your item here like:name = scrapy.Field() # 名字content = scrapy.Field() # 內(nèi)容link = scrapy.Field() # 鏈接txt = scrapy.Field() #詳情介紹
1.3 如何使用模板類
模板類定義以后需要在爬蟲中導(dǎo)入并且實例化,之后的使用方法和使用字典相同
job.py:
from myspider.items import MyspiderItem # 導(dǎo)入Item,注意路徑
...def parse(self, response)item = MyspiderItem() # 實例化后可直接使用item['name'] = node.xpath('./h3/text()').extract_first()item['title'] = node.xpath('./h4/text()').extract_first()item['desc'] = node.xpath('./p/text()').extract_first()print(item)
注意:
- from myspider.items import MyspiderItem這一行代碼中 注意item的正確導(dǎo)入路徑,忽略pycharm標記的錯誤
- python中的導(dǎo)入路徑要訣:從哪里開始運行,就從哪里開始導(dǎo)入
1.4 開發(fā)流程總結(jié)
- 創(chuàng)建項目
scrapy startproject 項目名 - 明確目標
在items.py文件中進行建模 - 創(chuàng)建爬蟲
3.1 創(chuàng)建爬蟲
scrapy genspider 爬蟲名 允許的域
3.2 完成爬蟲
修改start_urls
檢查修改allowed_domains
編寫解析方法 - 保存數(shù)據(jù)
在pipelines.py文件中定義對數(shù)據(jù)處理的管道
在settings.py文件中注冊啟用管道
2. 翻頁請求的思路
對于要提取如下圖中所有頁面上的數(shù)據(jù)該怎么辦?
回顧requests模塊是如何實現(xiàn)翻頁請求的:
- 找到下一頁的URL地址
- 調(diào)用requests.get(url)
scrapy實現(xiàn)翻頁的思路:
- 找到下一頁的url地址
- 構(gòu)造url地址的請求對象,傳遞給引擎
3. 構(gòu)造Request對象,并發(fā)送請求
3.1 實現(xiàn)方法
- 確定url地址
- 構(gòu)造請求,scrapy.Request(url,callback)
- callback:指定解析函數(shù)名稱,表示該請求返回的響應(yīng)使用哪一個函數(shù)進行解析
- 把請求交給引擎:yield scrapy.Request(url,callback)
3.2 網(wǎng)易招聘爬蟲
通過爬取豆瓣新書速遞的頁面信息,學(xué)習(xí)如何實現(xiàn)翻頁請求
地址: https://book.douban.com/latest?icn=index-latestbook-all
思路分析:
- 獲取首頁的數(shù)據(jù)
- 尋找下一頁的地址,進行翻頁,獲取數(shù)據(jù)
注意:
- 可以在settings中設(shè)置ROBOTS協(xié)議
# False表示忽略網(wǎng)站的robots.txt協(xié)議,默認為True
ROBOTSTXT_OBEY = False
- 可以在settings中設(shè)置User-Agent:
# scrapy發(fā)送的每一個請求的默認UA都是設(shè)置的這個User-Agent
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'
scrapy.Request的更多參數(shù)
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
參數(shù)解釋
- 中括號里的參數(shù)為可選參數(shù)
- callback:表示當前的url的響應(yīng)交給哪個函數(shù)去處理
- meta:實現(xiàn)數(shù)據(jù)在不同的解析函數(shù)中傳遞,meta默認帶有部分數(shù)據(jù),比如下載延遲,請求深度等
- dont_filter:默認為False,會過濾請求的url地址,即請求過的url地址不會繼續(xù)被請求,對需要重復(fù)請求的url地址可以把它設(shè)置為Ture,比如貼吧的翻頁請求,頁面的數(shù)據(jù)總是在變化;start_urls中的地址會被反復(fù)請求,否則程序不會啟動
- method:指定POST或GET請求
- headers:接收一個字典,其中不包括cookies
- cookies:接收一個字典,專門放置cookies
- body:接收json字符串,為POST的數(shù)據(jù),發(fā)送payload_post請求時使用(在下一章節(jié)中會介紹post請求)
4. meta參數(shù)的使用
meta的作用:meta可以實現(xiàn)數(shù)據(jù)在不同的解析函數(shù)中的傳遞
在爬蟲文件的parse方法中,提取詳情頁增加之前callback指定的parse_detail函數(shù):
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"]
特別注意
- meta參數(shù)是一個字典
- meta字典中有一個固定的鍵
proxy
,表示代理ip,關(guān)于代理ip的使用我們將在scrapy的下載中間件的學(xué)習(xí)中進行介紹
小結(jié)
- 完善并使用Item數(shù)據(jù)類:
- 在items.py中完善要爬取的字段
- 在爬蟲文件中先導(dǎo)入Item
- 實力化Item對象后,像字典一樣直接使用
- 構(gòu)造Request對象,并發(fā)送請求:
- 導(dǎo)入scrapy.Request類
- 在解析函數(shù)中提取url
- yield scrapy.Request(url, callback=self.parse_detail, meta={})
- 利用meta參數(shù)在不同的解析函數(shù)中傳遞數(shù)據(jù):
- 通過前一個解析函數(shù) yield scrapy.Request(url, callback=self.xxx, meta={}) 來傳遞meta
- 在self.xxx函數(shù)中 response.meta.get(‘key’, ‘’) 或 response.meta[‘key’] 的方式取出傳遞的數(shù)據(jù)