C語言中文網 目錄

Python Scrapy shell調試工具及用法(含爬蟲案例)

本節示例將會爬取 BOSS 直聘網上廣州地區的熱門職位進行分析。首先使用瀏覽器訪問 https://www.zhipin.com/c101280100/h_101280100/ 頁面,即可看到廣州地區的熱門職位。

這里我們要使用爬蟲來爬取該頁面中的信息,因此需要查看該頁面的源代碼。可以看到,該頁面中包含工作信息的源代碼如圖 1 所示。


圖 1 頁面中包含工作信息的源代碼(<div.../>元素)(點此查看高清大圖

下面將會使用 Scrapy 提供的 shell 調試工具來抓取該頁面中的信息。使用如下命令來開啟 shell 調試:

scrapy shell https://www.zhipin.com/c101280100/h_101280100/

運行上面命令,將會看到 Scrapy 并未抓取到頁面數據,頁面返回了 403 錯誤(如圖 2 所示),這表明目標網站開啟了“防爬蟲”,不允許使用 Scrapy“爬取”數據。為了解決這個問題,我們需要讓 Scrapy 偽裝成瀏覽器。


圖 2 使用 shell 調試工具抓取頁面信息時出現 403 錯誤

為了讓 Scrapy 偽裝成瀏覽器,需要在發送請求時設置 User-Agent 頭,將 User-Agent 的值設置為真實瀏覽器發送請求的 User-Agent。

查看瀏覽器的 User-Agent,可按如下步驟進行操作(以 Firefox 為例):
  • 啟動Firefox 瀏覽器,然后按下“Ctrl+Shift+I”快捷鍵打開瀏覽器的調試控制臺,選擇“網絡”Tab頁。
  • 通過該瀏覽器可以正常瀏覽任意頁面。
  • 在瀏覽器下方的調試控制臺中,將會顯示瀏覽器向哪些資源發送了請求。
  • 在調試控制臺中選擇瀏覽器所請求的任意一個資源,即可在右邊看到瀏覽器發送請求的各種請求頭,如圖 3 所示。


圖 3 查看Firefox 發送請求的請求頭

因此,可以使用如下命令讓 Scrapy 偽裝成 Firefox 來開啟 shell 調試。

scrapy shell -s USER_AGENT='Mozilla/5.0' https://www.zhipin.com/c101280100/h_101280100

執行上面命令,將可以看到使用 shell 調試工具成功抓取頁面的提示信息,如圖 4 所示。


圖 4 使用 shell 調試工具成功抓取頁面的提示信息

接下來就可以使用 XPath 或 css 選擇器來提取我們感興趣的信息了。

為了讓讀者能看懂后面的代碼,這里簡單補充一點 XPath 的必要知識。表 5 中列出了 XPath 最實用的簡化寫法。

表 5 XPath 最實用的簡化寫法
表達式 作用
nodename 匹配此節點的所有內容
/ 匹配根節點
// 匹配任意位置的節點
. 匹配當前節點
.. 匹配父節點
@ 匹配屬性

典型的,比如可以使用 //div 來匹配頁面中任意位置處的 <div.../> 元素,也可以使用 //div/span 來匹配頁面中任意位置處的 <div....> 元素內的 <span.../> 子元素。

XPath 還支持“謂詞”,就是在節點后增加一個方括號,在方括號內放一個限制表達式對該節點進行限制。

典型的,我們可以使用 //div[@class]來匹配頁面中任意位置處、有 class 屬性的 <div.../> 元素,也可以使用 //div/span[1] 來匹配頁面中任意位置處的 <div.../> 元素內的第一個 <span.../> 子元素;使用 //div/span[last()] 來匹配頁面中任意位置處的 <div.../> 元素內的最后一個 <span.../> 子元素;使用 //div/span[last()-1] 來匹配頁面中任意位置處的 <div.../> 元素內的倒數第二個 <span.../> 子元素……

例如,想獲取上面頁面中的第一條工作信息的工作名稱,從圖 1 中可以看到,所有工作信息都位于 <div class="job-primary"> 元素內,因此該 XPath 的開始應該寫成:

//div[@class="job-primary"]

接下來可以看到工作信息還處于 <div class="info-primary"> 元素內,因此該 XPath 應該寫成(此處不加謂詞也可以):

//div[@class="job-primary"]/div

接下來可以看到工作信息還處于 <h3 class="name"> 元素內,因此該 XPath 應該寫成(此處不加謂詞也可以):

//div [@class = "job-primary"]/div/h3

依此類推,可以看到工作名稱對應的 XPath 寫成:

//div[@class = "job-primary"]/div/h3/a/div/text()

在掌握了 XPath 的寫法之后,即可在 Scrapy 的 shell 控制臺調用 response 的 xpath() 方法來獲取 XPath 匹配的節點。執行如下命令:

response.xpath ('//div[@class="job-primary"]/div/h3/a/div/text()').extract()

上面的 extract() 方法用于提取節點的內容。運行上面命令,可以看到如圖 6 所示的輸出信息。


圖 6 使用 css 選擇器抓取感興趣的信息

相比之下,XPath 比 css 選擇器的匹配能力更強,因此本章的項目會使用 XPath 來匹配、抓取感興趣的信息。

精美而實用的網站,提供C語言C++STLLinuxShellJavaGo語言等教程,以及socketGCCviSwing設計模式JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo