在scrapy中parse函数里面xpath的内容打印不出来_如何正确的使用Scrapy ?
購買課程請掃碼:
Scrapy是一個為了爬取網站數據,提取結構性數據而編寫的應用框架。只需要編寫很少的代碼就能實現抓取功能,另外由于它底層用了twisted,性能也非常優越。使用Scrapy框架編寫的抓取代碼,可讀性很強,非常利于維護,是現在最流行的抓取框架。
安裝
pip install scrapy SQLAlchemySQLAlchemy之后我們會用到
一個簡單爬蟲
我們寫一個簡單地例子,抓取開發者頭條最近5天feed頁面的文章地址和標題。先抓包分析下怎么抓比較好。
(略過抓包過程, 課程視頻中有..)
接著我們就可以寫爬蟲代碼了:
from好的習慣是先定義Item,這里每項包含標題和鏈接。start_urls就是要抓取的里面列表。重載了parse方法,里面做頁面解析:我還是用xpath的方法。另外在parse里面我沒有延伸,就是沒有翻頁或者解析出新的鏈接再抓取,一共就抓了這5個頁面
接下來就是抓取,使用 runspider 就能運行了,不過頭條要求使用一個正確的UA。所以在命令行用-s指定了USER_AGENT變量。另外-o表示把結果導出到toutiao.json文件中
USER_AGENT在運行中通過DEBUG信息其實大家就可以看到抓到了什么,當然json文件里面就是最終結果。假如你的程序寫的有問題,在運行過程中會拋錯,看著堆棧改bug就好了。
上面就是Scrapy的一個基本用法了。可以感受到,我們寫的代碼非常少,就實現了一個異步的抓取和處理。說的再明確一點,你不需要等待一個任務完成,他們是一起抓取的,充分利用CPU時間,另外即使一些請求失敗了,或者處理過程中出錯了,其他請求還可以繼續完成。
而且我這里使用ITEM定義結構,讓這個項目更清晰好理解
爬蟲工程
上面我們演示的是一個簡單地小例子。事實上Scrapy更傾向于Django那樣的的企業級用法。可以在命令行下非常容易的創建一個復雜的爬蟲項目
我們看一下項目下的目錄結構
# 創建一個叫做toutiao_project的項目 ? tree toutiao_project toutiao_project ├── scrapy.cfg └── toutiao_project├── __init__.py├── items.py├── middlewares.py├── pipelines.py├── settings.py└── spiders├── __init__.pyscrapy.cfg是Scrapy的配置文件。item.py存放了一些抓取對象的schema,或者說Item是保存爬取到的數據的容器。 middlewares.py是Spider中間件,使用中間件可以在抓取過程中的對應事件鉤子上加上額外的行為, 比如添加代理,自動登錄等等。pipelines.py是項目管道,當Item在Spider中被收集之后,它將會被傳遞到Item Pipeline,會按照一定的順序執行對Item的處理。常見的如去重,驗證item值,將爬取結果保存到數據庫中等等。上面說的scrapy.cfg是針對Scrapy框架的配置,settings.py是針對于項目本身的設置,比如用什么中間件、并發數量、UA、Pipelines等等。全部選項可以看官方文檔,如果你要深入了解和使用這個框架,這些設置項都是應該了解的。spiders目錄下就是具體的抓取代碼
定義Item
接著我們把開發者頭條的抓取的邏輯遷移到這種項目用法中。定義Item這個結構之前我們已經做過,我覺得無論你使用Scrapy的哪種方式:是一個小腳本去抓,還是一個很復雜的大項目去爬,都建議要有一個良好的schema結構,現在我們只是需要把ToutiaoItem放到items.py文件中
?這種Item很像ORM的用法,對吧。每個字段是一個Field。每種獲取的數據都可以寫成一個這樣的Item類,它要繼承scrapy.Item。
添加抓取邏輯
可以在spiders子目錄下創建一個文件,從items.py里面import ToutiaoItem。這里要注意,我寫全了import模塊路徑。
?代碼文件的名字沒有要求,關鍵是類中name的名字。
通過 Item Pipeline 把數據存到數據庫
在之前的小例子中,我們只是把數據存在json文件中。這次我們把數據存到數據庫,反正本地測試我就存進SQLite,而且由于用到SQLAlchemy,上線時直接改成MySQL或者PostgreSQL的DB_URL就好了。
順便提一下去重,去重是一個基本的抓取優化,但是對于我們這個需求,feed里面肯定不會有重復的內容,所以就不考慮了
首先我們用SQLAlchemy寫一個頭條的模型
?除了toutiao這個模型還寫了2個功能函數,一個是連接數據庫的,一個是創建表的。DB_URL在配置文件中:
here接著我們看pipelines.py:
?里面使用session的形式,需要在process_item方法內加上添加記錄的邏輯。在__init__里面獲得了engine,然后通過engine創建數據庫。當然這個創建數據庫的步驟可以只做一次,雖然重復執行也不會有什么影響.
接著需要在settings里面指定這個pipeline:
ITEM_PIPELINES后面那個300表示執行的順序, 值越小越靠前,下面說的中間件也是:同類中間件中,這個順序值越小越先執行
項目配置
當然到這里還是不能抓取,是因為開發者頭條要求我們使用一個正確的UA。所以要修改settings.py. 改一下USER_AGENT。這個ua是我個人電腦的UA。
USER_AGENT設置中間件
接著我們看看中間件怎么用,在Scrapy中有 2 種中間件,
一個是下載器中間件,在request/response之間。另外一個是Spider中間件,發生在spider處理過程中。我們先看一個下載器中間件的例子。之前我們在配置文件中指定了USER_AGENT, 但是ua只有一個。這里實現隨機換一個正確UA的例子。
# pip install fake_useragent其中用到的fake-useragent這個庫會下載一個數據文件,可能需要想辦法去國外下載下。每次調用會隨機拿一個ua,避免了重復用一個。當然大家還可以擴展思路,有代理池的話,每次代理也隨機換。
看settings.py里面對應中間件的配置:
DOWNLOADER_MIDDLEWARES這里注意,其實scrapy里面其實已經實現了一個UserAgent的中間件,這樣在settings里面指定USER_AGENT就能讓抓取使用對應的ua了。不過既然我們實現了隨機ua中間件,自帶的那個就可以讓他的執行順序為None,讓它不起作用了
Spider Middleware這種我們日常開發基本用不到,不過呢,為了演示我們這里就實現一個用logging模塊記錄日志的中間件,要不然scarpy默認的抓取過程debug日志很多,抓不到重點,使用這個日志中間件,可以很有針對性的了解抓取情況
import這樣就可以把抓取的內容寫入日志,同時由于我們定制了logging模塊的日志格式,日志中會記錄時間。基于時間和結果可以有助于未來排查問題。接著我們要改一下settings.py設置
FILE_LOGGING_ENABLEDPS:如果不指定FILE_LOGGING_ENABLED這個中間件是不生效的。
中間件自帶的其他方法其實在 startproject 時候創建的 middlewares.py 里面都有了,不了解的可以具體看看API,注意按需使用。
運行抓取
最后呢,我們就可以執行抓取了,在命令行運行:
? scrapy crawl toutiao運行正常。接著來確認下程序正確性。首先看看SQLite中的數據:
".help"這樣就完成抓取和存入數據庫啦。
接著看一下日志scrapy.log,里面已經可以看到對應的記錄:
{通過LoggingSpiderMiddleware,抓取結果都被寫進了日志。
好啦,這個爬蟲項目就完成了,我們相對完整的體驗了Scrapy的用法。
什么情況下應該用Scrapy這類框架?
大部分優秀項目能出現的原因,都是作者或者團隊在對過去已有的工作模式和輪子深入之后發現問題之后提出更先進的思想,并實現出來。框架非常好,比如作為web開發者,我不能不用flask django這類web框架,而爬蟲框架嘛,利用成熟的框架基本能避免常見的坑。可以寫非常少的代碼就能實現抓取,其中的一些細節都被框架封裝了,開發者不再需要關注,專心實現業務邏輯就好了。
不過我是不推薦用框架的,我不做運維的一個重要原因是不想做一個天天翻閱軟件文檔的運維,運維嘛,日常一個工作是搭建環境,用人家寫好的東西,按文檔運行起來,最多google一些最佳實踐或者解決一些報錯。但是我們是不知道它怎么實現的、運行原理是什么的。你用這種框架也是,比如flask, 就是按照人家規定你的玩法填東西就好了,填多了不過是個熟練工而已。
我在12-13年底寫了很多的爬蟲,每個通常都會嘗試一些新的技術,后來我突然意識到,當你掌握了爬蟲技能,爬一個還是爬一百個區別已經不大,量已經沒有意義,關鍵是質了。
所以,我的建議是:
再強調一次基礎。千萬別把自己在某些領域的能力限制在某個框架上,會影響你未來的發展。
延伸閱讀
Scrapy是一個功能很齊全的抓取框架,支持的特性、配置項等非常多,需要花很多時間學習和熟悉。這里有幾個延伸閱讀的鏈接。第一個是Scrapy創始人自己搞的scrapinghub服務中的視頻學習教程。應該是市面上最好的教程之一了,大家可以看看。
歡迎關注「愛湃森Python」服務號(微信號ipaisen)獲取更多內容喲
總結
以上是生活随笔為你收集整理的在scrapy中parse函数里面xpath的内容打印不出来_如何正确的使用Scrapy ?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python开发上位机软件-UR机器人通
- 下一篇: graphpad prism画折线图_如