1. 程式人生 > >汽車之家店鋪資料抓取 DotnetSpider實戰[一]

汽車之家店鋪資料抓取 DotnetSpider實戰[一]

一、背景

春節也不能閒著,一直想學一下爬蟲怎麼玩,網上搜了一大堆,大多都是Python的,大家也比較活躍,文章也比較多,找了一圈,發現園子裡面有個大神開發了一個DotNetSpider的開源庫,很值得慶幸的,該庫也支援.Net Core,於是乘著春節的空檔研究一下整個開源專案,順便實戰一下。目前網際網路汽車行業十分火熱,淘車,人人車,易車,汽車之家,所以我選取了汽車之家,芒果汽車這個店鋪,對資料進行抓取。

二、開發環境

VS2017+.Net Core2.x+DotNetSpider+Win10

三、開發

3.1新建.Net Core專案

新建一個.Net Core 控制檯應用

640?wx_fmt=png

3.2通過Nuget新增DotNetSpider類庫

搜尋DotnetSpider,新增這兩個庫就行了

640?wx_fmt=png

 3.3分析需要抓取的網頁地址

開啟該網頁https://store.mall.autohome.com.cn/83106681.html,紅框區域就是我們要抓取的資訊。

640?wx_fmt=png

我們通過Chrome的開發工具的Network抓取到這些資訊的介面,在裡面可以很清楚的知道HTTP請求中所有的資料,包括Header,Post引數等等,其實我們把就是模擬一個HTTP請求,加上對HTML的一個解析就可以將資料解析出來。

640?wx_fmt=png

引數page就是頁碼,我們只需要修改page的值就可以獲取指定頁碼的資料了。

640?wx_fmt=png

返回結果就是列表頁的HTML。

640?wx_fmt=png

 3.4建立儲存實體類AutoHomeShopListEntity

class AutoHomeShopListEntity : SpiderEntity 

        {

            public string DetailUrl { get; set; }

            public string CarImg { get; set; }

            public string Price { get; set; }

            public string DelPrice { get; set; }

            public string Title { get; set; }

            public string Tip { get; set; }

            public string BuyNum { get; set; }

            public override string ToString()

            {

                return $"{Title}|{Price}|{DelPrice}|{BuyNum}";

            }

        }

3.5建立AutoHomeProcessor

用於對於獲取到的HTML進行解析並且儲存

private class AutoHomeProcessor : BasePageProcessor

        {

            protected override void Handle(Page page)

            {

                List<AutoHomeShopListEntity> list = new List<AutoHomeShopListEntity>();

                var modelHtmlList = page.Selectable.XPath(".//div[@class='list']/ul[@class='fn-clear']/li[@class='carbox']").Nodes();

                foreach (var modelHtml in modelHtmlList)

                {

                    AutoHomeShopListEntity entity = new AutoHomeShopListEntity();

                    entity.DetailUrl = modelHtml.XPath(".//a/@href").GetValue();

                    entity.CarImg = modelHtml.XPath(".//a/div[@class='carbox-carimg']/img/@src").GetValue();

                    var price = modelHtml.XPath(".//a/div[@class='carbox-info']").GetValue(DotnetSpider.Core.Selector.ValueOption.InnerText).Trim().Replace(" ", string.Empty).Replace("\n", string.Empty).Replace("\t", string.Empty).TrimStart('¥').Split("¥");

                    if (price.Length > 1)

                    {

                        entity.Price = price[0];

                        entity.DelPrice = price[1];

                    }

                    else

                    {

                        entity.Price = price[0];

                        entity.DelPrice = price[0];

                    }

                    entity.Title = modelHtml.XPath(".//a/div[@class='carbox-title']").GetValue();

                    entity.Tip = modelHtml.XPath(".//a/div[@class='carbox-tip']").GetValue();

                    entity.BuyNum = modelHtml.XPath(".//a/div[@class='carbox-number']/span").GetValue();

                    list.Add(entity);

                }

                page.AddResultItem("CarList", list);

            }

        }

3.6建立AutoHomePipe

用於輸出抓取到的結果。

private class AutoHomePipe : BasePipeline

        {

            public override void Process(IEnumerable<ResultItems> resultItems, ISpider spider)

            {

                foreach (var resultItem in resultItems)

                {

                    Console.WriteLine((resultItem.Results["CarList"] as List<AutoHomeShopListEntity>).Count);

                    foreach (var item in (resultItem.Results["CarList"] as List<AutoHomeShopListEntity>))

                    {

                        Console.WriteLine(item);

                    }

                }

            }

        }

