Python干貨:用Scrapy爬電商網(wǎng)站
電商老板,經(jīng)理都可能需要爬自己經(jīng)營(yíng)的網(wǎng)站,目的是監(jiān)控網(wǎng)頁(yè),追蹤網(wǎng)站流量,尋找優(yōu)化機(jī)會(huì)等。
對(duì)于其中的每一項(xiàng),均可以通過離散工具,網(wǎng)絡(luò)抓取工具和服務(wù)來(lái)幫助監(jiān)控網(wǎng)站。只需相對(duì)較少的開發(fā)工作,就可以創(chuàng)建自己的站點(diǎn)爬網(wǎng)程序和站點(diǎn)監(jiān)視系統(tǒng)。
構(gòu)建自定義的爬蟲站點(diǎn)和監(jiān)控程序, 第一步是簡(jiǎn)單地獲取網(wǎng)站上所有頁(yè)面的列表。本文將介紹如何使用Python編程語(yǔ)言和一個(gè)名為scrapy的整潔的Web爬網(wǎng)框架來(lái)輕松生成這些頁(yè)面的列表。
你需要一個(gè)服務(wù)器,Python和scrapy
這是一個(gè)開發(fā)項(xiàng)目。需要安裝Python和Scrapy的服務(wù)器。還需要通過終端應(yīng)用程序或SSH客戶端對(duì)該服務(wù)器的命令行進(jìn)行訪問。還可以從Python.org的文檔部分獲取有關(guān)安裝Python的信息。Scrapy網(wǎng)站還有很好的安裝文檔。請(qǐng)確認(rèn)您的服務(wù)器已準(zhǔn)備好安裝Python和Scrapy。
創(chuàng)建一個(gè)Scrapy項(xiàng)目
使用像Putty for Windows這樣的SSH客戶端或Mac,Linux計(jì)算機(jī)上的終端應(yīng)用程序,導(dǎo)航到要保留Scrapy項(xiàng)目的目錄。使用內(nèi)置的Scrapy命令startproject,我們可以快速生成所需的基本文件。
本文將抓取一個(gè)名為Business Idea Daily的網(wǎng)站,因此將該項(xiàng)目命名為“bid”。
生成一個(gè)新的Scrapy Web Spider
為方便起見,Scrapy還有另一個(gè)命令行工具,可以自動(dòng)生成新的Web Spider。
scrapy?genspider?-t?crawl?getbid?businessideadaily.com
第一個(gè)術(shù)語(yǔ),scrapy,參考Scrapy框架。接下來(lái),有g(shù)enspider命令告訴Scrapy我們想要一個(gè)新的web spider,或者,如果您愿意,還想要一個(gè)新的網(wǎng)絡(luò)爬蟲。
-t告訴Scrapy我們想要選擇一個(gè)特定的模板。genspider命令可以生成四個(gè)通用Web Spider模板中的任何一個(gè):basic,crawl,csvfeed和xmlfeed。直接在-t之后,我們指定了想要的模板。在這個(gè)例子中,我們將創(chuàng)建被Scrapy稱為CrawlSpider的模板。 “getbid”這個(gè)詞就是spider的名字。
該命令的最后一部分告訴Scrapy我們想要抓取哪個(gè)網(wǎng)站。框架將使用它來(lái)填充一些新spider的參數(shù)。
定義Items
在Scrapy中,Items是組織我們spider爬行特定網(wǎng)站時(shí)收集東西的方式/模型。雖然我們可以很容易地完成我們的目標(biāo)- 獲取特定網(wǎng)站上所有頁(yè)面的列表- 不使用Items,但如果我們想稍后擴(kuò)展我們的爬蟲,則不使用Items可能會(huì)限制我們。
要定義一個(gè)Item,只需打開我們生成項(xiàng)目時(shí)創(chuàng)建的Scrapy的items.py文件。在其中,將有一個(gè)名為BidItem的類。類名基于我們?yōu)轫?xiàng)目提供的名稱。
class?BidItem(scrapy.Item): ?#?define?the?fields?for?your?item?here?like: ?#?name?=?scrapy.Field() ?pass
將pass替換為名為url的新字段的定義。
url?=?scrapy.Field()
保存做好的文檔
構(gòu)建Web Spider
接下來(lái)打開項(xiàng)目中的蜘蛛目錄,查找生成的新Spider Scrapy。 在這個(gè)例子中,這個(gè)蜘蛛叫做getbid,所以文件是getbid.py。
在編輯器中打開此文件時(shí),您應(yīng)該看到如下所示的內(nèi)容。
#?-*-?coding:?utf-8?-*- import?scrapy from?scrapy.linkextractors?import?LinkExtractor from?scrapy.spiders?import?CrawlSpider,?Rule from?bid.items?import?BidItem class?GetbidSpider(CrawlSpider): ?name?=?'getbid' ?allowed_domains?=?['businessideadaily.com'] ?start_urls?=?['http://www.businessideadaily.com/'] rules?=?( ?Rule(LinkExtractor(allow=r'Items/'),?callback='parse_item',?follow=True), ?) def?parse_item(self,?response): ?i?=?BidItem() ?#i['domain_id']?=?response.xpath('//input[@id="sid"]/@value').extract() ?#i['name']?=?response.xpath('//div[@id="name"]').extract() ?#i['description']?=?response.xpath('//div[@id="description"]').extract() ?return?i
我們需要對(duì)為我們生成的代碼Scrapy進(jìn)行一些小的更改。 首先,我們需要在規(guī)則下修改LinkExtractor的參數(shù)。刪除括號(hào)中的所有內(nèi)容。
Rule(LinkExtractor(), callback='parse_item', follow=True),
通過此更新,我們的spider將在起始頁(yè)面(主頁(yè))上找到每個(gè)鏈接,將單個(gè)鏈接傳遞給parse_item方法,并按照指向網(wǎng)站下一頁(yè)的鏈接來(lái)確保我們獲取每個(gè)鏈接頁(yè)面。
接下來(lái),我們需要更新parse_item方法。 刪除所有注釋行。這些線條只是Scrapy為我們提供的例子。
def?parse_item(self,?response): ?i?=?BidItem() ?return?i
我喜歡使用有意義的變量名。 所以我要將i更改為href,這是HTML鏈接中屬性的名稱,如果有的話,它將保存目標(biāo)鏈接的地址。
def parse_item(self, response):
href = BidItem()
return href
現(xiàn)在奇跡發(fā)生了,我們捕獲頁(yè)面URL為Items。
def?parse_item(self,?response): ?href?=?BidItem() ?href['url']?=?response.url ?return?href
這就對(duì)了。 新Spider已經(jīng)準(zhǔn)備好爬行了。
抓取網(wǎng)站,獲取數(shù)據(jù)
從命令行,我們想要導(dǎo)航到我們的項(xiàng)目目錄。 進(jìn)入該目錄后,我們將運(yùn)行一個(gè)簡(jiǎn)單的命令來(lái)發(fā)送我們的新蜘蛛并獲取一個(gè)頁(yè)面列表。
scrapy crawl getbid -o 012916.csv
該命令有幾個(gè)部分。 首先,我們參考Scrapy框架。 我們告訴Scrapy我們想爬行。 我們指定要使用getbid蜘蛛。
-o告訴Scrapy輸出結(jié)果。 該命令的012916.csv部分告訴Scrapy將結(jié)果放在帶有該名稱的逗號(hào)分隔值(.csv)文件中。
在示例中,Scrapy將返回三個(gè)頁(yè)面地址。 我為這個(gè)例子選擇這個(gè)網(wǎng)站的原因之一是它只有幾頁(yè)。 如果你在一個(gè)有數(shù)千頁(yè)的網(wǎng)站上瞄準(zhǔn)一個(gè)類似的蜘蛛,它將需要一些時(shí)間來(lái)運(yùn)行,但它會(huì)返回一個(gè)類似的響應(yīng)。
url
https://businessideadaily.com/auth/login
https://businessideadaily.com/
https://businessideadaily.com/password/email
只需幾行代碼,您就可以為自己的站點(diǎn)監(jiān)控應(yīng)用程序奠定基礎(chǔ)。
本文由數(shù)據(jù)星河原創(chuàng)
Jupyter notebook python
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。