說明:初學者,整理後方便能及時完善,冗餘之處請多提建議,感謝!
瞭解內容:
Scrapy :抓取數據的爬蟲框架
異步與非阻塞的區別
異步:指的是整個過程,中間若是是非阻塞的,那就是異步過程;
非阻塞:關注拿到結果以前的狀態 (若是拿到結果前在等待,是阻塞,反之,是非阻塞)
理解:
Scrapy 基本工做流程(簡單--->複雜)
每一個模塊間不通信,模塊之間經過引擎進行數據傳輸
基本使用
1、建立spider
scrapy項目流程
---建立項目
---scrapy startproject xxxx
---建立爬蟲
---cd 項目目錄下
---scrapy genspider aaa allowed_domains"」
first_spider 爬蟲名字
--完善spider
---提取數據,提取url地址構成request對象
xpath extract_first()\extract() response.meta yield scrapy.Requeest
--完善管道
--運行爬蟲
--- cd 項目目錄
---scrapy crawl first_spider
注意:避免爬蟲名和項目名重複 ;
無論在終端仍是pycharm 都要切換到當前目錄下 cd myspider
allowed_domains : 限定爬取的範圍
2、完善spider
---- 對數據的提取
一、 Scray 中的parse 作什麼用途?
---處理start_urls 中的url地址的響應
2 、yiele 生成器的使用
好處:遍歷函數的返回值的時候,挨個把數據讀到內存,不會形成內存的瞬間佔用太高
經過yield傳遞數據給管道,(相似轉發)
yield可以傳遞的對象只能是:BaseItem, Request, dict, None
3 、使用.extract()把response.xpath()提取的數據轉化爲字符串列表
.extract() 返回一個含有字符串的列表,沒有返回空列表
.extract_first() 提取列表中的第一個字符串,若是不存在,返回None
----例:
yield的使用:使用多個yield 來傳遞須要的數據
上面的代碼應該改爲:yield itempython
四、 根據Response返回的url地址,對next_url的url地址進行拼接,構造請求,有5種方式
第1種:手動字符串相加
第2種:urllib.parse.urljoin(baseurl,url) 後面的url會根據baseurl進行url地址的拼接
第3種:response.follow(url ,callback) 可以根據response的地址把url拼接完整,構形成Request對象,
但這個方法在python 1.0後的版本中才有
第4種(
推薦):response.urljoin(next_url)
更簡潔、好用
第5種:scrapy.Request(url,callback,meta,dont_filter)
---例:
# 第一種:手動拼接下一頁url
#主站連接 用來拼接
base_site = 'https://www.jpdd.com'
def parse(self,response):
book_urls = response.xpath('//table[@class="p-list"]//a/@href').extract()
for book_url in book_urls:
url = self.base_site + book_url
yield scrapy.Request(url, callback=self.getInfo)
#獲取下一頁
next_page_url = self.base_site + response.xpath(
'//table[@class="p-name"]//a[contains(text(),"下一頁")]/@href'
).extract()[0]
yield scrapy.Request(next_page_url, callback=self.parse)
使用urllib實現url地址拼接的原理:
3、完善管道
管道的設置也是以鍵值的形式
數據保存:能夠是具體的item,也能夠保存在文件中,以下2種方式
第一種:
第二種:
------數字越小,表示離引擎越近,數據越先通過處理,反之 。mongodb
-------使用多個管道時,前面的管道中要記得return xx 否則後面的管道接收不到前面的數據,會返回none
4、item的使用
爲何要單獨定義item?
定義item即提早規劃好哪些字段須要抓取,scrapy.Field()僅僅是提早佔坑,經過item.py可以讓別人清楚本身的爬蟲是在抓取什麼數據;
同時來提示哪些字段是須要抓取的,沒有定義的字段不能使用,防止手誤;
item不能直接存入mongodb中,須要轉化爲字典後再存儲。
Item使用以前須要先導入而且實例化,以後的使用方法和使用字典相同
from yanguan.items import YanguanItem
item = YanguanItem() #實例化
補充:
構造翻頁請求
meta 自身是個字典
Scrapy.Request() ===>至關於構造了一個requests對象
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
參數說明:
括號中的參數爲可選參數
callback:表示當前的url的響應交給哪一個函數去處理
meta:實現數據在不一樣的解析函數中傳遞,meta默認帶有部分數據,好比下載延遲,請求深度等
dont_filter:默認會過濾請求的url地址,即請求過的url地址不會繼續被請求,對須要重複請求的url地址能夠把它設置爲Ture,好比貼吧的翻頁請求,頁面的數據老是在變化;start_urls中的地址會被反覆請求,不然程序不會啓動cookie