2020年3月4日 星期三

以 scrapy 爬蟲抓 ptt 文章,兼論 Anaconda 下 venv 的使用

從頭刻一個當然可以,但有人已經寫好了,在 https://github.com/afunTW/ptt-web-crawler/tree/master/ptt_web_crawler

ptt-web-crawler 是一個沒有使用 scrapy 的專案,協作者 afunTW 將它 fork 了以後以 scrapy 進行改寫。我猜抓下來還是不能直接用,因此 fork 了以後才 clone。為了不影響原環境,並順便解答一些疑問,我在 anaconda 下先安裝了 scrapy ,然後在 clone 下來的目錄中,執行 python -m venv venv。然後新開一個 cmd 並進入 venv 環境,在同一目錄中執行 pip install -r requirements.txt。然後執行 scrapy crawl ptt-web -a board=Gossiping -a pages=1,2 發生三個問題,依序記錄如下

scrapy 指令無法執行

我修改了 requirements.txt ,在最後加入 scrapy 一行,執行 pip install -r requirements.txt。然後執行 scrapy crawl ptt-web -a board=Gossiping -a pages=1,2 發生第二個問題

ModuleNotFoundError: No module named 'scrapy.conf'

出自此行 from scrapy.conf import settings

試著直接comment掉,結果沒問題。可能是我在上一步沒有指定 scrapy 的版本,結果直上 scrapy 2.0 的關係。diff 如下:

--- a/ptt_web_crawler/ptt_web_crawler/spiders/ptt_web_spider.py
+++ b/ptt_web_crawler/ptt_web_crawler/spiders/ptt_web_spider.py
@@ -8,7 +8,7 @@ from six import u

 import scrapy
 from ptt_web_crawler.items import PttWebCrawlerItem
-from scrapy.conf import settings
+# from scrapy.conf import settings
 from scrapy.exceptions import CloseSpider
 from scrapy.http import FormRequest
 from scrapy.spidermiddlewares.httperror import HttpError

執行 scrapy crawl ptt-web -a board=Gossiping -a pages=1,2 發生第三個問題

ImportError: DLL load failed: 找不到指定的模組。

  File "C:\Anaconda3\envs\python 3.7\lib\sqlite3\dbapi2.py", line 27, in
    from _sqlite3 import *

別的專案也遇到相同問題,迫使我回到 python 3.5 開發。看來直接由 cmd 進入新建的 venv 時無法取用 anaconda 已安裝的 sqlite3(以及 scrapy ,如果已經安裝了的話) ,因此必需在 anaconda 的 python 3.7 內進入 venv ,才能正常工作。至於若在新建的 venv 下重新安裝 scrapy ,也無法正常工作,仍然必需使用 anaconda 的套件才能正常工作。

Results

結果會存在 data\Gossiping\Gossiping_page_1_2.json

光兩頁就快 1M 了,改天再來寫一篇這個 json 檔的後處理


沒有留言:

張貼留言