【爬蟲】(Scrapy)初學 Scrapy 過程中的知識和問題整理



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"
    

總結:

  1. xpath 中間如果有多個匹配,使用 [1][2][3] … 這樣的索引選擇(從 1 開始!)。
  2. 獲取 attribute,在元素基礎 xpath 上增加 /@ 表示後面跟的是 attribute,寫全即 //*//<xpath>/@<attribute>
  3. $x() 執行獲得的有效結果總是 array。
  4. $x() 執行得到的 array 結果,如果 xpath 精確的化,一般即是我們想要的在 [0] 位置,且只有這一個。
  5. $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 緩存

n/a

在開發環境爬蟲中斷了也是不好的感覺,要重啓 scrapy 但是原先爬過的內容沒有做處理的情況下就會再爬取一次。
通過緩存可以在重啓的時候繞過已爬過的頁面。

使用實例 – 待續


User-Agent


代理

  1. 寫 middleware 類(安裝了 scrapy 的“插件”庫可以不用寫,因爲庫裏面已經是 middleware 類了)。
  2. 修改 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



Reference



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章