概括:上一節學習了pyspider框架,這一節我們來看一下Scrapy的強大之處,他應該是目前python使用的最廣泛的爬蟲框架,
特別注意:很多人學Python程序中會遇到各種煩惱問題,沒有人解答容易放棄,為此小編建了個Python全堆疊免費答疑.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python實戰教程免非下,,一起相互監督共同進步!一、簡單實體,了解基本,
1、安裝Scrapy框架
這里如果直接pip3 install scrapy可能會出錯,
所以你可以先安裝lxml:pip3 install lxml(已安裝請忽略),
安裝pyOpenSSL:在官網下載wheel檔案,
安裝Twisted:在官網下載wheel檔案,
安裝PyWin32:在官網下載wheel檔案,
下載地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/
配置環境變數:將scrapy所在目錄添加到系統環境變數即可,
ctrl+f搜索即可,
最后安裝scrapy,pip3 install scrapy
2、創建一個scrapy專案
新創建一個目錄,按住shift-右鍵-在此處打開命令視窗
輸入:scrapy startproject tutorial即可創建一個tutorial檔案夾
檔案夾目錄如下:
|-tutorial
|-scrapy.cfg
|-__init__.py
|-items.py
|-middlewares.py
|-pipelines.py
|-settings.py
|-spiders
|-__init__.py
檔案的功能:
scrapy.cfg:組態檔
spiders:存放你Spider檔案,也就是你爬取的py檔案
items.py:相當于一個容器,和字典較像
middlewares.py:定義Downloader Middlewares(下載器中間件)和Spider Middlewares(蜘蛛中間件)的實作
pipelines.py:定義Item Pipeline的實作,實作資料的清洗,儲存,驗證,
settings.py:全域配置
3、創建一個spider(自己定義的爬蟲檔案)
例如以爬取貓眼熱映口碑榜為例子來了解一下:
在spiders檔案夾下創建一個maoyan.py檔案,你也可以按住shift-右鍵-在此處打開命令視窗,輸入:scrapy genspider 檔案名 要爬取的網址,
自己創建的需要自己寫,使用命令創建的包含最基本的東西,
我們來看一下使用命令創建的有什么,
介紹一下這些是干嘛的:
name:是專案的名字
allowed_domains:是允許爬取的域名,比如一些網站有相關鏈接,域名就和本網站不同,這些就會忽略,
atart_urls:是Spider爬取的網站,定義初始的請求url,可以多個,
parse方法:是Spider的一個方法,在請求start_url后,之后的方法,這個方法是對網頁的決議,與提取自己想要的東西,
response引數:是請求網頁后回傳的內容,也就是你需要決議的網頁,
還有其他引數有興趣可以去查查,
4、定義Item
item是保存爬取資料的容器,使用的方法和字典差不多,
我們打開items.py,之后我們想要提取的資訊有:
index(排名)、title(電影名)、star(主演)、releasetime(上映時間)、score(評分)
于是我們將items.py檔案修改成這樣,
即可,
5、再次打開spider來提取我們想要的資訊
修改成這樣:
好了,一個簡單的爬蟲就寫完了,
6、運行
在該檔案夾下,按住shift-右鍵-在此處打開命令視窗,輸入:scrapy crawl maoyan(專案的名字)
即可看到:
7、保存
我們只運行了代碼,看看有沒有報錯,并沒有保存,
如果我們想保存為csv、xml、json格式,可以直接使用命令:
在該檔案夾下,按住shift-右鍵-在此處打開命令視窗,輸入:
scrapy crawl maoyan -o maoyan.csv
scrapy crawl maoyan -o maoyan.xml
scrapy crawl maoyan -o maoyan.json
選擇其中一個即可,當然如果想要保存為其他格式也是可以的,這里只說常見的,這里選擇json格式,運行后會發現,在檔案夾下多出來一個maoyan.json的檔案,打開之后發現,中文都是一串亂碼,這里需要修改編碼方式,當然也可以在配置里修改
(在settings.py檔案中添加FEED_EXPORT_ENCODING='UTF8'即可),
如果想直接在命令列中修改:
scrapy crawl maoyan -o maoyan.json -s FEED_EXPORT_ENCODING=UTF8
即可,
這里自己試試效果吧,
當然我們保存也可以在運行的時候自動保存,不需要自己寫命令,后面介紹(我們還有還多檔案沒有用到呦),
二、scrapy如何決議?
之前寫過一篇文章:三大決議庫的使用
但是scrapy也提供了自己的決議方式(Selector),和上面的也很相似,我們來看一下:
1、css
首先需要匯入模塊:from scrapy import Selector
例如有這樣一段html代碼:
html='<html><head><title>Demo</title></head><body><div class='cla'>This is Demo</div></body></html>
1.1、首先需要構建一個Selector物件
sel = Selector(html)
text = sel.css('.cla::text').extract_first()
.cla表示選中上面的div節點,::text表示獲取文本,這里和以前的有所不同,
extract_first()表示回傳第一個元素,因為上述 sel.css('.cla::text')回傳的是一個串列,你也可以寫成sel.css('.cla::text')[0]來獲取第一個元素,但是如果為空,就會報出超出最大索引的錯誤,不建議這樣寫,而使用extract_first()就不會報錯,同時如果寫成extract_first('123')這樣,如果為空就回傳123
1.2、有了選取第一個,就有選取所有:extract()表示選取所有,如果回傳的是多個值,就可以是這樣寫,
1.3、獲取屬性就是sel.css('.cla::sttr('class')').extract_first()表示獲取class
1.4、獲取指定屬性的文本:sel.css('div[]::text')
1.5、其他寫法和css的寫法如出一轍,
1.6、在scrapy中為我們提供了一個簡便的寫法,在上述的簡單實體中,我們知道了response為請求網頁的回傳值,
我們可以直接寫成:response.css()來決議,提取我們想要的資訊,同樣,下面要說的XPath也可以直接寫成:
response.xpath()來決議,
2、Xpath
Xpath的使用可以看上面的文章:三大決議庫的使用
注意:獲取的還是串列,所以還是要加上extract_first()或者extract()
3、正則匹配(這里用response操作)
例如:response.css('a::text').re('寫正則')
這里如果response.css('a::text')匹配的是多個物件,那么加上正則也是匹配符合要求的多個物件,
這里如果想要匹配第一個物件,可以把re()修改成re_first()即可,
注意:response不可以直接呼叫re(),response.xpath('.').re()可以相當于達到直接使用正則的效果,
正則的使用:萬能的正則運算式
三、Dowmloader Middleware的使用
本身scrapy就提供了很多Dowmloader Middleware,但是有時候我們要修改,
比如修改User-Agent,使用代理ip等,
以修改User-Agent為例(設定代理ip大同小異):
第一種方法,可以在settings.py中直接添加USER-AGENT='xxx'
但是我們想要添加多個User-Agent,每次隨機獲取一個可以利用Dowmloader Middleware來設定,
第一步將settings中的USER-AGENT='xxx'修改成USER-AGENT=["xxx","xxxxx","xxxxxxx"]
第二步在middlewares.py中添加:
from_crawler():通過引數crawler可以拿到配置的資訊,我們的User-Agent在組態檔里,所以我們需要獲取到,
方法名不可以修改,
第三步在settings.py中添加:
將scrapy自帶的UserAgentmiddleware的鍵值設定為None,
自定義的設定為400,這個鍵值越小表示優先呼叫的意思,
四、Item Pipeline的使用,
1、進行資料的清洗
在一的實體中我們把評分小于等于8.5分的score修改為(不好看!),我們認為是不好看的電影,我們將pipeline.py修改成這樣:
在setting.py中添加:
我們執行一下:
2、儲存
2.1儲存為json格式
我們將pipeline.py修改成這樣:
在setting.py中添加:
表示先執行TextPipeline方法,再執行JsonPipeline方法,先清洗,再儲存,
2.2儲存在mysql資料庫
首先在mysql資料庫中創建一個資料庫maoyanreying,創建一個表maoyan,
我們將pipeline.py修改成這樣:
在setting.py中添加:
總結注意:很多人學Python程序中會遇到各種煩惱問題,沒有人解答容易放棄,為此小編建了個Python全堆疊免費答疑.裙 :七衣衣九七七巴而五(數字的諧音)轉換下可以找到了,不懂的問題有老司機解決里面還有最新Python實戰教程免非下,,一起相互監督共同進步!
本文的文字及圖片來源于網路加上自己的想法,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/176802.html
標籤:Python
上一篇:i = i+1 和 i += 1
