使用scrapy框架進行抓取伯樂線上所有文章(一)
這是跟著相關視訊學習進行的程式碼,(一)學習思路的程式碼在整個完整程式碼中存在一部分,如果看到這些內容或思路有不懂的給我下面部落格留言。完整程式碼github地址:https://github.com/spider-liu/jobbole-,主要是作為學習交流之用。
一、scrapy框架簡介
scrapy框架是爬取網站、抓取網站、提取結構資料框架
上圖為scrapy的結構圖
scrapy engine為引擎,主要是作為指揮、傳遞各部分的通訊,進行協調之作用。
scheduler排程器,接受引擎的請求request,將請求request進行佇列排序,當引擎需要的請求的 時候,排程器再給引擎。
downloader下載器,負責提取網頁並將結果反饋到引擎,然後將其傳送給spider。
itempipeline管道,負責spider提取到item,並進行後期的處理(如將專案存在資料庫)。
spiders:主要是使用者自定義的類,用於解析響應並從中item專案或者其他請求。
當排程器中的request全部進行完畢,則程式停止,中間下載的url出現問題則放置最後重新進行一次。
二、製作爬蟲的4個步驟
新建專案:scrapy startproject xxx
明確目標(item.py):明確想要爬取的目標
製作爬蟲(spider.py):製作爬蟲開始爬取網頁
儲存內容(pipeline.py):設計管道儲存爬取內容
三:進入伯樂網站分析
進入伯樂線上網站找到文章,所有文章可以發現伯樂線上的文章全部在此,每個頁一共20個文章,下面一共有多少頁
進行此網站的好處就是文章有集合在一起,可以從同一路徑下進入分析,避免了使用廣度搜索和深度搜索的演算法使用。
進入一篇文章中,分析文章的結構
文章標題和資訊(上行標藍的為標題,下行標藍的為資訊包括日期、文章型別等)
文章主題內容
文章底部評論數等
這三個部分就是要提取的內容,可以通過瀏覽器的f12進行觀察頁面構成,進行欄位的提取。
四、專案進行前的預備工作
1、在cmd某目錄下檔案下面使用scrapy startproject ArticleSpider專案(工程),建立成功會顯示你能開始使用你的第一個爬蟲了
2、可以在檔案下里面顯示出建立的ArticeSpider檔案,裡面包括spider資料夾等
3、在spider下面建立一個名為jobbole的例項類,在cmd中進入到工程的spider檔案下,使用scrapy genspider jobbole http://blog.jobbole.com/,這樣就形成了一個jobbole例項類,這是一個命令scrapy genspider py檔名 二級域名。可以去檔案下看下也可以通過pycharm的IDE看下。會出現一個jobbole的模板,模板可以自己進行定製,目前使用scrapy自帶的基礎模板。
4、在ArticleSpider一級檔案下編寫main檔案,此檔案主要用於調式和執行專案
5、在setting檔案中修改爬蟲協議,將圖中的藍字改成false。因為爬蟲會遵循一個爬蟲協議,有些網站不允許爬蟲,scrapy進行會檢查爬蟲協議,如果不允許則不進行,將其修改false就是忽略掉爬蟲協議。
五、欄位解析涉及標題、文章資訊、主題內容等進行提取
使用xpath或者css選擇器定位某個元素,進行提取。
這樣就實現了欄位的提取,但是我們可以通過scrapy shell 文章url(http://blog.jobbole.com/114417/),最終生成》》》這樣一個形式
,因為我安裝了ipython的緣故會有另外一個形式,但是測試一樣。建議安裝ipython(cmd中pip install ipyhon)就好。
六:具體欄位提取
在第五中只是簡單說明欄位的說明,在jobble檔案建立一個提取文章欄位的函式
在此函式中進行具體欄位的解析,因為後面有更好的程式碼item loader寫成此程式碼格式,所以此圖中進行了整體程式碼的註釋,我這邊主要是提取標題、文章時間、評論數、點贊數等,裡面的css如何寫成根據css語法進行或者使用xpath也可以成形(在審查元素中可以copy xpah,這種方式比較簡單程式碼量大些)。
七、既然所有的資訊已經制定好提取,所以將列表中的url進行獲取後並且解析每個文章相關資訊進行下載,同時獲取下一頁的url迴圈解析下載,第一個圖可以獲取到全部的url。
八、圖片提取
伯樂線上早期文章的圖片與文章中的一個圖片是相同的,有一個專門的url可以將其進行轉至到位置,現在很多網站將其圖片放置第三方的伺服器中。但是現在不影響,只需要關注文章列表頁面所存在的圖片即可。
通過審查元素可以找到圖片一般存在於img src中元素裡面,我們通過提取這些相關元素就能將圖片找到。
九、提取每頁的圖片加上下一頁的圖片所以將parse函式進行修改,這樣就能使用scrapy將其進行抓取了。