3.7建立Site

主要就是將HTTP的Header部資訊放進去

var site = new Site

            {

                CycleRetryTimes = 1,

                SleepTime = 200,

                Headers = new Dictionary<string, string>()

                {

                    { "Accept","text/html, */*; q=0.01" },

                    { "Referer", "https://store.mall.autohome.com.cn/83106681.html"},

                    { "Cache-Control","no-cache" },

                    { "Connection","keep-alive" },

                    { "Content-Type","application/x-www-form-urlencoded; charset=UTF-8" },

                    { "User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36"}

                }

            };

3.8構造Request

因為我們所抓取到的介面必須用POST,如果是GET請求則這一部可以省略,引數就放在PostBody就行。

List<Request> resList = new List<Request>();

            for (int i = 1; i <= 33; i++)

            {

                Request res = new Request();

                res.PostBody = $"id=7&j=%7B%22createMan%22%3A%2218273159100%22%2C%22createTime%22%3A1518433690000%2C%22row%22%3A5%2C%22siteUserActivityListId%22%3A8553%2C%22siteUserPageRowModuleId%22%3A84959%2C%22topids%22%3A%22%22%2C%22wherePhase%22%3A%221%22%2C%22wherePreferential%22%3A%220%22%2C%22whereUsertype%22%3A%220%22%7D&page={i}&shopid=83106681";

                res.Url = "https://store.mall.autohome.com.cn/shop/ajaxsitemodlecontext.jtml";

                res.Method = System.Net.Http.HttpMethod.Post;

                resList.Add(res);

            }

3.9構造爬蟲並且執行

var spider = Spider.Create(site, new QueueDuplicateRemovedScheduler(), new AutoHomeProcessor())
          .AddStartRequests(resList.ToArray())
           .AddPipeline(new AutoHomePipe());
            spider.ThreadNum = 1;
            spider.Run();

3.10執行結果

640?wx_fmt=png

四、下次預告

接下來我會將對商品的詳情頁資料(包括車型引數配置之類的)進行抓取,介面已經抓取到了,還在思考如果更加便捷獲取到商品id,因為目前來看商品id是儲存在頁面的js全域性變數中,抓取起來比較費勁。

640?wx_fmt=png

五、總結

.Net 相對於別的語言感覺並不是那麼活躍,DotnetSpider雖然時間不長,但是希望園子裡面大夥都用起來,讓他不斷的發展,讓我們的.Net能夠更好的發展。

原文地址: https://www.cnblogs.com/FunnyBoy/p/8453338.html

.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com

640?wx_fmt=jpeg

相關推薦

汽車店鋪資料 DotnetSpider實戰[]

一、背景春節也不能閒著,一直想學一下爬蟲怎麼玩,網上搜了一大堆,大多都是Python的,大家也比

汽車店鋪數據 DotnetSpider實戰[]

@class 詳情 nbsp 實體 比較 request else post 好的 一、背景 春節也不能閑著,一直想學一下爬蟲怎麽玩,網上搜了一大堆,大多都是Python的,大家也比較活躍,文章也比較多,找了一圈,發現園子裏面有個大神開發了一個DotNetSpider的開源

汽車店鋪數據 DotnetSpider實戰

xv6 pan req time 大神 -i xib lac context 一、背景 春節也不能閑著,一直想學一下爬蟲怎麽玩,網上搜了一大堆,大多都是Python的,大家也比較活躍,文章也比較多,找了一圈,發現園子裏面有個大神開發了一個DotNetSpider的開源庫,

使用python汽車車型資料

import requests import pymysql HOSTNAME = '127.0.0.1' USERNAME = 'root' PASSWORD = 'zyndev' DATABASE = 'zyndev_new' brand = 'ht

汽車口碑資料的爬蟲

一,爬蟲都是具有時效性的,我不知道反爬蟲什麼時候更新,所以失效以後,除非工作需要,否則我也一般會維護。二,移動客戶端網頁一般比電腦的網頁更好爬取,所以這次可以用汽車之家口碑的移動端網頁,用電腦網頁也可以,但是需要在汽車之家論壇反爬蟲的基礎上在進行修改。比較麻煩。三,以這篇口碑為例,在網頁上顯示的最滿意為下圖所

Twitter資料的方法()

EDIT – Since I wrote this post, Twitter has updated how you get the next list of tweets for your result. Rather than using scroll_cursor, it uses max_pos

