前言
這次咱們來玩一個在Python中很牛叉的爬蟲框架——Scrapy。
scrapy 介紹
標準介紹
Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架,非常出名,非常強悍。所謂的框架就是一個已經被集成了各種功能(高性能異步下載,隊列,分布式,解析,持久化等)的具有很強通用性的項目模板。對於框架的學習,重點是要學習其框架的特性、各個功能的用法即可。說人話就是
只要是搞爬蟲的,用這個就van事了,因為裡面集成了一些很棒的工具,並且爬取性能很高,預留有很多鉤子方便擴展,實在是居家爬蟲的不二之選。windows下安裝scrapy
命令
pip install scrapy
默認情況下,直接
pip install scrapy
可能會失敗,如果沒有換源,加上臨時源安裝試試,這裡使用的是清華源,常見安裝問題可以參考這個文章:Windows下安裝Scrapy方法及常見安裝問題總結——Scrapy安裝教程。
命令
pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple
scrapy創建爬蟲項目
命令
scrapy startproject <項目名稱>
示例:創建一個糗事百科的爬蟲項目(記得cd到一個乾淨的目錄哈)
scrapy startproject qiushibaike
注:此時,我們已經創建好了一個爬蟲項目,但是爬蟲項目是一個文件夾
進入爬蟲項目
如果想要進入這個項目,就要cd進這個目錄,如上上圖所示,先cd <項目>,再創建蜘蛛
項目目錄結構解析
此時,我們就已經進入了項目,結構如下,有一個和項目名同名的文件夾和一個scrapy.cfg文件
scrapy.cfg # scrapy配置,特殊情況使用此配置
qiushibaike # 項目名同名的文件夾
items.py # 數據存儲模板,定製要保存的欄位
middlewares.py # 爬蟲中間件
pipelines.py # 編寫數據持久化代碼
settings.py # 配置文件,例如:控制爬取速度,多大並發量,等
__init__.py
spiders # 爬蟲目錄,一個個爬蟲文件,編寫數據解析代碼
__init__.py
呃,可能此時你並不能懂這麼些目錄什麼意思,不過不要慌,使用一下可能就懂了,別慌。
創建蜘蛛
通過上述的操作,假設你已經成功的安裝好了scrapy,並且進入了創建的項目
那麼,我們就創建一個蜘蛛,對糗事百科的段子進行爬取。
創建蜘蛛命令
scrapy genspider <蜘蛛名稱> <網頁的起始url>
示例:創建糗事百科的段子蜘蛛
scrapy genspider duanzi ww.com
注:網頁的起始url可以隨便寫,可以隨便改,但是必須有
此時在spider文件夾下,會多一個
duanzi.py
文件
代碼解釋如下
如果大家在學習中遇到困難,想找一個python學習交流環境,可以加入我們的python裙,關注小編,並私信「01」即可進裙,領取python學習資料,會節約很多時間,減少很多遇到的難題。
爬取數據前準備
創建好蜘蛛之後,需要在配置一些東西的,不能直接就爬的,默認是爬取不了的,需要簡單配置一下
打開
settings.py
文件,找到
ROBOTSTXT_OBEY
和
USER_AGENT
變量
ROBOTSTXT_OBEY配置
等於False不遵守robot協議,默認只有搜尋引擎網站才會允許爬取,例如百度,必應等,個人爬取需要忽略這個,否則爬取不了
USER_AGENT配置
User-Agent
是一個最基本的請求必須帶的參數,如果這個帶的不是正常的,必定爬取不了。
User-Agent
Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36
小試牛刀之獲取糗事百科段子段子連結
準備工作做好了,那就開始吧!!!
此處我們需要有
xpath
的語法基礎,其實挺簡單的,沒有基礎的記得百度一下,其實不百度也沒關係,跟著學,大概能看懂
實現功能
通過xpath獲取每個段子下的
a
標籤連接
注:審查元素和按住
crtl+f
搜索內容和寫xpath這裡不再囉嗦
分析頁面規則
通過審查工具,我們可以看到,class包含article的標籤就是一個個的文章,可能你想到
xpath
可能可以這樣寫
xpath代碼
//div[@class='article']
但是你會發現一個都查不出來,因為是包含的關係,所以需要用
contains
關鍵字
我們需要這樣寫
xpath代碼
//div[contains(@class,"article")]
但是會發現,這定位的太多了,並不是每個段子的
div,所以我們要多包含幾個,這樣,就是每個段子的div了
//div[contains(@class,"article") and contains(@class,"block")]
上述已經成功定位了一個個的段子,下面在此基礎上,定位到每個段子下的a標籤
根據審查元素,發現每個段子下class="contentHerf"的a標籤,就是每個段子的詳情頁
詳情頁,要定位的a標籤的href確實是詳情頁的url
xpath代碼
//div[contains(@class,"article") and contains(@class,"block")]//a[@class="contentHerf"]
這樣,我們就定位了一個個
a
標籤,只至少在控制臺操作是沒問題的,那麼,我們使用Python代碼操作一下吧
代碼
def parse(self, response):a_href_list = response.xpath('//div[contains(@class,"article") and contains(@class,"block")]//a[@class="contentHerf"]/@href').extract()print(a_href_list)
啟動蜘蛛命令
scrapy crawl <爬蟲名> [--nolog]
注:
--nolog
參數不加表示一系列日誌,一般用於調試,加此參數表示只輸入print內容
示例:啟動段子命令
scrapy crawl duanzi --nolog
成功拿到每一個連結。
獲取詳情頁內容
在上述,我們成功的獲取到了每個段子的連結,但是會發現有的段子是不全的,需要進入進入詳情頁才能看到所以段子內容,那我們就使用爬蟲來操作一下吧。
我們定義一下標題和內容。
根據元素審查,標題的定位xpath是:
//h1[@class="article-title"]
內容的xpath是:
//div[@class="content"]
確定標題和內容的xpath定位之後,我們在python代碼中實現一下。
註:但是先解決一個問題,詳情頁屬於第二次調用了,所以我們也需要進行調用第二次,再編寫代碼
代碼
# 詳情頁
def detail(self, response):title = response.xpath('//h1[@class="article-title"]/text()').extract()content = response.xpath('//div[@class="content"]//text()').extract()print("標題:" )print(title)print("內容")print(content)
def parse(self, response):a_href_list = response.xpath('//div[contains(@class,"article") and contains(@class,"block")]//a[@class="contentHerf"]/@href').extract()print(a_href_list)base_url = "https://www.qiushibaike.com"for a_href in a_href_list:url = f"{base_url}{a_href}"yield scrapy.Request(url=url, callback=self.detail)
結果
但是會發現啊,似乎每個都是列表形式,這似乎不太行吶,我們稍微修改一下代碼,這樣我們拿到的就是正常的文本了,如下圖所示:
上述命令總結
創建爬蟲項目
scrapy startproject <項目名稱>
創建蜘蛛
scrapy genspider <蜘蛛名稱> <網頁的起始url>
啟動爬蟲,
--nolog
參數不加表示一系列日誌,一般用於調試,加此參數表示只輸入
內容
scrapy crawl <爬蟲名> [--nolog]
結尾
經過入門級的操作,我相信你大概知道scrapy是怎麼玩了。但是你依然可能懵逼,不懂本質,不過先走起來,才是根本,後續慢慢聽我繼續。
下篇正在趕飛機,如果你覺得寫的還不錯,記得點讚留言哈,感謝你的觀看,麼麼噠。
用微笑告訴別人,今天的我比昨天強,今後也一樣。
如果你覺得文章還可以,記得點讚留言支持我們哈。感謝你的閱讀,有問題請記得在下方留言噢~
#Python爬蟲#
最後多說一句,小編是一名python開發工程師,這裡有我自己整理的整套python學習資料和路線,想要這些資料的都可以關注小編,並私信「01」領取。