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