驗(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
成功!