Overview
XPath
在瀏覽器中使用 XPath
F12 -> Console:
> $x("<xpath>")
例子:
<div class="grade-box clearfix">
<dl>...略...</dl>
<dl>
<dd title="60852">
6萬+ </dd>
</dl>
<dl>...略...</dl>
</div>
- 取出元素的具體值(比如,取出“6萬+” )
> $x('//div[@class="grade-box clearfix"]//dl[2]//dd')[0]["innerHTML"]
" 6萬+ "
- 取出元素的具體文本(比如,取出“6萬+” 但是不帶空白符)
> $x('//div[@class="grade-box clearfix"]//dl[2]//dd')[0]["innerText"] "6萬+"
- 取出元素的 attribute
> $x('//div[@class="grade-box clearfix"]//dl[2]//dd/@title')[0]["textContent"] "60852" > $x('//div[@class="grade-box clearfix"]//dl[2]//dd/@title')[0]["value"] "60852"
總結:
- xpath 中間如果有多個匹配,使用
[1]
或[2]
或[3]
… 這樣的索引選擇(從 1 開始!)。 - 獲取 attribute,在元素基礎 xpath 上增加
/@
表示後面跟的是 attribute,寫全即//*//<xpath>/@<attribute>
。 $x()
執行獲得的有效結果總是 array。- 對
$x()
執行得到的 array 結果,如果 xpath 精確的化,一般即是我們想要的在[0]
位置,且只有這一個。 $x()[0]
中的結果相當於字典,通過$x()[0]["key"]
取值。
在 scrapy 的 response
中使用 xpath - n/a
n/a
常見問題
AttributeError: ‘str’ object has no attribute ‘iter’
在使用 rules
+ Rule(LinkExtractor(...), ...)
時遇到這個問題。
原因一:
LinkExtractor
中的 restrict_xpaths
期望的是指到“元素”的 xpath,也就說不能在其裏面有 ***/@<attr>
這樣的寫法。
如果想要取得的是 attribute,則定義(放到) LinkExtractor
內的 attrs
參數中去。
部署在 Scrapyd 上
$ pip install scrapyd
$ pip install scrapyd-client
$ pwd
<path>/<to>/<project>
$ vim ./scrapy.cfg
#### uncomment url
[deploy]
url = http://localhost:6800/
project = posts
問題
builtins.AttributeError: ‘int’ object has no attribute ‘splitlines’
參考:https://blog.csdn.net/qq_29719097/article/details/89431234
安裝 scrapyd(scrapyd-client)支持的版本
- Scrapy==1.6.0
- Twisted==18.9.0
$ pip uninstall twisted
$ pip uninstall scrapy
$ pip install twisted==18.9.0
$ pip install scrapy==1.6.0
scrapydweb – 增強 Scrapyd
n/a
單元測試 - TODO
n/a
分佈式 - TODO
N/A
更多功能
Scrapy 緩存
在開發環境爬蟲中斷了也是不好的感覺,要重啓 scrapy 但是原先爬過的內容沒有做處理的情況下就會再爬取一次。
通過緩存可以在重啓的時候繞過已爬過的頁面。
使用實例 – 待續
User-Agent
-
學習與操作:視頻課程 - 反爬蟲 - 設置隨機請求頭
-
GitHub 上做好的“插件”庫:random-useragent
代理
-
GitHub 上的代理“插件”庫: scrapy-proxies
- 寫 middleware 類(安裝了 scrapy 的“插件”庫可以不用寫,因爲庫裏面已經是 middleware 類了)。
- 修改 settings.py 啓用該 middleware 類即可。
Issue
-
運行時出現如下問題:
twisted.web.error.SchemeNotSupported: Unsupported scheme: b''
Solution:
可能原因是request.meta['proxy'] = proxy
這其中的proxy
value 沒有寫全。比如需要寫成:
proxy = "http://3.2.1.1:8080"
(可能漏了 “http://” 沒有寫上)。check here for detail.
Scrapy 的設置 – TODO
N/A