這段時間一直在搞爬蟲,學了一段時間之後,最後還是使用的selenium模擬瀏覽器來進行爬取。
就來記錄一下自己踩的坑。一開始在網上找提升selenium爬蟲速度的方法,都是說什麼多線程,關閉圖片讀取之類的。當然我也貼一個關閉圖片讀取的代碼,畢竟還是挺有用的。
var options = new FirefoxOptions();
options.SetPreference("permissions.default.image", 2);//無圖
var driver = new FirefoxDriver(options);
接下來就是自己總結出來的乾貨了。
首先你如果想要提高速度,就一定不能使用每次爬取一個頁面就要打開一個瀏覽器,然後關閉的方式。對,在c#中每new一個driver,就是打開了一個瀏覽器,而打開瀏覽器的時間花費很長,並且徹底關閉也要花時間。代碼如下:`
void craw(stirn url)
{
var options = new FirefoxOptions();
options.SetPreference("permissions.default.image", 2);//無圖
FirefoxDriver driver = new FirefoxDriver(options);//這裏的new一個對象就是在打開一個瀏覽器,很費時間
driver.Url=url;//讀取網址
Console.WriteLine(driver.Title);//你對網址的操作,我就是輸出了一下標題
driver.Quit();//徹底退出該瀏覽器
}
這個函數,每調用一次就是在打開一個瀏覽器,如果多線程執行,就是不斷的同時打開多個瀏覽器,並且耗時間和內存。
然後我當時想到了一種思路就是,我先創建創建好一個瀏覽器,不關閉,然後直接改變他的url,這樣提升起來的速度就是快了近10倍。上面的代碼一分鐘能爬200個左右的網站,還是開了五個瀏覽器同時在跑的結果。而下面的方法也是五個瀏覽器,卻能一小時大概3000條左右。
FirefoxDriver driver=null;
void initialize()
{
var options = new FirefoxOptions();
options.SetPreference("permissions.default.image", 2);//無圖
driver = new FirefoxDriver(options);//這裏的new一個對象就是在打開一個瀏覽器,很費時間
}
void craw(string url)
{
driver.Url=url;//讀取網址
Console.WriteLine(driver.Title);//你對網址的操作,我就是輸出了一下標題
driver.Quit();//徹底退出該瀏覽器
}
這樣你每次調用的時候,就只需要調用改變讀取網頁就行了,不需要等待瀏覽器開關。在爬取多個網頁的時候的速度就能夠有很多倍的提升。
下面還有一個更加驚爆的提速方法在等着大家,這個方法,只要你硬件網速跟得上,這個速度有能提高十倍。如果想要知道,就在下面留言,沒錯,我就是看到一直沒人評論,不爽了想看看有沒有想知道。
好吧!已經發了,僅粉絲可見!