使用Java解析汽車車型配置資料

因為公司業務需求,需要獲取汽車之家的車型配置資料如下圖:        由於汽車之家沒做防爬策略,只是資料給混淆了,這裡主要說解析資料。        通過儲存頁面,配置項的資料是通過JS動態生成的。在頁面的第572行左右,有配置項的json格式資料        主要的配置

java 開發用到網路爬蟲,汽車網站全部資料經歷

經歷了兩個禮拜的折騰,某某知名網站的資料終於到手了。犯罪沒被發現這種心情感覺很爽。 說一下我的犯罪經歷,之前公司總是抓取某某網站資料,可能是被發現了。某某網站改變了策略。通過各種技術終止了我們的行為,導致我們的抓取功能報錯,逐步跟蹤,發現我們之前是在人家的網站,通過Webh

汽車資料:文章連結//圖片//標題

(1)打印出來的東西亂碼,如何處理這個問題? import requests response=requests.get( url='https://www.autohome.com.cn/beijing/' #最新的地址是可以出來的 # url='https://

RCurl汽車

汽車之家抓取 2016年4月20日 參考:http://blog.sina.com.cn/s/blog_6f2336820102v13n.html 汽車之家抓取 library(RCur

python入門-----爬汽車新聞,---自動登錄抽屜並點贊,

ike color div標簽 pla spa art com col 3-9 爬取汽車之家新聞,代碼如下 import requests res=requests.get(url=‘https://www.autohome.com.cn/news/‘) #向汽車直接

汽車

ref article brush att split channel odin lazy com import requests from bs4 import BeautifulSoup response = requests.get(‘https://www.aut

python3 爬汽車所有車型操作步驟

  題記:   網際網路上關於使用python3去爬取汽車之家的汽車資料(主要是汽車基本引數,配置引數,顏色引數,內飾引數)的教程已經非常多了,但大體的方案分兩種:   1.解析出汽車之家某個車型的網頁,然後正則表示式匹配出混淆後的資料物件與混淆後的js,並對混淆後的js使用pyv8進行解析返回

python網路爬蟲爬汽車的最新資訊和照片

實現的功能是爬取汽車之家的最新資訊的連結 題目和文章中的照片 爬蟲需要用到我們使用了 requests 做網路請求,拿到網頁資料再用 BeautifulSoup 進行解析 首先先檢查是否安裝了pip,如果已經安裝了pip,直接pip install requests,pip uninstal

汽車北京二手車資訊

爬取汽車之家北京二手車資訊 經測試,該網站:https://www.che168.com/beijing/list/ 反爬機制較低,僅需要偽造請求頭設定爬取速率,但是100頁之後需要登入,登入之後再爬要慎重,一不小心就會永久封號。爬取的資料以各種型別存放,下面展示儲存到mysql資料

汽車網站為例-爬蟲的編寫,爬圖片

                                  汽車之家圖片的爬取       汽車之家有很多汽車的點評、價格、圖片等資訊,那麼怎麼才能編寫一個爬蟲來獲得我們所需要的資訊呢,很簡單,兩個工具便可以了,一個網頁解析工具requests,一個正則匹配工具re

網頁資料讀取網頁資料

最近專案中需要用到各大網站的資料,這裡沒用爬蟲,用純java程式碼,無任何外掛,抓取一些自己需要的資料! 後續會記錄主要的幾個網站資料抓取,主要針對帶單個搜尋框的網站!下面是一個公用的讀取網頁資料操作

Python爬最新反爬蟲汽車口碑

本人剛學Python沒幾天,程式碼可能比較醜陋, 大牛不要噴 用的Python2.7.2, 因為PyV8最高支援2.7.2, js混淆部分用的PyV8直接執行的js 原理已經寫過一篇了,這裡不再贅述了.可以看我的這篇 目錄結構如下: fonts資料夾負責存放下載的字型檔案

python爬蟲實戰汽車上車型價格

相關庫 import pymysql import pymysql.cursors from bs4 import BeautifulSoup import requests import random

WebMagic爬蟲入門教程(三)爬汽車的例項-品牌車系車型結構等

    本文使用WebMagic爬取汽車之家的品牌車系車型結構價格能源產地國別等;java程式碼備註,只是根據url變化爬取的,沒有使用爬取script頁面具體的資料,也有反爬機制,知識簡單爬取html標籤爬取的網頁:    需要配置pom.xml <!-