python3.5 + Scrapy踩過的那些坑

驗(yàn)證碼登錄:

scrapy 通過 xpath 模塊可以輕松解析出所需的標(biāo)簽,這個暫且不提。項(xiàng)目中遇到一個問題,在解析圖形驗(yàn)證碼的過程中發(fā)現(xiàn)其url只一個固定值,我們通過Request直接獲取到圖片地址, 然后我試圖使用urllib.urlretrieve 來下載圖片然后登錄,然后發(fā)現(xiàn)每一次驗(yàn)證碼都不正確。經(jīng)過分析發(fā)現(xiàn),每一次download的圖片都會變化,所以得出結(jié)論:服務(wù)器是通過cookie判斷身份的唯一性,因此請求頁面的request需和download圖片的request保持一致性,至少cookie需一致。因?yàn)槲遗渲孟嗤膆eaders直接使用get請求下載圖片,結(jié)果正確。

此外,需注意cookie的時效性,做了一個過期自動登錄的策略。

使用腳本運(yùn)行scrapy腳本

scrapy官方推薦使用scrapy crawl spiderName 來運(yùn)行腳本,我們需要需要根據(jù)需求做一個通過api調(diào)用執(zhí)行的腳本。

1、首先嘗試使用CrawlerProcess

搭建一個簡易的flask框架

```py

? ? ? ? app = flask(__name__)

? ? ? ? @route('/login')

? ? ? ? ? ? def login():

? ? ? ? ? ? process.run()`</blockquote>`

```

報錯:processor必須在主線程運(yùn)行

2、之后改用CrawlerRunner,成功!

然而,當(dāng)?shù)诙握{(diào)用login時報錯:Scrapy - Reactor not Restartable

reactor是單例,一旦創(chuàng)建無法重啟,所以無法可持續(xù)。

3、第二種方法或許有解決方案,并沒有深究。于是想到最簡單的一種方案,直接使用os.system(cmd),豈不美哉?想一想還有點(diǎn)小興奮呢! So, CrawlerScript.py為scrapy啟動器。

?另寫一個run.py


```python

@app.route('/login_chezhibao/username=&password=',methods=['GET','POST'])

? ? ? ? def login(username, password):

? ? ? ? ? ? cmd ='python CrawlerScript.py'

? ? ? ? ? ? print(os.system(cmd))

? ? ? ? ? ? return 'success'

```


運(yùn)行,還是報錯...? 這次是 no module name scrapy

無法識別scrapy!明明已經(jīng)裝了, Why??

于是在Terminal手動敲 python CrawlerScript.py 同樣的錯!

最后恍然大悟, 我用的scrapy是基于python3安裝的,于是改成python3 CrawlerScript.py

成功!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容