摘要:幾個(gè)朋友對(duì)爬蟲(chóng)很感興趣,他們也都是開(kāi)發(fā)人員,一個(gè)開(kāi)發(fā)兩個(gè)開(kāi)發(fā),都沒(méi)有過(guò)項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn),正好其中一個(gè)最近要爬一個(gè)網(wǎng)店的產(chǎn)品信息,所以希望我能拿這網(wǎng)站當(dāng)寫(xiě)一個(gè)爬蟲(chóng)來(lái)給他們參考學(xué)習(xí)。我們就在這個(gè)文件里開(kāi)發(fā)爬蟲(chóng)的相關(guān)邏輯。
幾個(gè)朋友對(duì)爬蟲(chóng)很感興趣,他們也都是開(kāi)發(fā)人員,一個(gè)PHP開(kāi)發(fā)兩個(gè)JAVA開(kāi)發(fā),都沒(méi)有過(guò)python項(xiàng)目開(kāi)發(fā)經(jīng)驗(yàn),正好其中一個(gè)最近要爬一個(gè)網(wǎng)店的產(chǎn)品信息,所以希望我能拿這網(wǎng)站當(dāng)demo寫(xiě)一個(gè)爬蟲(chóng)來(lái)給他們參考學(xué)習(xí)。要爬取的頁(yè)是http://list.secoo.com/watches...,只要爬取產(chǎn)品相關(guān)了屬性就可以。
這就是要爬取的相關(guān)信息
爬蟲(chóng)框架使用的是python的scrapy,這也是我現(xiàn)在項(xiàng)目中使用的爬蟲(chóng)框架。朋友們由于沒(méi)有使用過(guò)scrapy,因此推薦他們?nèi)タ匆幌驴蚣芪臋n,http://scrapy-chs.readthedocs...,這是scrapy的入門(mén)教程,基本上看完前面幾章就能快速開(kāi)發(fā)一個(gè)簡(jiǎn)單的爬蟲(chóng)了。
一、生成代碼
scrapy提供了命令行工具來(lái)快速生成一個(gè)簡(jiǎn)單的爬蟲(chóng),我們也使用這個(gè)工具來(lái)快速生成代碼。在終端下面運(yùn)行下面的命令就能快速生成一個(gè)scrapy爬蟲(chóng)的基礎(chǔ)框架,免去一些最原始的代碼開(kāi)發(fā)操作。
scrapy startproject secoo
生成的項(xiàng)目文件就是上面的樣子,spiders目錄是存放爬蟲(chóng)代碼,items.py是定義爬蟲(chóng)要爬取的字段信息,pipelines.py是用來(lái)處理爬蟲(chóng)爬到的數(shù)據(jù)的,比如用來(lái)做保存操作,像是存redis或是mysql等等,settings.py是項(xiàng)目的基礎(chǔ)配置文件,定義一些爬蟲(chóng)的全局參數(shù)。
生成完項(xiàng)目基礎(chǔ)代碼后還可以使用下面的命令行工具來(lái)生成爬蟲(chóng)代碼最簡(jiǎn)單的代碼,和創(chuàng)建項(xiàng)目一樣,可以省去創(chuàng)建文件的麻煩。
scrapy genspider watch secoo.com
命令執(zhí)行完成后我們就會(huì)在spiders目錄下發(fā)現(xiàn)我們生成好的爬蟲(chóng)文件watch.py了。我們就在這個(gè)文件里開(kāi)發(fā)爬蟲(chóng)的相關(guān)邏輯。
二、 定義爬蟲(chóng)數(shù)據(jù)字段
爬蟲(chóng)要爬頁(yè)面,肯定是要從爬取到的頁(yè)面中提取到我們想要的字段信息,這樣的話(huà)我們就要先來(lái)定義一下哪些是我們要的字段,后面好在本地保存,這個(gè)就是scrapy里的items來(lái)負(fù)責(zé)的。
我們打開(kāi)根目錄下面的items.py文件,這個(gè)文件里定義一個(gè)SecooItem的類(lèi),我們定義了4個(gè)字段,分別用來(lái)保存產(chǎn)品名、路徑、價(jià)格和庫(kù)存信息,這一步操作我們就完成了,后面的爬蟲(chóng)按這個(gè)定義好的格式來(lái)保存數(shù)據(jù)就可以了。
import scrapy class SecooItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() product_name = scrapy.Field() #產(chǎn)品名 breadcrumb = scrapy.Field() #面包屑路徑 product_price = scrapy.Field() #產(chǎn)品價(jià)格 product_stock = scrapy.Field() #庫(kù)存狀態(tài)
三、定義保存數(shù)據(jù)操作
這一步是要來(lái)定義爬蟲(chóng)的數(shù)據(jù)提取出來(lái)以后,按照items.py定義的格式格式化以后是如何保存的。由于我們是寫(xiě)一個(gè)demo給大家來(lái)參考,因此這一部分代碼是沒(méi)有寫(xiě)實(shí)際的數(shù)據(jù)保存操作的,我們只定義了這個(gè)操作類(lèi),如果是想要進(jìn)行保存數(shù)據(jù)操作的話(huà)可以直接修改SecooPipeline類(lèi)的process_item方法,在這里可以和正常腳本操作數(shù)據(jù)庫(kù)一樣進(jìn)行連接、寫(xiě)入操作的。
class SecooPipeline(object): def process_item(self, item, spider): return item
四、頁(yè)面爬取
最后一步就是最重要的一步了,我們要進(jìn)行爬蟲(chóng)邏輯的開(kāi)發(fā)。在這里先貼上代碼,然后再來(lái)解釋每一步的操作。
# -*- coding: utf-8 -*- import scrapy from secoo.items import SecooItem class WatchSpider(scrapy.Spider): name = "watch" allowed_domains = ["secoo.com"] start_urls = ["http://list.secoo.com/watches/93-0-0-0-0-1-0-0-1-10-0-908_0.shtml"] def parse(self, response): """ 解析商品列表頁(yè)面的內(nèi)容,提取商品頁(yè)面鏈接并生成請(qǐng)求 :param response: :return: """ #解析商品鏈接 goods_links = response.css("body .product_box .commodity-list dl .show_tips dt>a::attr(href)").extract() for url in goods_links: #分別去爬取商品信息 yield scrapy.Request(url, callback=self.parse_goods, dont_filter=True) next_page = self.get_next_page_url(response) if next_page: yield scrapy.Request(next_page, callback=self.parse) def get_next_page_url(self, response): """ 獲取下一個(gè)商品列表的鏈接 :param response: :return: """ return response.css("a.next::attr(href)").extract_first() def parse_goods(self, response): """ 解析商品內(nèi)容,提取要爬取的字段 :param response: :return: """ name = response.css(".sopdetailsCon .contents .info_r .proName h2::text").extract_first() price = response.css("#secooPriceJs::text").extract_first() stock = response.css("#youhuo::text").extract_first() breadcrumb = "->".join(response.css(".smallNav p a::text").extract()) yield SecooItem({ "product_name": name, "breadcrumb": breadcrumb, "product_price": price, "product_stock": stock, })
在使用命令行工具生成爬蟲(chóng)的時(shí)候就會(huì)幫我們定義好三個(gè)變量,一個(gè)是name,這個(gè)是定義爬蟲(chóng)的名稱(chēng)的;第二個(gè)是allowed_domains,這個(gè)是一個(gè)list,定義爬蟲(chóng)允許爬取的域名;最后一個(gè)start_urls變量也是一個(gè)list類(lèi)型,是用來(lái)定義爬蟲(chóng)入口URL的,可以定義多個(gè)入口地址。
接下來(lái)是parse方法,這個(gè)方法是框架默認(rèn)的第一個(gè)處理方法,用來(lái)解析網(wǎng)頁(yè)內(nèi)容的。大概的邏輯在注釋中寫(xiě)的比較清楚,邏輯就是我們解析那個(gè)產(chǎn)品列表頁(yè)面,從其中提取產(chǎn)品列表鏈接,然后生成請(qǐng)求去爬取產(chǎn)品信息,然后再去提取產(chǎn)品列表頁(yè)面的下一頁(yè)鏈接,再生成請(qǐng)求去請(qǐng)求這個(gè)頁(yè)面,處理回調(diào)方法就是parse方法,這樣就能實(shí)現(xiàn)所有翻頁(yè)爬取。
在parse方法里提取出來(lái)的產(chǎn)品鏈接生成了請(qǐng)求之后,我把爬蟲(chóng)回調(diào)處理方法設(shè)置成parse_goods,因此我們要去定義一個(gè)parse_goods方法來(lái)處理產(chǎn)品頁(yè)面html內(nèi)容。通過(guò)xpath或是css的selector方法來(lái)提取我們想要爬取的內(nèi)容,然后丟給pipelines.py來(lái)處理了。這樣我們就把爬蟲(chóng)的所有邏輯實(shí)現(xiàn)完成了,最后一步不是驗(yàn)證爬蟲(chóng)的運(yùn)行情況了。
五、運(yùn)行
最后一步就是就是運(yùn)行操作,我們?cè)诿钚邢?,進(jìn)入項(xiàng)目目錄,然后執(zhí)行下面命令就能正常運(yùn)行爬蟲(chóng)了,由于我們沒(méi)有寫(xiě)保存操作,因此我們就把數(shù)據(jù)導(dǎo)出到一個(gè)json文件里。
scrapy crawl watch --output=product.json
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/40810.html
摘要:接上回第二部分,編寫(xiě)爬蟲(chóng)。進(jìn)入微信嵌套選擇圖片和上傳圖片接口,實(shí)現(xiàn)一鍵上傳圖片,遇到問(wèn)題看吧,我現(xiàn)在已經(jīng)可以通過(guò)爬蟲(chóng)獲取的提問(wèn)標(biāo)題了。微信故意省略想做小偷站的,看到這里基本上就能搞出來(lái)了。下一篇,采集入庫(kù) 上回,我裝了環(huán)境 也就是一對(duì)亂七八糟的東西 裝了pip,用pip裝了virtualenv,建立了一個(gè)virtualenv,在這個(gè)virtualenv里面,裝了Django,創(chuàng)建了一個(gè)...
摘要:定制篩選器,對(duì)內(nèi)容進(jìn)行篩選重點(diǎn)。審查元素這是瀏覽器自帶的工具,提供抓包和檢查網(wǎng)頁(yè)源碼的功能,供使用者分析網(wǎng)頁(yè)。超時(shí)設(shè)置,如果服務(wù)器在指定秒數(shù)內(nèi)沒(méi)有應(yīng)答,拋出異常,用于避免無(wú)響應(yīng)連接,整形或浮點(diǎn)數(shù)。返回連接狀態(tài),正常。 前言 python 3.6 ??! 本爬蟲(chóng)系列是面對(duì)有Python語(yǔ)法基礎(chǔ)的讀者寫(xiě)的,如果你沒(méi)學(xué)過(guò)python,emmmm.....也沒(méi)關(guān)系,你或許能從每篇文章中學(xué)到一些...
摘要:總的來(lái)說(shuō)有兩種反爬策略,要么驗(yàn)證身份,把蟲(chóng)子踩死在門(mén)口要么在網(wǎng)站植入各種反爬機(jī)制,讓爬蟲(chóng)知難而退。本節(jié)內(nèi)容就著這兩種反爬策略提出一些對(duì)策。內(nèi)嵌反爬很靈活,沒(méi)有什么固定的代碼格式,要花時(shí)間去分析出來(lái)。 ??之前提到過(guò),有些網(wǎng)站是防爬蟲(chóng)的。其實(shí)事實(shí)是,凡是有一定規(guī)模的網(wǎng)站,大公司的網(wǎng)站,或是盈利性質(zhì)比較強(qiáng)的網(wǎng)站,都是有高級(jí)的防爬措施的??偟膩?lái)說(shuō)有兩種反爬策略,要么驗(yàn)證身份,把蟲(chóng)子踩死在門(mén)口...
摘要:之前提到動(dòng)態(tài)加載就兩個(gè)解決方案手動(dòng)分析和。背后有許多不為人知的交易進(jìn)行著,動(dòng)態(tài)爬取的任務(wù)就是攔截它們揭開(kāi)它們的真面目。在爬蟲(chóng)界有著霸王硬上弓的稱(chēng)號(hào),管它情不情愿,來(lái)了動(dòng)態(tài)加載也只有屈服的份了。 之前提到動(dòng)態(tài)加載就兩個(gè)解決方案——手動(dòng)分析和selenium。接下來(lái)的文章我們會(huì)來(lái)深入探討它們,本文將首先,重點(diǎn)介紹前者——手動(dòng)分析 手動(dòng)分析是一個(gè)比較有難度,比較麻煩的解決方案,但優(yōu)點(diǎn)也很明顯...
摘要:進(jìn)入正題第三部分,采集入庫(kù)。內(nèi)容如下加上這個(gè)可以記住問(wèn)題在的位置,方便以后更新或者其他操作都很直白,關(guān)于各個(gè)可以看看的文檔。代碼如下添加方法采集當(dāng)前分頁(yè)正在抓取分頁(yè)這個(gè)地方寫(xiě)得很笨,之前該在加上這個(gè)屬性。 上回,我已經(jīng)大概把爬蟲(chóng)寫(xiě)出來(lái)了。 我寫(xiě)了一個(gè)內(nèi)容爬蟲(chóng),一個(gè)爬取tag里面內(nèi)容鏈接的爬蟲(chóng) 其實(shí)還差一個(gè),就是收集一共有哪些tag的爬蟲(chóng)。但是這里先不說(shuō)這個(gè)問(wèn)題,因?yàn)槲疑洗瓮?這次又不...
閱讀 1641·2023-04-25 18:56
閱讀 1566·2021-09-29 09:34
閱讀 1782·2021-09-22 15:51
閱讀 3583·2021-09-14 18:03
閱讀 1241·2021-07-23 17:54
閱讀 2115·2019-08-29 18:38
閱讀 2965·2019-08-29 12:38
閱讀 672·2019-08-26 13:41