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