汽車之家店鋪資料抓取 DotnetSpider實戰[一]
一、背景
春節也不能閒著,一直想學一下爬蟲怎麼玩,網上搜了一大堆,大多都是Python的,大家也比較活躍,文章也比較多,找了一圈,發現園子裡面有個大神開發了一個DotNetSpider的開源庫,很值得慶幸的,該庫也支援.Net Core,於是乘著春節的空檔研究一下整個開源專案,順便實戰一下。目前網際網路汽車行業十分火熱,淘車,人人車,易車,汽車之家,所以我選取了汽車之家,芒果汽車這個店鋪,對資料進行抓取。
二、開發環境
VS2017+.Net Core2.x+DotNetSpider+Win10
三、開發
3.1新建.Net Core專案
新建一個.Net Core 控制檯應用
3.2通過Nuget新增DotNetSpider類庫
搜尋DotnetSpider,新增這兩個庫就行了
3.3分析需要抓取的網頁地址
開啟該網頁https://store.mall.autohome.com.cn/83106681.html,紅框區域就是我們要抓取的資訊。
我們通過Chrome的開發工具的Network抓取到這些資訊的介面,在裡面可以很清楚的知道HTTP請求中所有的資料,包括Header,Post引數等等,其實我們把就是模擬一個HTTP請求,加上對HTML的一個解析就可以將資料解析出來。
引數page就是頁碼,我們只需要修改page的值就可以獲取指定頁碼的資料了。
返回結果就是列表頁的HTML。
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執行結果
四、下次預告
接下來我會將對商品的詳情頁資料(包括車型引數配置之類的)進行抓取,介面已經抓取到了,還在思考如果更加便捷獲取到商品id,因為目前來看商品id是儲存在頁面的js全域性變數中,抓取起來比較費勁。
五、總結
.Net 相對於別的語言感覺並不是那麼活躍,DotnetSpider雖然時間不長,但是希望園子裡面大夥都用起來,讓他不斷的發展,讓我們的.Net能夠更好的發展。
原文地址: https://www.cnblogs.com/FunnyBoy/p/8453338.html
.NET社群新聞,深度好文,歡迎訪問公眾號文章彙總 http://www.csharpkit.com
相關推薦
汽車之家店鋪資料抓取 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 <!-