亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據

網(wǎng)絡(luò )爬蟲(chóng)—利用SAS抓取網(wǎng)頁(yè)方法

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 99 次瀏覽 ? 2022-05-14 02:43 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)絡(luò )爬蟲(chóng)—利用SAS抓取網(wǎng)頁(yè)方法
  萬(wàn)維網(wǎng)過(guò)多的信息,股票報價(jià),電影評論,市場(chǎng)價(jià)格趨勢話(huà)題,幾乎所有的東西,可以發(fā)現在點(diǎn)擊一個(gè)按鈕。在分析數據中發(fā)現,許多SAS用戶(hù)感興趣在網(wǎng)絡(luò )上,但你得到這個(gè)數據的SAS環(huán)境呢?有很多方法,如 SAS數據步驟中的代碼在設計你自己的網(wǎng)絡(luò )爬蟲(chóng)或利用SAS%TMFILTER宏 ? 文本挖掘。在本文中,我們將審查一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構。我們將討論獲得網(wǎng)站的方法到SAS的信息,以及審查內部所謂的SAS搜索從實(shí)驗項目的實(shí)驗代碼管道。我們也將提供咨詢(xún)如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng),以適應個(gè)性化需求,以及如何具體的數據導入到SAS ? 企業(yè)礦工?。
  簡(jiǎn)介:互聯(lián)網(wǎng)已經(jīng)成為一個(gè)有用的信息來(lái)源。通常是Web上的數據,我們要使用內的SAS,所以我們需要找到一種方式來(lái)獲得這個(gè)數據。最好的辦法是使用一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。 SAS提供幾個(gè)從Web爬行和提取信息的方法。您可以使用基本的SAS數據步驟中的代碼,或SAS文本礦工的%TMFILTER宏。雖然目前無(wú)法使用,SAS搜索管道將是一個(gè)功能強大的Web爬行產(chǎn)品,并提供更多的工具,網(wǎng)絡(luò )爬行。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),所以取決于你想實(shí)現抓取的,它是最好對其進(jìn)行審查。
  首先,重要的是要了解網(wǎng)絡(luò )爬蟲(chóng)是如何工作的。你應該熟悉數據步驟的代碼,宏,和SAS過(guò)程PROC SQL,然后再繼續。
  網(wǎng)絡(luò )爬蟲(chóng)概述:一個(gè)網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,一個(gè)或多個(gè)起始地址作為“種子URL”,下載網(wǎng)站這些URL相關(guān)的網(wǎng)頁(yè),在網(wǎng)頁(yè)中包含的任何超鏈接提取,并遞歸地繼續這些超鏈接標識下載Web頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)是很簡(jiǎn)單的。
  一個(gè)Web 履帶式有四項職責:
  1。從候選人中選擇一個(gè)網(wǎng)址。
  2。它下載相關(guān)的Web頁(yè)。
  3。它提取物在網(wǎng)頁(yè)中的URL(超鏈接)。
  4。它補充說(shuō),未曾遇到的候選集的URL
  方法1:在WEB SAS數據步驟中的代碼履帶式
  首先創(chuàng )建一個(gè)網(wǎng)址的網(wǎng)站的Web crawler將開(kāi)始列表。
  data work.links_to_crawl;
  length url $256 ;
  input url $;
  datalines;
  ;
  run
  為了確保我們不抓取相同的URL一次以上,持有環(huán)節已創(chuàng )建一個(gè)數據抓取。
  當Web數據集將在開(kāi)始時(shí)是空的,但一個(gè)網(wǎng)站的網(wǎng)址將被添加到數據集履帶式完成抓取該網(wǎng)站。
  data work.links_crawled;
  length url $256;
  run;
  現在我們開(kāi)始爬行!該代碼需要我們的 work.links_to_crawl數據集的第一個(gè)URL。在第一觀(guān)察“_N_式1”,網(wǎng)址是投入名為 next_url 宏變量,所有剩余的URL放回我們的種子URL數據集,使他們在未來(lái)的迭代。
  /* pop the next url off */
  %let next_url = ;
  data work.links_to_crawl;
  set work.links_to_crawl;
  if _n_ eq 1 then call symput(“next_url”, url);
  else output;
  run;
  現在,從互聯(lián)網(wǎng)上下載的網(wǎng)址。創(chuàng )建一個(gè)文件名稱(chēng) _nexturl 。我們讓SAS知道它是一個(gè)URL 而且可以發(fā)現,AT&next_url,這是我們的宏觀(guān)變量,它包含的網(wǎng)址我們從拉 work.links_to_crawl數據集。
  /* crawl the url */
  filename _nexturl url “&next_url”
  建立后的文件名的URL參考,確定一個(gè)地方把我們下載的文件。創(chuàng )建另一個(gè)文件名引用所謂 htmlfilm的條目,并在那里把從 url_file.html收集到的信息。
  /* put the file we crawled here */
  filename htmlfile “url_file.html”
  接下來(lái),我們通過(guò)數據的循環(huán),把它寫(xiě)htmlfilm的條目文件名參考,并尋找更多的網(wǎng)址添加到我們的 work.links_to_crawl數據集。
  /* find more urls */
  data work._urls(keep=url);
  length url $256 ;
  file htmlfile;
  infile _nexturl length=len;
  input text $varying2000. len;
  put text;
  start = 1;
  stop = length(text);
  使用正則表達式一個(gè)網(wǎng)站的網(wǎng)址,以幫助搜索。正則表達式的匹配方法文本字符串,如字,詞,或字符模式。 SAS已經(jīng)提供了許多強大的字符串功能。然而,正則表達式通常會(huì )提供一個(gè)更簡(jiǎn)潔的方式,操縱和匹配的文本.
  if _n_ = 1 then do;
  retain patternID;
  pattern = ‘/href=”([^"]+)”/i’;
  patternID = prxparse(pattern);
  end
  首次觀(guān)察到,創(chuàng )建一個(gè)patternID將保持整個(gè)數據步運行。尋找的模式是: “/href=”([^"]+)”/i’”.,這意味著(zhù)我們正在尋找字符串“HREF =”“,然后再尋找任何字符串,是至少有一個(gè)字符長(cháng),不包含引號(“),并結束在引號(”)。在’我’ 目的的手段使用不區分大小寫(xiě)的方法,以配合我們的正則表達式。
  As a result, the Web crawler will find these types of strings:
  href=”sgf/2010/papers.html”
  href=””
  HREF=””
  hReF=””
  現在正則表達式匹配的一個(gè)網(wǎng)站上的文字。 PRXNEXT需要五個(gè)參數:正則表達式我們要尋找,尋找開(kāi)始尋找正則表達式的開(kāi)始位置,結束位置停止正則表達式,一旦發(fā)現字符串中的位置,而字符串的長(cháng)度,如果發(fā)現的位置將是0,如果沒(méi)有找到字符串。 PRXNEXT也改變了開(kāi)始的參數,使搜索重新開(kāi)始后的最后一場(chǎng)比賽是發(fā)現。
  call prxnext(patternID, start, stop, text, position, length);
  代碼中的循環(huán),在網(wǎng)站上找到的所有環(huán)節顯示的文本。
  do while (position ^= 0);
  url = substr(text, position+6, length-7);
  output;
  call prxnext(patternID, start, stop, text, position, length);
  end;
  run;
  如果代碼發(fā)現一個(gè)網(wǎng)址,它會(huì )檢索唯一的URL的一部分,啟動(dòng)后的第一個(gè)引號。例如,如果代碼中發(fā)現的HREF =“”,那么它應該保持 。使用 substr到刪除前的6個(gè)字符和最后一個(gè)字符的URL的其余部分輸出的work._urls 數據集?,F在,我們插入的URL代碼只是以跟蹤抓取到一個(gè)數據集名為 work.links_crawled 我們已經(jīng)和確保我們不再次瀏覽有。
  /* add the current link to the list of urls we have already crawled */
  data work._old_link;
  url = “&next_url”;
  run;
  proc append base=work.links_crawled data=work._old_link force;
  run;
  下一步是在數據集 work._urls 的過(guò)程中發(fā)現的網(wǎng)址列表,以確保:
  1。我們尚未抓取他們,換句話(huà)說(shuō)URL是不是在 work.links_crawled)。
  2。我們沒(méi)有排隊抓取的URL(網(wǎng)址換句話(huà)說(shuō),是不是在work.links_to_crawl )。
  /*
  * only add urls that we have not already crawled
  * or that are not queued up to be crawled
  *
  */
  proc sql noprint;
  create table work._append as
  select url
  from work._urls
  where url not in (select url from work.links_crawled)
  and url not in (select url from work.links_to_crawl);
  quit;
  然后,我們添加網(wǎng)址還沒(méi)有被抓取,而不是已經(jīng)排隊 work.links_to_crawl數據集。
  /* add new links */
  proc append base=work.links_to_crawl data=work._append force;
  run;
  此時(shí)的代碼循環(huán)回到開(kāi)始劫掠 work.links_to_crawl數據集的下一個(gè)URL。 查看全部

  網(wǎng)絡(luò )爬蟲(chóng)—利用SAS抓取網(wǎng)頁(yè)方法
  萬(wàn)維網(wǎng)過(guò)多的信息,股票報價(jià),電影評論,市場(chǎng)價(jià)格趨勢話(huà)題,幾乎所有的東西,可以發(fā)現在點(diǎn)擊一個(gè)按鈕。在分析數據中發(fā)現,許多SAS用戶(hù)感興趣在網(wǎng)絡(luò )上,但你得到這個(gè)數據的SAS環(huán)境呢?有很多方法,如 SAS數據步驟中的代碼在設計你自己的網(wǎng)絡(luò )爬蟲(chóng)或利用SAS%TMFILTER宏 ? 文本挖掘。在本文中,我們將審查一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構。我們將討論獲得網(wǎng)站的方法到SAS的信息,以及審查內部所謂的SAS搜索從實(shí)驗項目的實(shí)驗代碼管道。我們也將提供咨詢(xún)如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng),以適應個(gè)性化需求,以及如何具體的數據導入到SAS ? 企業(yè)礦工?。
  簡(jiǎn)介:互聯(lián)網(wǎng)已經(jīng)成為一個(gè)有用的信息來(lái)源。通常是Web上的數據,我們要使用內的SAS,所以我們需要找到一種方式來(lái)獲得這個(gè)數據。最好的辦法是使用一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。 SAS提供幾個(gè)從Web爬行和提取信息的方法。您可以使用基本的SAS數據步驟中的代碼,或SAS文本礦工的%TMFILTER宏。雖然目前無(wú)法使用,SAS搜索管道將是一個(gè)功能強大的Web爬行產(chǎn)品,并提供更多的工具,網(wǎng)絡(luò )爬行。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),所以取決于你想實(shí)現抓取的,它是最好對其進(jìn)行審查。
  首先,重要的是要了解網(wǎng)絡(luò )爬蟲(chóng)是如何工作的。你應該熟悉數據步驟的代碼,宏,和SAS過(guò)程PROC SQL,然后再繼續。
  網(wǎng)絡(luò )爬蟲(chóng)概述:一個(gè)網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,一個(gè)或多個(gè)起始地址作為“種子URL”,下載網(wǎng)站這些URL相關(guān)的網(wǎng)頁(yè),在網(wǎng)頁(yè)中包含的任何超鏈接提取,并遞歸地繼續這些超鏈接標識下載Web頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)是很簡(jiǎn)單的。
  一個(gè)Web 履帶式有四項職責:
  1。從候選人中選擇一個(gè)網(wǎng)址。
  2。它下載相關(guān)的Web頁(yè)。
  3。它提取物在網(wǎng)頁(yè)中的URL(超鏈接)。
  4。它補充說(shuō),未曾遇到的候選集的URL
  方法1:在WEB SAS數據步驟中的代碼履帶式
  首先創(chuàng )建一個(gè)網(wǎng)址的網(wǎng)站的Web crawler將開(kāi)始列表。
  data work.links_to_crawl;
  length url $256 ;
  input url $;
  datalines;
  ;
  run
  為了確保我們不抓取相同的URL一次以上,持有環(huán)節已創(chuàng )建一個(gè)數據抓取。
  當Web數據集將在開(kāi)始時(shí)是空的,但一個(gè)網(wǎng)站的網(wǎng)址將被添加到數據集履帶式完成抓取該網(wǎng)站。
  data work.links_crawled;
  length url $256;
  run;
  現在我們開(kāi)始爬行!該代碼需要我們的 work.links_to_crawl數據集的第一個(gè)URL。在第一觀(guān)察“_N_式1”,網(wǎng)址是投入名為 next_url 宏變量,所有剩余的URL放回我們的種子URL數據集,使他們在未來(lái)的迭代。
  /* pop the next url off */
  %let next_url = ;
  data work.links_to_crawl;
  set work.links_to_crawl;
  if _n_ eq 1 then call symput(“next_url”, url);
  else output;
  run;
  現在,從互聯(lián)網(wǎng)上下載的網(wǎng)址。創(chuàng )建一個(gè)文件名稱(chēng) _nexturl 。我們讓SAS知道它是一個(gè)URL 而且可以發(fā)現,AT&next_url,這是我們的宏觀(guān)變量,它包含的網(wǎng)址我們從拉 work.links_to_crawl數據集。
  /* crawl the url */
  filename _nexturl url “&next_url”
  建立后的文件名的URL參考,確定一個(gè)地方把我們下載的文件。創(chuàng )建另一個(gè)文件名引用所謂 htmlfilm的條目,并在那里把從 url_file.html收集到的信息。
  /* put the file we crawled here */
  filename htmlfile “url_file.html”
  接下來(lái),我們通過(guò)數據的循環(huán),把它寫(xiě)htmlfilm的條目文件名參考,并尋找更多的網(wǎng)址添加到我們的 work.links_to_crawl數據集。
  /* find more urls */
  data work._urls(keep=url);
  length url $256 ;
  file htmlfile;
  infile _nexturl length=len;
  input text $varying2000. len;
  put text;
  start = 1;
  stop = length(text);
  使用正則表達式一個(gè)網(wǎng)站的網(wǎng)址,以幫助搜索。正則表達式的匹配方法文本字符串,如字,詞,或字符模式。 SAS已經(jīng)提供了許多強大的字符串功能。然而,正則表達式通常會(huì )提供一個(gè)更簡(jiǎn)潔的方式,操縱和匹配的文本.
  if _n_ = 1 then do;
  retain patternID;
  pattern = ‘/href=”([^"]+)”/i’;
  patternID = prxparse(pattern);
  end
  首次觀(guān)察到,創(chuàng )建一個(gè)patternID將保持整個(gè)數據步運行。尋找的模式是: “/href=”([^"]+)”/i’”.,這意味著(zhù)我們正在尋找字符串“HREF =”“,然后再尋找任何字符串,是至少有一個(gè)字符長(cháng),不包含引號(“),并結束在引號(”)。在’我’ 目的的手段使用不區分大小寫(xiě)的方法,以配合我們的正則表達式。
  As a result, the Web crawler will find these types of strings:
  href=”sgf/2010/papers.html”
  href=””
  HREF=””
  hReF=””
  現在正則表達式匹配的一個(gè)網(wǎng)站上的文字。 PRXNEXT需要五個(gè)參數:正則表達式我們要尋找,尋找開(kāi)始尋找正則表達式的開(kāi)始位置,結束位置停止正則表達式,一旦發(fā)現字符串中的位置,而字符串的長(cháng)度,如果發(fā)現的位置將是0,如果沒(méi)有找到字符串。 PRXNEXT也改變了開(kāi)始的參數,使搜索重新開(kāi)始后的最后一場(chǎng)比賽是發(fā)現。
  call prxnext(patternID, start, stop, text, position, length);
  代碼中的循環(huán),在網(wǎng)站上找到的所有環(huán)節顯示的文本。
  do while (position ^= 0);
  url = substr(text, position+6, length-7);
  output;
  call prxnext(patternID, start, stop, text, position, length);
  end;
  run;
  如果代碼發(fā)現一個(gè)網(wǎng)址,它會(huì )檢索唯一的URL的一部分,啟動(dòng)后的第一個(gè)引號。例如,如果代碼中發(fā)現的HREF =“”,那么它應該保持 。使用 substr到刪除前的6個(gè)字符和最后一個(gè)字符的URL的其余部分輸出的work._urls 數據集?,F在,我們插入的URL代碼只是以跟蹤抓取到一個(gè)數據集名為 work.links_crawled 我們已經(jīng)和確保我們不再次瀏覽有。
  /* add the current link to the list of urls we have already crawled */
  data work._old_link;
  url = “&next_url”;
  run;
  proc append base=work.links_crawled data=work._old_link force;
  run;
  下一步是在數據集 work._urls 的過(guò)程中發(fā)現的網(wǎng)址列表,以確保:
  1。我們尚未抓取他們,換句話(huà)說(shuō)URL是不是在 work.links_crawled)。
  2。我們沒(méi)有排隊抓取的URL(網(wǎng)址換句話(huà)說(shuō),是不是在work.links_to_crawl )。
  /*
  * only add urls that we have not already crawled
  * or that are not queued up to be crawled
  *
  */
  proc sql noprint;
  create table work._append as
  select url
  from work._urls
  where url not in (select url from work.links_crawled)
  and url not in (select url from work.links_to_crawl);
  quit;
  然后,我們添加網(wǎng)址還沒(méi)有被抓取,而不是已經(jīng)排隊 work.links_to_crawl數據集。
  /* add new links */
  proc append base=work.links_to_crawl data=work._append force;
  run;
  此時(shí)的代碼循環(huán)回到開(kāi)始劫掠 work.links_to_crawl數據集的下一個(gè)URL。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的選擇思路及選擇方法介紹-requests

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 82 次瀏覽 ? 2022-05-11 15:02 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的選擇思路及選擇方法介紹-requests
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的工具很多,比如requests、beautifulsoup等等;另外爬蟲(chóng)還可以用scrapy框架做反爬蟲(chóng)。甚至apache/nginx做反反爬蟲(chóng)也可以。本文會(huì )結合requests做網(wǎng)頁(yè)反爬蟲(chóng)。文章包含以下主要內容1.介紹一下requests庫2.先介紹爬蟲(chóng)是怎么獲取網(wǎng)頁(yè)數據的3.解決爬蟲(chóng)服務(wù)器速度慢、不穩定的問(wèn)題4.在各種網(wǎng)頁(yè)爬蟲(chóng)框架中的選擇思路5.requests詳細流程看起來(lái)主要內容不多,一行代碼搞定,但上述一些問(wèn)題確很麻煩。
  以上每一個(gè)都會(huì )成為一篇文章,首先說(shuō)明這里每一個(gè)主要代碼單獨抽取下即可,其實(shí)大多是我寫(xiě)的。再說(shuō)明上述操作本質(zhì)上是對url和網(wǎng)頁(yè)元素進(jìn)行了解析。由于requests方便的處理url,因此解析html這件事可以交給自己來(lái)做。requests最簡(jiǎn)單的實(shí)現抓取網(wǎng)頁(yè)時(shí),沒(méi)有必要在html網(wǎng)頁(yè)處理過(guò)程中還需要保存html信息,基本步驟:1.獲取網(wǎng)頁(yè)包含信息2.解析html3.存儲數據對爬蟲(chóng)爬取html來(lái)說(shuō),需要經(jīng)歷requests庫爬取網(wǎng)頁(yè)時(shí)傳遞參數,傳遞到selenium線(xiàn)程池,由線(xiàn)程池來(lái)解析html信息。
  selenium不需要保存任何網(wǎng)頁(yè)信息,直接處理后分析為webapi輸出即可。所以上述的各個(gè)步驟和html編碼沒(méi)有太大關(guān)系。也不要問(wèn)為什么不用xpath,因為xpath和html編碼不一樣,在抓取網(wǎng)頁(yè)時(shí)必須轉換為xpath/emoji可讀語(yǔ)言才能讀取正?!,F在有一些爬蟲(chóng)框架都有支持requests,比如scrapy、kibana和motrix;正因為requests簡(jiǎn)單,因此其解析html的方式也簡(jiǎn)單;我們介紹一下其中一些爬蟲(chóng)框架的爬取html的方式。
  這樣的主要目的是想通過(guò)對requests的熟悉,進(jìn)一步使用其他框架做爬蟲(chóng)之類(lèi)的。requestsjs官網(wǎng):requests的一個(gè)重要版本,很多第三方包支持其爬取html信息。javascript解析html模塊庫:v8解析javascript/text/string,使用jsonp:直接發(fā)送http請求或是使用瀏覽器的瀏覽器api返回html數據,jquery解析javascript代碼,并將javascript數據以html數據格式返回。
  prestojs(已經(jīng)被大棄)/zeptojs(github)requestsjs的主要代碼都來(lái)自于這里;web容器:injection來(lái)負責生成html標簽和處理html;有一個(gè)重要組件是seleniumdriver和requests的交互,getseleniumdriver做的事情非常類(lèi)似于html編程中的函數調用,類(lèi)似于open和session來(lái)做html編程中的dom操作;httpurlconnectionhttpconnection負責接收請求并處理響應,并且通過(guò)post請求,向服務(wù)器發(fā)送數據,請求的格式使用headers:attributes:user-agent:mozilla/5.0(ipad;cpuiphoneosx10_。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的選擇思路及選擇方法介紹-requests
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的工具很多,比如requests、beautifulsoup等等;另外爬蟲(chóng)還可以用scrapy框架做反爬蟲(chóng)。甚至apache/nginx做反反爬蟲(chóng)也可以。本文會(huì )結合requests做網(wǎng)頁(yè)反爬蟲(chóng)。文章包含以下主要內容1.介紹一下requests庫2.先介紹爬蟲(chóng)是怎么獲取網(wǎng)頁(yè)數據的3.解決爬蟲(chóng)服務(wù)器速度慢、不穩定的問(wèn)題4.在各種網(wǎng)頁(yè)爬蟲(chóng)框架中的選擇思路5.requests詳細流程看起來(lái)主要內容不多,一行代碼搞定,但上述一些問(wèn)題確很麻煩。
  以上每一個(gè)都會(huì )成為一篇文章,首先說(shuō)明這里每一個(gè)主要代碼單獨抽取下即可,其實(shí)大多是我寫(xiě)的。再說(shuō)明上述操作本質(zhì)上是對url和網(wǎng)頁(yè)元素進(jìn)行了解析。由于requests方便的處理url,因此解析html這件事可以交給自己來(lái)做。requests最簡(jiǎn)單的實(shí)現抓取網(wǎng)頁(yè)時(shí),沒(méi)有必要在html網(wǎng)頁(yè)處理過(guò)程中還需要保存html信息,基本步驟:1.獲取網(wǎng)頁(yè)包含信息2.解析html3.存儲數據對爬蟲(chóng)爬取html來(lái)說(shuō),需要經(jīng)歷requests庫爬取網(wǎng)頁(yè)時(shí)傳遞參數,傳遞到selenium線(xiàn)程池,由線(xiàn)程池來(lái)解析html信息。
  selenium不需要保存任何網(wǎng)頁(yè)信息,直接處理后分析為webapi輸出即可。所以上述的各個(gè)步驟和html編碼沒(méi)有太大關(guān)系。也不要問(wèn)為什么不用xpath,因為xpath和html編碼不一樣,在抓取網(wǎng)頁(yè)時(shí)必須轉換為xpath/emoji可讀語(yǔ)言才能讀取正?!,F在有一些爬蟲(chóng)框架都有支持requests,比如scrapy、kibana和motrix;正因為requests簡(jiǎn)單,因此其解析html的方式也簡(jiǎn)單;我們介紹一下其中一些爬蟲(chóng)框架的爬取html的方式。
  這樣的主要目的是想通過(guò)對requests的熟悉,進(jìn)一步使用其他框架做爬蟲(chóng)之類(lèi)的。requestsjs官網(wǎng):requests的一個(gè)重要版本,很多第三方包支持其爬取html信息。javascript解析html模塊庫:v8解析javascript/text/string,使用jsonp:直接發(fā)送http請求或是使用瀏覽器的瀏覽器api返回html數據,jquery解析javascript代碼,并將javascript數據以html數據格式返回。
  prestojs(已經(jīng)被大棄)/zeptojs(github)requestsjs的主要代碼都來(lái)自于這里;web容器:injection來(lái)負責生成html標簽和處理html;有一個(gè)重要組件是seleniumdriver和requests的交互,getseleniumdriver做的事情非常類(lèi)似于html編程中的函數調用,類(lèi)似于open和session來(lái)做html編程中的dom操作;httpurlconnectionhttpconnection負責接收請求并處理響應,并且通過(guò)post請求,向服務(wù)器發(fā)送數據,請求的格式使用headers:attributes:user-agent:mozilla/5.0(ipad;cpuiphoneosx10_。

爬蟲(chóng)入門(mén)到精通-網(wǎng)頁(yè)的下載

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 119 次瀏覽 ? 2022-05-09 09:27 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)入門(mén)到精通-網(wǎng)頁(yè)的下載
  
  本文章屬于爬蟲(chóng)入門(mén)到精通系統教程第四講
  在爬蟲(chóng)入門(mén)到精通第二講中,我們了解了HTTP協(xié)議
  #rd,那么我們現在使用這些協(xié)議來(lái)快速爬蟲(chóng)吧
  本文的目標
  當你看完本文后,你應該能爬?。◣缀酰┤魏蔚木W(wǎng)頁(yè)
  使用chrome抓包抓包(packet capture)就是將網(wǎng)絡(luò )傳輸發(fā)送與接收的數據包進(jìn)行截獲、重發(fā)、編輯、轉存等操作,也用來(lái)檢查網(wǎng)絡(luò )安全。抓包也經(jīng)常被用來(lái)進(jìn)行數據截取等。第一個(gè)案列:抓取輪子哥的動(dòng)態(tài)()
  1.打開(kāi)輪子哥動(dòng)態(tài)這個(gè)網(wǎng)頁(yè)
  
  2.打開(kāi)抓包工具
  應該會(huì )看到如下界面
  
  3.找到我們需要的請求
  可以看到如下截圖,里面有這么多的請求,那么到底哪一個(gè)才是我們需要的呢 ?
  
  這邊提供一個(gè)小技巧
  簡(jiǎn)單來(lái)講就是如果整個(gè)頁(yè)面沒(méi)有刷新的話(huà),那就是在XHR里面,否則在DOC里面
  因為本次抓包整個(gè)頁(yè)面有刷新,所以,我們需要找的請求在DOC下面,可以看到只有一個(gè)請求
  
  4.驗證請求是對的
  有以下兩種方法(基本上用1,因為比較快)
  在我們要抓包的頁(yè)面隨便copy出幾個(gè)字,在Respoinse中使用ctrl+f 查找,如果有找到,說(shuō)明我們找到的是對的 (我查找的是"和微軟粉絲談")
  
  2.把response中所有的內容復制到一個(gè)txt中,并改名為"#.html"(這里的#可以隨便取)
  然后打開(kāi)這個(gè)html,看看是否和我們要抓的一樣
  
  如果發(fā)現要找的不對,那你可以打開(kāi)下一個(gè)請求檢查下
  5.模擬發(fā)送
  點(diǎn)擊Headers
  可以看到請求的url是:
  方法是: GET
  requests headers 是(下圖中框出來(lái)的地方)
  
  所以我們的代碼應該是:
  import requests# 這里的headers就是我們上圖框中的headers
request_headers = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', ?
'Accept-Encoding':'gzip, deflate, sdch, br','Accept-Language':'zh-CN,zh;q=0.8','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'','Host':'www.zhihu.com','Referer':'https://www.zhihu.com/','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
#上圖中的url
url = "https://www.zhihu.com/people/e ... ot%3B
# 上圖中的請求方法(get)
z = requests.get(url,headers=request_headers)
print z.content
  這段代碼簡(jiǎn)單來(lái)說(shuō)就是把 我們抓包看到的用程序來(lái)實(shí)現
  一個(gè)小總結
  我們爬取一個(gè)網(wǎng)頁(yè)的步驟可以分為如下:
  打開(kāi)要爬取的網(wǎng)頁(yè)
  打開(kāi)開(kāi)發(fā)者工具,并讓請求重發(fā)一次(簡(jiǎn)單講就是抓包)
  找到正確的請求
  用程序模擬發(fā)送
  第二個(gè)案列:點(diǎn)贊
  1.打開(kāi)要爬取的網(wǎng)頁(yè) 查看全部

  爬蟲(chóng)入門(mén)到精通-網(wǎng)頁(yè)的下載
  
  本文章屬于爬蟲(chóng)入門(mén)到精通系統教程第四講
  在爬蟲(chóng)入門(mén)到精通第二講中,我們了解了HTTP協(xié)議
  #rd,那么我們現在使用這些協(xié)議來(lái)快速爬蟲(chóng)吧
  本文的目標
  當你看完本文后,你應該能爬?。◣缀酰┤魏蔚木W(wǎng)頁(yè)
  使用chrome抓包抓包(packet capture)就是將網(wǎng)絡(luò )傳輸發(fā)送與接收的數據包進(jìn)行截獲、重發(fā)、編輯、轉存等操作,也用來(lái)檢查網(wǎng)絡(luò )安全。抓包也經(jīng)常被用來(lái)進(jìn)行數據截取等。第一個(gè)案列:抓取輪子哥的動(dòng)態(tài)()
  1.打開(kāi)輪子哥動(dòng)態(tài)這個(gè)網(wǎng)頁(yè)
  
  2.打開(kāi)抓包工具
  應該會(huì )看到如下界面
  
  3.找到我們需要的請求
  可以看到如下截圖,里面有這么多的請求,那么到底哪一個(gè)才是我們需要的呢 ?
  
  這邊提供一個(gè)小技巧
  簡(jiǎn)單來(lái)講就是如果整個(gè)頁(yè)面沒(méi)有刷新的話(huà),那就是在XHR里面,否則在DOC里面
  因為本次抓包整個(gè)頁(yè)面有刷新,所以,我們需要找的請求在DOC下面,可以看到只有一個(gè)請求
  
  4.驗證請求是對的
  有以下兩種方法(基本上用1,因為比較快)
  在我們要抓包的頁(yè)面隨便copy出幾個(gè)字,在Respoinse中使用ctrl+f 查找,如果有找到,說(shuō)明我們找到的是對的 (我查找的是"和微軟粉絲談")
  
  2.把response中所有的內容復制到一個(gè)txt中,并改名為"#.html"(這里的#可以隨便取)
  然后打開(kāi)這個(gè)html,看看是否和我們要抓的一樣
  
  如果發(fā)現要找的不對,那你可以打開(kāi)下一個(gè)請求檢查下
  5.模擬發(fā)送
  點(diǎn)擊Headers
  可以看到請求的url是:
  方法是: GET
  requests headers 是(下圖中框出來(lái)的地方)
  
  所以我們的代碼應該是:
  import requests# 這里的headers就是我們上圖框中的headers
request_headers = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', ?
'Accept-Encoding':'gzip, deflate, sdch, br','Accept-Language':'zh-CN,zh;q=0.8','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'','Host':'www.zhihu.com','Referer':'https://www.zhihu.com/','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
#上圖中的url
url = "https://www.zhihu.com/people/e ... ot%3B
# 上圖中的請求方法(get)
z = requests.get(url,headers=request_headers)
print z.content
  這段代碼簡(jiǎn)單來(lái)說(shuō)就是把 我們抓包看到的用程序來(lái)實(shí)現
  一個(gè)小總結
  我們爬取一個(gè)網(wǎng)頁(yè)的步驟可以分為如下:
  打開(kāi)要爬取的網(wǎng)頁(yè)
  打開(kāi)開(kāi)發(fā)者工具,并讓請求重發(fā)一次(簡(jiǎn)單講就是抓包)
  找到正確的請求
  用程序模擬發(fā)送
  第二個(gè)案列:點(diǎn)贊
  1.打開(kāi)要爬取的網(wǎng)頁(yè)

淺談網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法和簡(jiǎn)單代碼實(shí)現

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 51 次瀏覽 ? 2022-05-05 06:12 ? 來(lái)自相關(guān)話(huà)題

  淺談網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法和簡(jiǎn)單代碼實(shí)現
  點(diǎn)擊上方“程序人生”,選擇“置頂公眾號”
  第一時(shí)間關(guān)注程序猿(媛)身邊的故事
  
  作者
  Python進(jìn)階者
  已獲原作者授權,如需轉載,請聯(lián)系原作者。
  我們今天要學(xué)習的內容,主要是給大家普及一下深度優(yōu)先算法的基本概念,詳情內容如下。
  學(xué)過(guò)網(wǎng)站設計的小伙伴們都知道網(wǎng)站通常都是分層進(jìn)行設計的,最上層的是頂級域名,之后是子域名,子域名下又有子域名等等,同時(shí),每個(gè)子域名可能還會(huì )擁有多個(gè)同級域名,而且URL之間可能還有相互鏈接,千姿百態(tài),由此構成一個(gè)復雜的網(wǎng)絡(luò )。
  
  當一個(gè)網(wǎng)站的URL非常多的時(shí)候,我們務(wù)必要設計好URL,否則在后期的理解、維護或者開(kāi)發(fā)過(guò)程中就會(huì )非常的混亂。理解以上的網(wǎng)頁(yè)結構設計之后,現在正式的引入網(wǎng)絡(luò )爬蟲(chóng)中的深度優(yōu)先算法。
  
  上圖是一個(gè)二叉樹(shù)結構,通過(guò)對這個(gè)二叉樹(shù)的遍歷,來(lái)類(lèi)比抓取網(wǎng)頁(yè),加深對爬蟲(chóng)策略的理解。深度優(yōu)先算法的主要思想是首先從頂級域名A開(kāi)始,之后從中提取出兩個(gè)鏈接B和C,待鏈接B抓取完成之后,下一個(gè)要抓取的鏈接則是D或者E,而不是說(shuō)抓取完成鏈接B之后,立馬去抓取鏈接C。抓取完鏈接D之后,發(fā)現鏈接D中所有的URL已經(jīng)被訪(fǎng)問(wèn)過(guò)了,在這之前我們已經(jīng)建立了一個(gè)被訪(fǎng)問(wèn)過(guò)的URL列表,專(zhuān)門(mén)用于存儲被訪(fǎng)問(wèn)過(guò)的URL。當鏈接D完全被抓取完成之后,接下來(lái)就會(huì )去抓取鏈接E。待鏈接E爬取完成之后,不會(huì )去爬取鏈接C,而是會(huì )繼續往下深入的去爬取鏈接I。原則就是鏈接會(huì )一步一步的往下爬,只要鏈接下還有子鏈接,且該子鏈接尚未被訪(fǎng)問(wèn)過(guò),這就是深度優(yōu)先算法的主要思想。深度優(yōu)先算法是讓爬蟲(chóng)一步一步往下進(jìn)行抓取完成之后,再一步一步退回來(lái),優(yōu)先考慮深度。理解好深度優(yōu)先算法之后,再來(lái)看上圖,可以得到該二叉樹(shù)呈現的爬蟲(chóng)抓取鏈接的順序依次為:A、B、D、E、I、C、F、G、H(這里假設左邊的鏈接先會(huì )被爬?。?。實(shí)際上,我們在做網(wǎng)絡(luò )爬蟲(chóng)過(guò)程中,很多時(shí)候都是在用這種算法進(jìn)行實(shí)現的,其實(shí)我們常用的Scrapy爬蟲(chóng)框架默認也是用該算法來(lái)進(jìn)行實(shí)現的。通過(guò)上面的理解,我們可以認為深度優(yōu)先算法本質(zhì)上是通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現的。
  下圖展示的是深度優(yōu)先算法的代碼實(shí)現過(guò)程。
  
  深度優(yōu)先過(guò)程實(shí)際上是通過(guò)一種遞歸的方式來(lái)進(jìn)行實(shí)現的??瓷蠄D的代碼,首先定義一個(gè)函數,用于實(shí)現深度優(yōu)先過(guò)程,然后傳入節點(diǎn)參數,如果該節點(diǎn)非空的話(huà),則將其打印出來(lái),可以類(lèi)比一下二叉樹(shù)中的頂級點(diǎn)A。將節點(diǎn)打印完成之后,看看其是否存在左節點(diǎn)(鏈接B)和右節點(diǎn)(鏈接C),如果左節點(diǎn)非空的話(huà),則將其進(jìn)行返回,再次調用深度優(yōu)先函數本身進(jìn)行遞歸,得到新的左節點(diǎn)(鏈接D)和右節點(diǎn)(鏈接E),以此類(lèi)推,直到所有的節點(diǎn)都被遍歷或者達到既定的條件才會(huì )停止。右節點(diǎn)的實(shí)現過(guò)程亦是如此,不再贅述。
  
  深度優(yōu)先過(guò)程通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現,當遞歸不斷進(jìn)行,沒(méi)有跳出遞歸或者遞歸太深的話(huà),很容易出現棧溢出的情況,所以在實(shí)際應用的過(guò)程中要有這個(gè)意識。
  深度優(yōu)先算法和廣度優(yōu)先算法是數據結構里邊非常重要的一種算法結構,也是非常常用的一種算法,而且在面試過(guò)程中也是非常常見(jiàn)的一道面試題,所以建議大家都需要掌握它,下一篇文章我們將介紹廣度優(yōu)先算法,敬請期待。
  
  關(guān)于網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法的簡(jiǎn)單介紹就到這里了,小伙伴們get到木有咧?
  - The End -
  「若你有原創(chuàng )文章想與大家分享,歡迎投稿?!?
  加編輯微信ID,備注#投稿#:
  程序 丨 druidlost
  小七 丨 duoshangshuang 查看全部

  淺談網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法和簡(jiǎn)單代碼實(shí)現
  點(diǎn)擊上方“程序人生”,選擇“置頂公眾號”
  第一時(shí)間關(guān)注程序猿(媛)身邊的故事
  
  作者
  Python進(jìn)階者
  已獲原作者授權,如需轉載,請聯(lián)系原作者。
  我們今天要學(xué)習的內容,主要是給大家普及一下深度優(yōu)先算法的基本概念,詳情內容如下。
  學(xué)過(guò)網(wǎng)站設計的小伙伴們都知道網(wǎng)站通常都是分層進(jìn)行設計的,最上層的是頂級域名,之后是子域名,子域名下又有子域名等等,同時(shí),每個(gè)子域名可能還會(huì )擁有多個(gè)同級域名,而且URL之間可能還有相互鏈接,千姿百態(tài),由此構成一個(gè)復雜的網(wǎng)絡(luò )。
  
  當一個(gè)網(wǎng)站的URL非常多的時(shí)候,我們務(wù)必要設計好URL,否則在后期的理解、維護或者開(kāi)發(fā)過(guò)程中就會(huì )非常的混亂。理解以上的網(wǎng)頁(yè)結構設計之后,現在正式的引入網(wǎng)絡(luò )爬蟲(chóng)中的深度優(yōu)先算法。
  
  上圖是一個(gè)二叉樹(shù)結構,通過(guò)對這個(gè)二叉樹(shù)的遍歷,來(lái)類(lèi)比抓取網(wǎng)頁(yè),加深對爬蟲(chóng)策略的理解。深度優(yōu)先算法的主要思想是首先從頂級域名A開(kāi)始,之后從中提取出兩個(gè)鏈接B和C,待鏈接B抓取完成之后,下一個(gè)要抓取的鏈接則是D或者E,而不是說(shuō)抓取完成鏈接B之后,立馬去抓取鏈接C。抓取完鏈接D之后,發(fā)現鏈接D中所有的URL已經(jīng)被訪(fǎng)問(wèn)過(guò)了,在這之前我們已經(jīng)建立了一個(gè)被訪(fǎng)問(wèn)過(guò)的URL列表,專(zhuān)門(mén)用于存儲被訪(fǎng)問(wèn)過(guò)的URL。當鏈接D完全被抓取完成之后,接下來(lái)就會(huì )去抓取鏈接E。待鏈接E爬取完成之后,不會(huì )去爬取鏈接C,而是會(huì )繼續往下深入的去爬取鏈接I。原則就是鏈接會(huì )一步一步的往下爬,只要鏈接下還有子鏈接,且該子鏈接尚未被訪(fǎng)問(wèn)過(guò),這就是深度優(yōu)先算法的主要思想。深度優(yōu)先算法是讓爬蟲(chóng)一步一步往下進(jìn)行抓取完成之后,再一步一步退回來(lái),優(yōu)先考慮深度。理解好深度優(yōu)先算法之后,再來(lái)看上圖,可以得到該二叉樹(shù)呈現的爬蟲(chóng)抓取鏈接的順序依次為:A、B、D、E、I、C、F、G、H(這里假設左邊的鏈接先會(huì )被爬?。?。實(shí)際上,我們在做網(wǎng)絡(luò )爬蟲(chóng)過(guò)程中,很多時(shí)候都是在用這種算法進(jìn)行實(shí)現的,其實(shí)我們常用的Scrapy爬蟲(chóng)框架默認也是用該算法來(lái)進(jìn)行實(shí)現的。通過(guò)上面的理解,我們可以認為深度優(yōu)先算法本質(zhì)上是通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現的。
  下圖展示的是深度優(yōu)先算法的代碼實(shí)現過(guò)程。
  
  深度優(yōu)先過(guò)程實(shí)際上是通過(guò)一種遞歸的方式來(lái)進(jìn)行實(shí)現的??瓷蠄D的代碼,首先定義一個(gè)函數,用于實(shí)現深度優(yōu)先過(guò)程,然后傳入節點(diǎn)參數,如果該節點(diǎn)非空的話(huà),則將其打印出來(lái),可以類(lèi)比一下二叉樹(shù)中的頂級點(diǎn)A。將節點(diǎn)打印完成之后,看看其是否存在左節點(diǎn)(鏈接B)和右節點(diǎn)(鏈接C),如果左節點(diǎn)非空的話(huà),則將其進(jìn)行返回,再次調用深度優(yōu)先函數本身進(jìn)行遞歸,得到新的左節點(diǎn)(鏈接D)和右節點(diǎn)(鏈接E),以此類(lèi)推,直到所有的節點(diǎn)都被遍歷或者達到既定的條件才會(huì )停止。右節點(diǎn)的實(shí)現過(guò)程亦是如此,不再贅述。
  
  深度優(yōu)先過(guò)程通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現,當遞歸不斷進(jìn)行,沒(méi)有跳出遞歸或者遞歸太深的話(huà),很容易出現棧溢出的情況,所以在實(shí)際應用的過(guò)程中要有這個(gè)意識。
  深度優(yōu)先算法和廣度優(yōu)先算法是數據結構里邊非常重要的一種算法結構,也是非常常用的一種算法,而且在面試過(guò)程中也是非常常見(jiàn)的一道面試題,所以建議大家都需要掌握它,下一篇文章我們將介紹廣度優(yōu)先算法,敬請期待。
  
  關(guān)于網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法的簡(jiǎn)單介紹就到這里了,小伙伴們get到木有咧?
  - The End -
  「若你有原創(chuàng )文章想與大家分享,歡迎投稿?!?
  加編輯微信ID,備注#投稿#:
  程序 丨 druidlost
  小七 丨 duoshangshuang

Python 編寫(xiě)知乎爬蟲(chóng)實(shí)踐

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 72 次瀏覽 ? 2022-05-05 06:09 ? 來(lái)自相關(guān)話(huà)題

  Python 編寫(xiě)知乎爬蟲(chóng)實(shí)踐
  點(diǎn)擊上方“Python開(kāi)發(fā)”,選擇“置頂公眾號”
  關(guān)鍵時(shí)刻,第一時(shí)間送達!
  
  爬蟲(chóng)的基本流程
  
  網(wǎng)絡(luò )爬蟲(chóng)的基本工作流程如下:
  爬蟲(chóng)的抓取策略
  在爬蟲(chóng)系統中,待抓取 URL 隊列是很重要的一部分。待抓取 URL 隊列中的 URL 以什么樣的順序排列也是一個(gè)很重要的問(wèn)題,因為這涉及到先抓取那個(gè)頁(yè)面,后抓取哪個(gè)頁(yè)面。而決定這些 URL 排列順序的方法,叫做抓取策略。下面重點(diǎn)介紹幾種常見(jiàn)的抓取策略:
  
  了解了爬蟲(chóng)的工作流程和爬取策略后,就可以動(dòng)手實(shí)現一個(gè)爬蟲(chóng)了!那么在 python 里怎么實(shí)現呢?
  技術(shù)?;緦?shí)現
  下面是一個(gè)偽代碼
  <p>import Queue
  initial_page = "https://www.zhihu.com/people/gaoming623"
  url_queue = Queue.Queue()
  seen = set()
  seen.insert(initial_page)
  url_queue.put(initial_page)
  while(True): #一直進(jìn)行
   ? ?if url_queue.size()>0:
   ? ? ? ?current_url = url_queue.get() ? ? ? ? ? ? ?#拿出隊例中第一個(gè)的 url
   ? ? ? ?store(current_url) ? ? ? ? ? ? ? ? ? ? ? ? #把這個(gè) url 代表的網(wǎng)頁(yè)存儲好
   ? ? ? ?for next_url in extract_urls(current_url): #提取把這個(gè) url 里鏈向的 url
   ? ? ? ? ? ?if next_url not in seen: ? ? ?
   ? ? ? ? ? ? ? ?seen.put(next_url)
   ? ? ? ? ? ? ? ?url_queue.put(next_url)
   ? ?else:
   ? ? ? ?break</p>
  如果你直接加工一下上面的代碼直接運行的話(huà),你需要很長(cháng)的時(shí)間才能爬下整個(gè)知乎用戶(hù)的信息,畢竟知乎有 6000 萬(wàn)月活躍用戶(hù)。更別說(shuō) Google 這樣的搜索引擎需要爬下全網(wǎng)的內容了。那么問(wèn)題出現在哪里?
  布隆過(guò)濾器
  需要爬的網(wǎng)頁(yè)實(shí)在太多太多了,而上面的代碼太慢太慢了。設想全網(wǎng)有 N 個(gè)網(wǎng)站,那么分析一下判重的復雜度就是 N*log(N),因為所有網(wǎng)頁(yè)要遍歷一次,而每次判重用 set 的話(huà)需要 log(N) 的復雜度。OK,我知道 python 的 set 實(shí)現是 hash——不過(guò)這樣還是太慢了,至少內存使用效率不高。
  通常的判重做法是怎樣呢?Bloom Filter. 簡(jiǎn)單講它仍然是一種 hash 的方法,但是它的特點(diǎn)是,它可以使用固定的內存(不隨 url 的數量而增長(cháng))以 O(1) 的效率判定 url 是否已經(jīng)在 set 中??上煜聸](méi)有白吃的午餐,它的唯一問(wèn)題在于,如果這個(gè) url 不在 set 中,BF 可以 100%確定這個(gè) url 沒(méi)有看過(guò)。但是如果這個(gè) url 在 set 中,它會(huì )告訴你:這個(gè) url 應該已經(jīng)出現過(guò),不過(guò)我有 2%的不確定性。注意這里的不確定性在你分配的內存足夠大的時(shí)候,可以變得很小很少。
  <p># bloom_filter.py
  BIT_SIZE = 5000000
  class BloomFilter:
   ? ?def __init__(self):
   ? ? ? ?# Initialize bloom filter, set size and all bits to 0
   ? ? ? ?bit_array = bitarray(BIT_SIZE)
   ? ? ? ?bit_array.setall(0)
   ? ? ? ?self.bit_array = bit_array
   ? ?def add(self, url):
   ? ? ? ?# Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.)
   ? ? ? ?# Here use 7 hash functions.
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?self.bit_array[b] = 1
   ? ?def contains(self, url):
   ? ? ? ?# Check if a url is in a collection
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?result = True
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?result = result and self.bit_array[b]
   ? ? ? ?return result
   ? ?def get_postions(self, url):
   ? ? ? ?# Get points positions in bit vector.
   ? ? ? ?point1 = mmh3.hash(url, 41) % BIT_SIZE
   ? ? ? ?point2 = mmh3.hash(url, 42) % BIT_SIZE
   ? ? ? ?point3 = mmh3.hash(url, 43) % BIT_SIZE
   ? ? ? ?point4 = mmh3.hash(url, 44) % BIT_SIZE
   ? ? ? ?point5 = mmh3.hash(url, 45) % BIT_SIZE
   ? ? ? ?point6 = mmh3.hash(url, 46) % BIT_SIZE
   ? ? ? ?point7 = mmh3.hash(url, 47) % BIT_SIZE
   ? ? ? ?return [point1, point2, point3, point4, point5, point6, point7]</p>
  BF 詳細的原理參考我之前寫(xiě)的文章:布隆過(guò)濾器(Bloom Filter) 的原理和實(shí)現
  建表
  用戶(hù)有價(jià)值的信息包括用戶(hù)名、簡(jiǎn)介、行業(yè)、院校、專(zhuān)業(yè)及在平臺上活動(dòng)的數據比如回答數、文章數、提問(wèn)數、粉絲數等等。
  用戶(hù)信息存儲的表結構如下:
  <p>CREATE DATABASE `zhihu_user` /*!40100 DEFAULT CHARACTER SET utf8 */;
  -- User base information table
  CREATE TABLE `t_user` (
   ?`uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   ?`username` varchar(50) NOT NULL COMMENT '用戶(hù)名', ? ? ? ? ? ? ? ? ? ? ?
   ?`brief_info` varchar(400) ?COMMENT '個(gè)人簡(jiǎn)介',
   ?`industry` varchar(50) COMMENT '所處行業(yè)', ? ? ? ? ? ?
   ?`education` varchar(50) COMMENT '畢業(yè)院校', ? ? ? ? ? ?
   ?`major` varchar(50) COMMENT '主修專(zhuān)業(yè)',
   ?`answer_count` int(10) unsigned DEFAULT 0 COMMENT '回答數',
   ?`article_count` int(10) unsigned DEFAULT 0 COMMENT '文章數',
   ?`ask_question_count` int(10) unsigned DEFAULT 0 COMMENT '提問(wèn)數',
   ?`collection_count` int(10) unsigned DEFAULT 0 COMMENT '收藏數',
   ?`follower_count` int(10) unsigned DEFAULT 0 COMMENT '被關(guān)注數',
   ?`followed_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注數',
   ?`follow_live_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注直播數',
   ?`follow_topic_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注話(huà)題數',
   ?`follow_column_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注專(zhuān)欄數',
   ?`follow_question_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注問(wèn)題數',
   ?`follow_collection_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注收藏夾數',
   ?`gmt_create` datetime NOT NULL COMMENT '創(chuàng )建時(shí)間', ?
   ?`gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次編輯', ? ? ? ? ? ?
   ?PRIMARY KEY (`uid`)
  ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶(hù)基本信息表';</p>
  網(wǎng)頁(yè)下載后通過(guò) XPath 進(jìn)行解析,提取用戶(hù)各個(gè)維度的數據,最后保存到數據庫中。
  反爬蟲(chóng)策略應對-Headers
  一般網(wǎng)站會(huì )從幾個(gè)維度來(lái)反爬蟲(chóng):用戶(hù)請求的 Headers,用戶(hù)行為,網(wǎng)站和數據加載的方式。從用戶(hù)請求的 Headers 反爬蟲(chóng)是最常見(jiàn)的策略,很多網(wǎng)站都會(huì )對 Headers 的 User-Agent 進(jìn)行檢測,還有一部分網(wǎng)站會(huì )對 Referer 進(jìn)行檢測(一些資源網(wǎng)站的防盜鏈就是檢測 Referer)。
  如果遇到了這類(lèi)反爬蟲(chóng)機制,可以直接在爬蟲(chóng)中添加 Headers,將瀏覽器的 User-Agent 復制到爬蟲(chóng)的 Headers 中;或者將 Referer 值修改為目標網(wǎng)站域名。對于檢測 Headers 的反爬蟲(chóng),在爬蟲(chóng)中修改或者添加 Headers 就能很好的繞過(guò)。
  <p>cookies = {
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"login": "NzM5ZDc2M2JkYzYwNDZlOGJlYWQ1YmI4OTg5NDhmMTY=|1480901173|9c296f424b32f241d1471203244eaf30729420f0",
   ? ?"n_c": "1",
   ? ?"q_c1": "395b12e529e541cbb400e9718395e346|1479808003000|1468847182000",
   ? ?"l_cap_id": "NzI0MTQwZGY2NjQyNDQ1NThmYTY0MjJhYmU2NmExMGY=|1480901160|2e7a7faee3b3e8d0afb550e8e7b38d86c15a31bc",
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"cap_id": "N2U1NmQwODQ1NjFiNGI2Yzg2YTE2NzJkOTU5N2E0NjI=|1480901160|fd59e2ed79faacc2be1010687d27dd559ec1552a"
  }
  headers = {
   ? ?"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.3",
   ? ?"Referer": "https://www.zhihu.com/"
  }
  r = requests.get(url, cookies = cookies, headers = headers)</p>
  反爬蟲(chóng)策略應對-代理 IP 池
  還有一部分網(wǎng)站是通過(guò)檢測用戶(hù)行為,例如同一 IP 短時(shí)間內多次訪(fǎng)問(wèn)同一頁(yè)面,或者同一賬戶(hù)短時(shí)間內多次進(jìn)行相同操作。
  大多數網(wǎng)站都是前一種情況,對于這種情況,使用 IP 代理就可以解決。這樣的代理 ip 爬蟲(chóng)經(jīng)常會(huì )用到,最好自己準備一個(gè)。有了大量代理 ip 后可以每請求幾次更換一個(gè) ip,這在 requests 或者 urllib2 中很容易做到,這樣就能很容易的繞過(guò)第一種反爬蟲(chóng)。目前知乎已經(jīng)對爬蟲(chóng)做了限制,如果是單個(gè) IP 的話(huà),一段時(shí)間系統便會(huì )提示異常流量,無(wú)法繼續爬取了。因此代理 IP 池非常關(guān)鍵。網(wǎng)上有個(gè)免費的代理 IP API:
  <p>import requests
  import random
  class Proxy:
   ? ?def __init__(self):
   ? ? ? ?self.cache_ip_list = []
   ? ?# Get random ip from free proxy api url.
   ? ?def get_random_ip(self):
   ? ? ? ?if not len(self.cache_ip_list):
   ? ? ? ? ? ?api_url = 'http://api.xicidaili.com/free2016.txt'
   ? ? ? ? ? ?try:
   ? ? ? ? ? ? ? ?r = requests.get(api_url)
   ? ? ? ? ? ? ? ?ip_list = r.text.split('rn')
   ? ? ? ? ? ? ? ?self.cache_ip_list = ip_list
   ? ? ? ? ? ?except Exception as e:
   ? ? ? ? ? ? ? ?# Return null list when caught exception.
   ? ? ? ? ? ? ? ?# In this case, crawler will not use proxy ip.
   ? ? ? ? ? ? ? ?print e
   ? ? ? ? ? ? ? ?return {}
   ? ? ? ?proxy_ip = random.choice(self.cache_ip_list)
   ? ? ? ?proxies = {'http': 'http://' ? proxy_ip}
   ? ? ? ?return proxies</p>
  后續
  爬蟲(chóng)源代碼:zhihu-crawler下載之后通過(guò) pip 安裝相關(guān)三方包后,運行$ python crawler.py 即可(喜歡的幫忙點(diǎn)個(gè) star 哈,同時(shí)也方便看到后續功能的更新)
  運行截圖:
  
   查看全部

  Python 編寫(xiě)知乎爬蟲(chóng)實(shí)踐
  點(diǎn)擊上方“Python開(kāi)發(fā)”,選擇“置頂公眾號”
  關(guān)鍵時(shí)刻,第一時(shí)間送達!
  
  爬蟲(chóng)的基本流程
  
  網(wǎng)絡(luò )爬蟲(chóng)的基本工作流程如下:
  爬蟲(chóng)的抓取策略
  在爬蟲(chóng)系統中,待抓取 URL 隊列是很重要的一部分。待抓取 URL 隊列中的 URL 以什么樣的順序排列也是一個(gè)很重要的問(wèn)題,因為這涉及到先抓取那個(gè)頁(yè)面,后抓取哪個(gè)頁(yè)面。而決定這些 URL 排列順序的方法,叫做抓取策略。下面重點(diǎn)介紹幾種常見(jiàn)的抓取策略:
  
  了解了爬蟲(chóng)的工作流程和爬取策略后,就可以動(dòng)手實(shí)現一個(gè)爬蟲(chóng)了!那么在 python 里怎么實(shí)現呢?
  技術(shù)?;緦?shí)現
  下面是一個(gè)偽代碼
  <p>import Queue
  initial_page = "https://www.zhihu.com/people/gaoming623"
  url_queue = Queue.Queue()
  seen = set()
  seen.insert(initial_page)
  url_queue.put(initial_page)
  while(True): #一直進(jìn)行
   ? ?if url_queue.size()>0:
   ? ? ? ?current_url = url_queue.get() ? ? ? ? ? ? ?#拿出隊例中第一個(gè)的 url
   ? ? ? ?store(current_url) ? ? ? ? ? ? ? ? ? ? ? ? #把這個(gè) url 代表的網(wǎng)頁(yè)存儲好
   ? ? ? ?for next_url in extract_urls(current_url): #提取把這個(gè) url 里鏈向的 url
   ? ? ? ? ? ?if next_url not in seen: ? ? ?
   ? ? ? ? ? ? ? ?seen.put(next_url)
   ? ? ? ? ? ? ? ?url_queue.put(next_url)
   ? ?else:
   ? ? ? ?break</p>
  如果你直接加工一下上面的代碼直接運行的話(huà),你需要很長(cháng)的時(shí)間才能爬下整個(gè)知乎用戶(hù)的信息,畢竟知乎有 6000 萬(wàn)月活躍用戶(hù)。更別說(shuō) Google 這樣的搜索引擎需要爬下全網(wǎng)的內容了。那么問(wèn)題出現在哪里?
  布隆過(guò)濾器
  需要爬的網(wǎng)頁(yè)實(shí)在太多太多了,而上面的代碼太慢太慢了。設想全網(wǎng)有 N 個(gè)網(wǎng)站,那么分析一下判重的復雜度就是 N*log(N),因為所有網(wǎng)頁(yè)要遍歷一次,而每次判重用 set 的話(huà)需要 log(N) 的復雜度。OK,我知道 python 的 set 實(shí)現是 hash——不過(guò)這樣還是太慢了,至少內存使用效率不高。
  通常的判重做法是怎樣呢?Bloom Filter. 簡(jiǎn)單講它仍然是一種 hash 的方法,但是它的特點(diǎn)是,它可以使用固定的內存(不隨 url 的數量而增長(cháng))以 O(1) 的效率判定 url 是否已經(jīng)在 set 中??上煜聸](méi)有白吃的午餐,它的唯一問(wèn)題在于,如果這個(gè) url 不在 set 中,BF 可以 100%確定這個(gè) url 沒(méi)有看過(guò)。但是如果這個(gè) url 在 set 中,它會(huì )告訴你:這個(gè) url 應該已經(jīng)出現過(guò),不過(guò)我有 2%的不確定性。注意這里的不確定性在你分配的內存足夠大的時(shí)候,可以變得很小很少。
  <p># bloom_filter.py
  BIT_SIZE = 5000000
  class BloomFilter:
   ? ?def __init__(self):
   ? ? ? ?# Initialize bloom filter, set size and all bits to 0
   ? ? ? ?bit_array = bitarray(BIT_SIZE)
   ? ? ? ?bit_array.setall(0)
   ? ? ? ?self.bit_array = bit_array
   ? ?def add(self, url):
   ? ? ? ?# Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.)
   ? ? ? ?# Here use 7 hash functions.
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?self.bit_array[b] = 1
   ? ?def contains(self, url):
   ? ? ? ?# Check if a url is in a collection
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?result = True
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?result = result and self.bit_array[b]
   ? ? ? ?return result
   ? ?def get_postions(self, url):
   ? ? ? ?# Get points positions in bit vector.
   ? ? ? ?point1 = mmh3.hash(url, 41) % BIT_SIZE
   ? ? ? ?point2 = mmh3.hash(url, 42) % BIT_SIZE
   ? ? ? ?point3 = mmh3.hash(url, 43) % BIT_SIZE
   ? ? ? ?point4 = mmh3.hash(url, 44) % BIT_SIZE
   ? ? ? ?point5 = mmh3.hash(url, 45) % BIT_SIZE
   ? ? ? ?point6 = mmh3.hash(url, 46) % BIT_SIZE
   ? ? ? ?point7 = mmh3.hash(url, 47) % BIT_SIZE
   ? ? ? ?return [point1, point2, point3, point4, point5, point6, point7]</p>
  BF 詳細的原理參考我之前寫(xiě)的文章:布隆過(guò)濾器(Bloom Filter) 的原理和實(shí)現
  建表
  用戶(hù)有價(jià)值的信息包括用戶(hù)名、簡(jiǎn)介、行業(yè)、院校、專(zhuān)業(yè)及在平臺上活動(dòng)的數據比如回答數、文章數、提問(wèn)數、粉絲數等等。
  用戶(hù)信息存儲的表結構如下:
  <p>CREATE DATABASE `zhihu_user` /*!40100 DEFAULT CHARACTER SET utf8 */;
  -- User base information table
  CREATE TABLE `t_user` (
   ?`uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   ?`username` varchar(50) NOT NULL COMMENT '用戶(hù)名', ? ? ? ? ? ? ? ? ? ? ?
   ?`brief_info` varchar(400) ?COMMENT '個(gè)人簡(jiǎn)介',
   ?`industry` varchar(50) COMMENT '所處行業(yè)', ? ? ? ? ? ?
   ?`education` varchar(50) COMMENT '畢業(yè)院校', ? ? ? ? ? ?
   ?`major` varchar(50) COMMENT '主修專(zhuān)業(yè)',
   ?`answer_count` int(10) unsigned DEFAULT 0 COMMENT '回答數',
   ?`article_count` int(10) unsigned DEFAULT 0 COMMENT '文章數',
   ?`ask_question_count` int(10) unsigned DEFAULT 0 COMMENT '提問(wèn)數',
   ?`collection_count` int(10) unsigned DEFAULT 0 COMMENT '收藏數',
   ?`follower_count` int(10) unsigned DEFAULT 0 COMMENT '被關(guān)注數',
   ?`followed_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注數',
   ?`follow_live_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注直播數',
   ?`follow_topic_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注話(huà)題數',
   ?`follow_column_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注專(zhuān)欄數',
   ?`follow_question_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注問(wèn)題數',
   ?`follow_collection_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注收藏夾數',
   ?`gmt_create` datetime NOT NULL COMMENT '創(chuàng )建時(shí)間', ?
   ?`gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次編輯', ? ? ? ? ? ?
   ?PRIMARY KEY (`uid`)
  ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶(hù)基本信息表';</p>
  網(wǎng)頁(yè)下載后通過(guò) XPath 進(jìn)行解析,提取用戶(hù)各個(gè)維度的數據,最后保存到數據庫中。
  反爬蟲(chóng)策略應對-Headers
  一般網(wǎng)站會(huì )從幾個(gè)維度來(lái)反爬蟲(chóng):用戶(hù)請求的 Headers,用戶(hù)行為,網(wǎng)站和數據加載的方式。從用戶(hù)請求的 Headers 反爬蟲(chóng)是最常見(jiàn)的策略,很多網(wǎng)站都會(huì )對 Headers 的 User-Agent 進(jìn)行檢測,還有一部分網(wǎng)站會(huì )對 Referer 進(jìn)行檢測(一些資源網(wǎng)站的防盜鏈就是檢測 Referer)。
  如果遇到了這類(lèi)反爬蟲(chóng)機制,可以直接在爬蟲(chóng)中添加 Headers,將瀏覽器的 User-Agent 復制到爬蟲(chóng)的 Headers 中;或者將 Referer 值修改為目標網(wǎng)站域名。對于檢測 Headers 的反爬蟲(chóng),在爬蟲(chóng)中修改或者添加 Headers 就能很好的繞過(guò)。
  <p>cookies = {
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"login": "NzM5ZDc2M2JkYzYwNDZlOGJlYWQ1YmI4OTg5NDhmMTY=|1480901173|9c296f424b32f241d1471203244eaf30729420f0",
   ? ?"n_c": "1",
   ? ?"q_c1": "395b12e529e541cbb400e9718395e346|1479808003000|1468847182000",
   ? ?"l_cap_id": "NzI0MTQwZGY2NjQyNDQ1NThmYTY0MjJhYmU2NmExMGY=|1480901160|2e7a7faee3b3e8d0afb550e8e7b38d86c15a31bc",
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"cap_id": "N2U1NmQwODQ1NjFiNGI2Yzg2YTE2NzJkOTU5N2E0NjI=|1480901160|fd59e2ed79faacc2be1010687d27dd559ec1552a"
  }
  headers = {
   ? ?"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.3",
   ? ?"Referer": "https://www.zhihu.com/"
  }
  r = requests.get(url, cookies = cookies, headers = headers)</p>
  反爬蟲(chóng)策略應對-代理 IP 池
  還有一部分網(wǎng)站是通過(guò)檢測用戶(hù)行為,例如同一 IP 短時(shí)間內多次訪(fǎng)問(wèn)同一頁(yè)面,或者同一賬戶(hù)短時(shí)間內多次進(jìn)行相同操作。
  大多數網(wǎng)站都是前一種情況,對于這種情況,使用 IP 代理就可以解決。這樣的代理 ip 爬蟲(chóng)經(jīng)常會(huì )用到,最好自己準備一個(gè)。有了大量代理 ip 后可以每請求幾次更換一個(gè) ip,這在 requests 或者 urllib2 中很容易做到,這樣就能很容易的繞過(guò)第一種反爬蟲(chóng)。目前知乎已經(jīng)對爬蟲(chóng)做了限制,如果是單個(gè) IP 的話(huà),一段時(shí)間系統便會(huì )提示異常流量,無(wú)法繼續爬取了。因此代理 IP 池非常關(guān)鍵。網(wǎng)上有個(gè)免費的代理 IP API:
  <p>import requests
  import random
  class Proxy:
   ? ?def __init__(self):
   ? ? ? ?self.cache_ip_list = []
   ? ?# Get random ip from free proxy api url.
   ? ?def get_random_ip(self):
   ? ? ? ?if not len(self.cache_ip_list):
   ? ? ? ? ? ?api_url = 'http://api.xicidaili.com/free2016.txt'
   ? ? ? ? ? ?try:
   ? ? ? ? ? ? ? ?r = requests.get(api_url)
   ? ? ? ? ? ? ? ?ip_list = r.text.split('rn')
   ? ? ? ? ? ? ? ?self.cache_ip_list = ip_list
   ? ? ? ? ? ?except Exception as e:
   ? ? ? ? ? ? ? ?# Return null list when caught exception.
   ? ? ? ? ? ? ? ?# In this case, crawler will not use proxy ip.
   ? ? ? ? ? ? ? ?print e
   ? ? ? ? ? ? ? ?return {}
   ? ? ? ?proxy_ip = random.choice(self.cache_ip_list)
   ? ? ? ?proxies = {'http': 'http://' ? proxy_ip}
   ? ? ? ?return proxies</p>
  后續
  爬蟲(chóng)源代碼:zhihu-crawler下載之后通過(guò) pip 安裝相關(guān)三方包后,運行$ python crawler.py 即可(喜歡的幫忙點(diǎn)個(gè) star 哈,同時(shí)也方便看到后續功能的更新)
  運行截圖:
  
  

多種爬蟲(chóng)方式對比

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-05-01 06:11 ? 來(lái)自相關(guān)話(huà)題

  多種爬蟲(chóng)方式對比
  Python爬蟲(chóng)的方式有多種,從爬蟲(chóng)框架到解析提取,再到數據存儲,各階段都有不同的手段和類(lèi)庫支持。雖然不能一概而論哪種方式一定更好,畢竟不同案例需求和不同應用場(chǎng)景會(huì )綜合決定采取哪種方式,但對比之下還是會(huì )有很大差距。
  00 概況
  以安居客杭州二手房信息為爬蟲(chóng)需求,分別對比實(shí)驗了三種爬蟲(chóng)框架、三種字段解析方式和三種數據存儲方式,旨在全方面對比各種爬蟲(chóng)方式的效率高低。
  安居客平臺沒(méi)有太強的反爬措施,只要添加headers模擬頭即可完美爬取,而且不用考慮爬蟲(chóng)過(guò)快的問(wèn)題。選中杭州二手房之后,很容易發(fā)現url的變化規律。值得說(shuō)明的是平臺最大開(kāi)放50頁(yè)房源信息,每頁(yè)60條。為使爬蟲(chóng)簡(jiǎn)單便于對比,我們只爬取房源列表頁(yè)的概要信息,而不再進(jìn)入房源詳情頁(yè)進(jìn)行具體信息的爬取,共3000條記錄,每條記錄包括10個(gè)字段:標題,戶(hù)型,面積,樓層,建筑年份,小區/地址,售賣(mài)標簽,中介,單價(jià),總價(jià)。
  01 3種爬蟲(chóng)框架
  1.常規爬蟲(chóng)
  實(shí)現3個(gè)函數,分別用于解析網(wǎng)頁(yè)、存儲信息,以及二者的聯(lián)合調用。在主程序中,用一個(gè)常規的循環(huán)語(yǔ)句逐頁(yè)解析。
  import?requests<br />from?lxml?import?etree<br />import?pymysql<br />import?time<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????#常規單線(xiàn)程爬取<br />????for?url?in?urls:<br />????????getANDsave(url)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)64.9秒。
  2.Scrapy框架
  Scrapy框架是一個(gè)常用的爬蟲(chóng)框架,非常好用,只需要簡(jiǎn)單實(shí)現核心抓取和存儲功能即可,而無(wú)需關(guān)注內部信息流轉,而且框架自帶多線(xiàn)程和異常處理能力。
  class?anjukeSpider(scrapy.Spider):<br />????name?=?'anjuke'<br />????allowed_domains?=?['anjuke.com']<br />????start_urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,?51)]<br /><br />????def?parse(self,?response):<br />????????pass<br />????????yield?item<br />
  耗時(shí)14.4秒。
  3.多線(xiàn)程爬蟲(chóng)
  對于爬蟲(chóng)這種IO密集型任務(wù)來(lái)說(shuō),多線(xiàn)程可明顯提升效率。實(shí)現多線(xiàn)程python的方式有多種,這里我們應用concurrent的futures模塊,并設置最大線(xiàn)程數為8。
  from?concurrent.futures?import?ThreadPoolExecutor,?wait,?ALL_COMPLETED<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????executor?=?ThreadPoolExecutor(max_workers=8)<br />????future_tasks?=?[executor.submit(getANDsave,?url)?for?url?in?urls]<br />????wait(future_tasks,?return_when?=?ALL_COMPLETED)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)8.1秒。
  對比來(lái)看,多線(xiàn)程爬蟲(chóng)方案耗時(shí)最短,相比常規爬蟲(chóng)而言能帶來(lái)數倍的效率提升,Scrapy爬蟲(chóng)也取得了不俗的表現。需要指出的是,這里3種框架都采用了Xpath解析和MySQL存儲。
  02 3種解析方式
  在明確爬蟲(chóng)框架的基礎上,如何對字段進(jìn)行解析提取就是第二個(gè)需要考慮的問(wèn)題,常用的解析方式有3種,一般而言,論解析效率Re&gt;=Xpath&gt;Bs4;論難易程度,Bs4則最為簡(jiǎn)單易懂。
  因為前面已經(jīng)對比得知,多線(xiàn)程爬蟲(chóng)有著(zhù)最好的執行效率,我們以此為基礎,對比3種不同解析方式,解析函數分別為:
  1. Xpath
  from lxml import etreedef?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?etree.HTML(html)<br />????items?=?html.xpath("//li[@class?=?'list-item']")<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.xpath(".//div[@class='house-title']/a/text()")[0].strip()<br />????????????houseType?=?item.xpath(".//div[@class='house-details']/div[2]/span[1]/text()")[0]<br />????????????area?=?item.xpath(".//div[@class='house-details']/div[2]/span[2]/text()")[0]<br />????????????floor?=?item.xpath(".//div[@class='house-details']/div[2]/span[3]/text()")[0]<br />????????????buildYear?=?item.xpath(".//div[@class='house-details']/div[2]/span[4]/text()")[0]<br />????????????adrres?=?item.xpath(".//div[@class='house-details']/div[3]/span[1]/text()")[0]<br />????????????adrres?=?"|".join(adrres.split())<br />????????????tags?=?item.xpath(".//div[@class='tags-bottom']//text()")<br />????????????tags?=?'|'.join(tags).strip()<br />????????????broker?=?item.xpath(".//div[@class='broker-item']/span[2]/text()")[0]<br />????????????totalPrice?=?item.xpath(".//div[@class='pro-price']/span[1]//text()")<br />????????????totalPrice?=?"".join(totalPrice).strip()<br />????????????price?=?item.xpath(".//div[@class='pro-price']/span[2]/text()")[0]<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)8.1秒。
  2. Re
  import re<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?html.replace('\n','')<br />????pattern?=?r'.*?'<br />????results?=?re.compile(pattern).findall(html)##先編譯,再正則匹配<br />????infos?=?[]<br />????for?result?in?results:?<br />????????values?=?['']*10<br />????????titles?=?re.compile('title="(.*?)"').findall(result)<br />????????values[0]?=?titles[0]<br />????????values[5]?=?titles[1].replace('&nbsp;','')<br />????????spans?=?re.compile('(.*?)|(.*?)|(.*?)|(.*?)').findall(result)<br />????????values[1]?=''.join(spans[0])<br />????????values[2]?=?''.join(spans[1])<br />????????values[3]?=?''.join(spans[2])<br />????????values[4]?=?''.join(spans[3])<br />????????values[7]?=?re.compile('(.*?)').findall(result)[0]<br />????????tagRE?=?re.compile('(.*?)').findall(result)<br />????????if?tagRE:<br />????????????values[6]?=?'|'.join(tagRE)<br />????????values[8]?=?re.compile('(.*?)萬(wàn)').findall(result)[0]+'萬(wàn)'<br />????????values[9]?=?re.compile('(.*?)').findall(result)[0]<br />????????infos.append(tuple(values))<br /><br />????return?infos<br />
  耗時(shí)8.6秒。
  3. Bs4
  from?bs4?import?BeautifulSoup<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????soup?=?BeautifulSoup(html,?"html.parser")<br />????items?=?soup.find_all('li',?attrs={'class':?"list-item"})<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.find('a',?attrs={'class':?"houseListTitle"}).get_text().strip()<br />????????????details?=?item.find_all('div',attrs={'class':?"details-item"})[0]<br />????????????houseType?=?details.find_all('span')[0].get_text().strip()<br />????????????area?=?details.find_all('span')[1].get_text().strip()<br />????????????floor?=?details.find_all('span')[2].get_text().strip()<br />????????????buildYear?=?details.find_all('span')[3].get_text().strip()<br />????????????addres?=?item.find_all('div',attrs={'class':?"details-item"})[1].get_text().replace('?','').replace('\n','')<br />????????????tag_spans?=?item.find('div',?attrs={'class':'tags-bottom'}).find_all('span')<br />????????????tags?=?[span.get_text()?for?span?in?tag_spans]<br />????????????tags?=?'|'.join(tags)<br />????????????broker?=?item.find('span',attrs={'class':'broker-name?broker-text'}).get_text().strip()<br />????????????totalPrice?=?item.find('span',attrs={'class':'price-det'}).get_text()<br />????????????price?=?item.find('span',attrs={'class':'unit-price'}).get_text()<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?addres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)23.2秒。
  Xpath和Re執行效率相當,Xpath甚至要略勝一籌,Bs4效率要明顯低于前兩者(此案例中,相當遠前兩者效率的1/3),但寫(xiě)起來(lái)則最為容易。
  03 存儲方式
  在完成爬蟲(chóng)數據解析后,一般都要將數據進(jìn)行本地存儲,方便后續使用。小型數據量時(shí)可以選用本地文件存儲,例如CSV、txt或者json文件;當數據量較大時(shí),則一般需采用數據庫存儲,這里,我們分別選用關(guān)系型數據庫的代表MySQL和文本型數據庫的代表MongoDB加入對比。
  1. MySQL
  import?pymysql<br /><br />def?save_info(infos):<br />????#####infos為列表形式,其中列表中每個(gè)元素為一個(gè)元組,包含10個(gè)字段<br />????db=?pymysql.connect(host="localhost",user="root",password="123456",db="ajkhzesf")<br />????sql_insert?=?'insert?into?hzesfmulti8(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)?values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'<br />????cursor?=?db.cursor()<br />????cursor.executemany(sql_insert,?infos)<br />????db.commit()<br />
  耗時(shí)8.1秒。
  2. MongoDB
  import?pymongo<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)字典,包括10個(gè)字段<br />????client?=?pymongo.MongoClient()<br />????collection?=?client.anjuke.hzesfmulti<br />????collection.insert_many(infos)<br />????client.close()<br />
  耗時(shí)8.4秒。
  3. CSV文件
  import?csv<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)列表,包括10個(gè)字段<br />????with?open(r"D:\PyFile\HZhouse\anjuke.csv",?'a',?encoding='gb18030',?newline="")?as?f:<br />????????writer?=?csv.writer(f)<br />????????writer.writerows(infos)<br />
  耗時(shí)8.8秒。
  可見(jiàn),在爬蟲(chóng)框架和解析方式一致的前提下,不同存儲方式間并不會(huì )帶來(lái)太大效率上的差異。
  04 結論
  
  不同爬蟲(chóng)執行效率對比
  易見(jiàn),爬蟲(chóng)框架對耗時(shí)影響最大,甚至可帶來(lái)數倍的效率提升;解析數據方式也會(huì )帶來(lái)較大影響,而數據存儲方式則不存在太大差異。
  對此,個(gè)人認為可以這樣理解:類(lèi)似于把大象裝冰箱需要3步,爬蟲(chóng)也需要3步:
  其中,爬取網(wǎng)頁(yè)源碼最為耗時(shí),這不僅取決于你的爬蟲(chóng)框架和網(wǎng)絡(luò )負載,還受限于目標網(wǎng)站的響應速度和反爬措施;信息解析其次,而數據存儲則最為迅速,尤其是在磁盤(pán)讀取速度飛快的今天,無(wú)論是簡(jiǎn)單的文件寫(xiě)入還是數據庫存儲,都不會(huì )帶來(lái)太大的時(shí)間差異。 查看全部

  多種爬蟲(chóng)方式對比
  Python爬蟲(chóng)的方式有多種,從爬蟲(chóng)框架到解析提取,再到數據存儲,各階段都有不同的手段和類(lèi)庫支持。雖然不能一概而論哪種方式一定更好,畢竟不同案例需求和不同應用場(chǎng)景會(huì )綜合決定采取哪種方式,但對比之下還是會(huì )有很大差距。
  00 概況
  以安居客杭州二手房信息為爬蟲(chóng)需求,分別對比實(shí)驗了三種爬蟲(chóng)框架、三種字段解析方式和三種數據存儲方式,旨在全方面對比各種爬蟲(chóng)方式的效率高低。
  安居客平臺沒(méi)有太強的反爬措施,只要添加headers模擬頭即可完美爬取,而且不用考慮爬蟲(chóng)過(guò)快的問(wèn)題。選中杭州二手房之后,很容易發(fā)現url的變化規律。值得說(shuō)明的是平臺最大開(kāi)放50頁(yè)房源信息,每頁(yè)60條。為使爬蟲(chóng)簡(jiǎn)單便于對比,我們只爬取房源列表頁(yè)的概要信息,而不再進(jìn)入房源詳情頁(yè)進(jìn)行具體信息的爬取,共3000條記錄,每條記錄包括10個(gè)字段:標題,戶(hù)型,面積,樓層,建筑年份,小區/地址,售賣(mài)標簽,中介,單價(jià),總價(jià)。
  01 3種爬蟲(chóng)框架
  1.常規爬蟲(chóng)
  實(shí)現3個(gè)函數,分別用于解析網(wǎng)頁(yè)、存儲信息,以及二者的聯(lián)合調用。在主程序中,用一個(gè)常規的循環(huán)語(yǔ)句逐頁(yè)解析。
  import?requests<br />from?lxml?import?etree<br />import?pymysql<br />import?time<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????#常規單線(xiàn)程爬取<br />????for?url?in?urls:<br />????????getANDsave(url)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)64.9秒。
  2.Scrapy框架
  Scrapy框架是一個(gè)常用的爬蟲(chóng)框架,非常好用,只需要簡(jiǎn)單實(shí)現核心抓取和存儲功能即可,而無(wú)需關(guān)注內部信息流轉,而且框架自帶多線(xiàn)程和異常處理能力。
  class?anjukeSpider(scrapy.Spider):<br />????name?=?'anjuke'<br />????allowed_domains?=?['anjuke.com']<br />????start_urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,?51)]<br /><br />????def?parse(self,?response):<br />????????pass<br />????????yield?item<br />
  耗時(shí)14.4秒。
  3.多線(xiàn)程爬蟲(chóng)
  對于爬蟲(chóng)這種IO密集型任務(wù)來(lái)說(shuō),多線(xiàn)程可明顯提升效率。實(shí)現多線(xiàn)程python的方式有多種,這里我們應用concurrent的futures模塊,并設置最大線(xiàn)程數為8。
  from?concurrent.futures?import?ThreadPoolExecutor,?wait,?ALL_COMPLETED<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????executor?=?ThreadPoolExecutor(max_workers=8)<br />????future_tasks?=?[executor.submit(getANDsave,?url)?for?url?in?urls]<br />????wait(future_tasks,?return_when?=?ALL_COMPLETED)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)8.1秒。
  對比來(lái)看,多線(xiàn)程爬蟲(chóng)方案耗時(shí)最短,相比常規爬蟲(chóng)而言能帶來(lái)數倍的效率提升,Scrapy爬蟲(chóng)也取得了不俗的表現。需要指出的是,這里3種框架都采用了Xpath解析和MySQL存儲。
  02 3種解析方式
  在明確爬蟲(chóng)框架的基礎上,如何對字段進(jìn)行解析提取就是第二個(gè)需要考慮的問(wèn)題,常用的解析方式有3種,一般而言,論解析效率Re&gt;=Xpath&gt;Bs4;論難易程度,Bs4則最為簡(jiǎn)單易懂。
  因為前面已經(jīng)對比得知,多線(xiàn)程爬蟲(chóng)有著(zhù)最好的執行效率,我們以此為基礎,對比3種不同解析方式,解析函數分別為:
  1. Xpath
  from lxml import etreedef?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?etree.HTML(html)<br />????items?=?html.xpath("//li[@class?=?'list-item']")<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.xpath(".//div[@class='house-title']/a/text()")[0].strip()<br />????????????houseType?=?item.xpath(".//div[@class='house-details']/div[2]/span[1]/text()")[0]<br />????????????area?=?item.xpath(".//div[@class='house-details']/div[2]/span[2]/text()")[0]<br />????????????floor?=?item.xpath(".//div[@class='house-details']/div[2]/span[3]/text()")[0]<br />????????????buildYear?=?item.xpath(".//div[@class='house-details']/div[2]/span[4]/text()")[0]<br />????????????adrres?=?item.xpath(".//div[@class='house-details']/div[3]/span[1]/text()")[0]<br />????????????adrres?=?"|".join(adrres.split())<br />????????????tags?=?item.xpath(".//div[@class='tags-bottom']//text()")<br />????????????tags?=?'|'.join(tags).strip()<br />????????????broker?=?item.xpath(".//div[@class='broker-item']/span[2]/text()")[0]<br />????????????totalPrice?=?item.xpath(".//div[@class='pro-price']/span[1]//text()")<br />????????????totalPrice?=?"".join(totalPrice).strip()<br />????????????price?=?item.xpath(".//div[@class='pro-price']/span[2]/text()")[0]<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)8.1秒。
  2. Re
  import re<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?html.replace('\n','')<br />????pattern?=?r'.*?'<br />????results?=?re.compile(pattern).findall(html)##先編譯,再正則匹配<br />????infos?=?[]<br />????for?result?in?results:?<br />????????values?=?['']*10<br />????????titles?=?re.compile('title="(.*?)"').findall(result)<br />????????values[0]?=?titles[0]<br />????????values[5]?=?titles[1].replace('&nbsp;','')<br />????????spans?=?re.compile('(.*?)|(.*?)|(.*?)|(.*?)').findall(result)<br />????????values[1]?=''.join(spans[0])<br />????????values[2]?=?''.join(spans[1])<br />????????values[3]?=?''.join(spans[2])<br />????????values[4]?=?''.join(spans[3])<br />????????values[7]?=?re.compile('(.*?)').findall(result)[0]<br />????????tagRE?=?re.compile('(.*?)').findall(result)<br />????????if?tagRE:<br />????????????values[6]?=?'|'.join(tagRE)<br />????????values[8]?=?re.compile('(.*?)萬(wàn)').findall(result)[0]+'萬(wàn)'<br />????????values[9]?=?re.compile('(.*?)').findall(result)[0]<br />????????infos.append(tuple(values))<br /><br />????return?infos<br />
  耗時(shí)8.6秒。
  3. Bs4
  from?bs4?import?BeautifulSoup<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????soup?=?BeautifulSoup(html,?"html.parser")<br />????items?=?soup.find_all('li',?attrs={'class':?"list-item"})<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.find('a',?attrs={'class':?"houseListTitle"}).get_text().strip()<br />????????????details?=?item.find_all('div',attrs={'class':?"details-item"})[0]<br />????????????houseType?=?details.find_all('span')[0].get_text().strip()<br />????????????area?=?details.find_all('span')[1].get_text().strip()<br />????????????floor?=?details.find_all('span')[2].get_text().strip()<br />????????????buildYear?=?details.find_all('span')[3].get_text().strip()<br />????????????addres?=?item.find_all('div',attrs={'class':?"details-item"})[1].get_text().replace('?','').replace('\n','')<br />????????????tag_spans?=?item.find('div',?attrs={'class':'tags-bottom'}).find_all('span')<br />????????????tags?=?[span.get_text()?for?span?in?tag_spans]<br />????????????tags?=?'|'.join(tags)<br />????????????broker?=?item.find('span',attrs={'class':'broker-name?broker-text'}).get_text().strip()<br />????????????totalPrice?=?item.find('span',attrs={'class':'price-det'}).get_text()<br />????????????price?=?item.find('span',attrs={'class':'unit-price'}).get_text()<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?addres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)23.2秒。
  Xpath和Re執行效率相當,Xpath甚至要略勝一籌,Bs4效率要明顯低于前兩者(此案例中,相當遠前兩者效率的1/3),但寫(xiě)起來(lái)則最為容易。
  03 存儲方式
  在完成爬蟲(chóng)數據解析后,一般都要將數據進(jìn)行本地存儲,方便后續使用。小型數據量時(shí)可以選用本地文件存儲,例如CSV、txt或者json文件;當數據量較大時(shí),則一般需采用數據庫存儲,這里,我們分別選用關(guān)系型數據庫的代表MySQL和文本型數據庫的代表MongoDB加入對比。
  1. MySQL
  import?pymysql<br /><br />def?save_info(infos):<br />????#####infos為列表形式,其中列表中每個(gè)元素為一個(gè)元組,包含10個(gè)字段<br />????db=?pymysql.connect(host="localhost",user="root",password="123456",db="ajkhzesf")<br />????sql_insert?=?'insert?into?hzesfmulti8(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)?values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'<br />????cursor?=?db.cursor()<br />????cursor.executemany(sql_insert,?infos)<br />????db.commit()<br />
  耗時(shí)8.1秒。
  2. MongoDB
  import?pymongo<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)字典,包括10個(gè)字段<br />????client?=?pymongo.MongoClient()<br />????collection?=?client.anjuke.hzesfmulti<br />????collection.insert_many(infos)<br />????client.close()<br />
  耗時(shí)8.4秒。
  3. CSV文件
  import?csv<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)列表,包括10個(gè)字段<br />????with?open(r"D:\PyFile\HZhouse\anjuke.csv",?'a',?encoding='gb18030',?newline="")?as?f:<br />????????writer?=?csv.writer(f)<br />????????writer.writerows(infos)<br />
  耗時(shí)8.8秒。
  可見(jiàn),在爬蟲(chóng)框架和解析方式一致的前提下,不同存儲方式間并不會(huì )帶來(lái)太大效率上的差異。
  04 結論
  
  不同爬蟲(chóng)執行效率對比
  易見(jiàn),爬蟲(chóng)框架對耗時(shí)影響最大,甚至可帶來(lái)數倍的效率提升;解析數據方式也會(huì )帶來(lái)較大影響,而數據存儲方式則不存在太大差異。
  對此,個(gè)人認為可以這樣理解:類(lèi)似于把大象裝冰箱需要3步,爬蟲(chóng)也需要3步:
  其中,爬取網(wǎng)頁(yè)源碼最為耗時(shí),這不僅取決于你的爬蟲(chóng)框架和網(wǎng)絡(luò )負載,還受限于目標網(wǎng)站的響應速度和反爬措施;信息解析其次,而數據存儲則最為迅速,尤其是在磁盤(pán)讀取速度飛快的今天,無(wú)論是簡(jiǎn)單的文件寫(xiě)入還是數據庫存儲,都不會(huì )帶來(lái)太大的時(shí)間差異。

爬蟲(chóng)實(shí)戰:Scrapy框架

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 100 次瀏覽 ? 2022-05-01 01:16 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)實(shí)戰:Scrapy框架
  Scrapy是用Python語(yǔ)言編寫(xiě),通過(guò)Twisted異步網(wǎng)絡(luò )框架提升下載速度,是一個(gè)快速、高層次的屏幕抓取和Web抓取框架,常用于數據挖掘、監測和自動(dòng)化測試等。
  一、Scrapy框架介紹
  Scrapy內部實(shí)現了并發(fā)請求、免登錄、URL去重等操作,開(kāi)發(fā)者可根據自己的需求去編寫(xiě)部分代碼,就能抓取到所需要的數據。Scrapy框架包含的組件有調度器、下載器、Scrapy引擎、項目管道、爬蟲(chóng)以及各中間件等。
  Scrapy框架爬取流程:首先從初始URL開(kāi)始,調度器會(huì )將其交給下載器(Downloader),下載器向網(wǎng)絡(luò )服務(wù)器發(fā)送請求進(jìn)行下載,得到的響應后將下載數據交給爬蟲(chóng),爬蟲(chóng)會(huì )對網(wǎng)頁(yè)進(jìn)行分析,分析出來(lái)的結果有兩種:一種是需要進(jìn)一步抓取的鏈接,這些鏈接會(huì )被傳回調度器,另一種是需要保存的數據,它們會(huì )被傳送至項目管道,項目管道進(jìn)一步對數據進(jìn)行清洗、去重等處理,并存儲到文件或數據庫中。數據爬取過(guò)程中,Scrapy引擎用于控制整個(gè)系統的數據處理流程。
  
  Scrapy框架內包含的各組件功能如下:
  Scrapy引擎:用來(lái)控制整個(gè)系統的數據處理流程,并進(jìn)行事務(wù)處理的觸發(fā)。
  調度器中間件:位于Scrapy引擎和調度器之間,主要用于處理Scrapy引擎發(fā)送到調度器的請求和響應。
  調度器:用來(lái)接收引擎發(fā)送過(guò)來(lái)的請求,壓入隊列完成去重操作,并決定下一個(gè)要抓取的網(wǎng)站,在引擎再次請求的時(shí)候返回URL。
  下載器中間件:位于Scrapy引擎和下載器之間,主要用于處理Scrapy引擎與下載器之間的請求及響應,其中代理IP和用戶(hù)代理可以在這里設置。
  下載器:用于下載網(wǎng)頁(yè)內容,并將網(wǎng)頁(yè)響應結果返回給爬蟲(chóng)。
  爬蟲(chóng)中間件:位于Scrapy引擎和爬蟲(chóng)之間,主要用于處理爬蟲(chóng)的響應輸入和請求輸出。
  爬蟲(chóng):用于從特定網(wǎng)頁(yè)中提取需要的信息,也可以從中提取URL交給調度器,讓Scrapy繼續爬取下一個(gè)頁(yè)面。
  項目管道:負責處理爬蟲(chóng)從網(wǎng)頁(yè)中抓取的信息,主要的功能為持久化項目、驗證項目的有效性、清除不需要的信息,并完成數據存儲。
  二、爬蟲(chóng)實(shí)戰
  1.項目需求
  基于Scrapy框架爬取某網(wǎng)站的新聞標題和內容。
  2.分析頁(yè)面網(wǎng)站
  
  通過(guò)網(wǎng)頁(yè)解析,了解新聞網(wǎng)站不同模塊對應的詳情頁(yè)URL均為靜態(tài)數據。
  
  通過(guò)對不同板塊的網(wǎng)頁(yè)進(jìn)行解析,了解各模塊的新聞為動(dòng)態(tài)加載數據,且新聞標題位于“a”標簽下。
  
  進(jìn)一步,分析新聞網(wǎng)頁(yè),了解新聞內容位于“p”標簽下。
  3.項目搭建
  第一步:創(chuàng )建項目
  Pycharm終端輸入
  cd?框架 #進(jìn)入項目文件夾路徑scrapy?startproject?wangyi?#創(chuàng )建項目,wangyi為項目名cd?wangyi?#進(jìn)入項目路徑scrapy?genspider?spiderName?www.xxx.com?#在子目錄中創(chuàng )建爬蟲(chóng)文件
  
  項目結構如下:spiders用于存放爬蟲(chóng)程序(SpiderName.py)的文件夾;items用來(lái)定義數據結構,類(lèi)似于字典的功能;middlewares中間件,可設置ip代理等;pipelines用于對items中的數據進(jìn)行清洗、存儲等操作;settings是設置文件,包含爬蟲(chóng)項目的信息;scrapy.cfg是關(guān)于項目配置文件。
  第二步:編寫(xiě)爬蟲(chóng)代碼(spiderName.py)
  import scrapyfrom selenium import webdriverfrom wangyi.items import WangyiItem<br />class WangyiSpider(scrapy.Spider): name = 'wangyi' #allowed_domains = ['www.xxx.com'] start_urls = ['https://news.163.com/'] models_urls = [] #存儲五個(gè)板塊的詳情頁(yè)url #實(shí)例化瀏覽器對象 def __init__(self): self.bro = webdriver.Chrome(executable_path='D:/PyCharm/learnpython/框架/wangyi/chromedriver.exe') def parse(self, response): li_list = response.xpath('//*[@id="index2016_wrap"]/div[2]/div[2]/div[2]/div[2]/div/ul/li') alist = [2,3,5,6,7] for index in alist: model_url = li_list[index].xpath('./a/@href').extract_first() self.models_urls.append(model_url) #依次對每一個(gè)板塊對應的頁(yè)面發(fā)送請求 for url in self.models_urls: yield scrapy.Request(url,callback=self.parse_model)<br /> def parse_model(self,response): div_lists = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div') for div in div_lists: title = div.xpath('./div/div[1]/h3/a/text()').extract_first() new_detial_url = div.xpath('./div/div[1]/h3/a/@href').extract_first() item = WangyiItem()????????????item['title']?=?title yield scrapy.Request(url=new_detial_url , callback=self.parse_detial , meta={'item' : item}) def parse_detial(self,response): content = response.xpath('//*[@id="content"]/div[2]//text()').extract() content = ''.join(content) item = response.meta['item'] item['content'] = content yield item<br /> def closed(self,spider):????????self.bro.quit()
  注意不能使用return返回數據,應使用yield返回數據。使用return直接退出函數,而對于yield在調研for的時(shí)候,函數內部不會(huì )立即執行,只是返回一個(gè)生成器對象。
  第三步:設置中間件(middlewares.py)
  from scrapy import signalsfrom scrapy.http import HtmlResponsefrom time import sleep# useful for handling different item types with a single interfacefrom itemadapter import is_item, ItemAdapter<br />class?WangyiDownloaderMiddleware:????def?process_request(self,?request,?spider):????????return?None #通過(guò)該方法攔截五大板塊對應的響應對象,進(jìn)行纂改 def process_response(self, request, response, spider): #挑選出指定的響應對象精選纂改 bro = spider.bro #獲取在爬蟲(chóng)類(lèi)中定義的瀏覽器對象 if request.url in spider.models_urls: bro.get(request.url) #五個(gè)板塊url發(fā)送請求 sleep(2) page_text = bro.page_source #動(dòng)態(tài)加載的新聞數據 new_response = HtmlResponse(url=request.url,body= page_text,encoding='utf-8',request=request) return new_response else: return response<br />????def?process_exception(self,?request,?exception,?spider): pass
  第四步:數據存儲
  定義爬取數據結構(items.py)
  import scrapyclass?WangyiItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() content = scrapy.Field()????pass
  定義數據管道(pipelines.py)
  class WangyiPipeline:????fp?=?None # 重寫(xiě)父類(lèi)的一個(gè)方法,該方法只會(huì )在開(kāi)始爬蟲(chóng)的時(shí)候被調用一次 def open_spider(self, spider): print('開(kāi)始爬蟲(chóng)。。。。。。') self.fp = open('./wangyi.text', 'w', encoding='utf-8')<br /> # 用來(lái)專(zhuān)門(mén)處理item類(lèi)型對象 # 該方法每接收到一個(gè)item就會(huì )被調用一次 def process_item(self, item, spider): title = item['title'] content = item['content'] self.fp.write(title + ':' + content + '\n') print(item) return item<br /> def close_spider(self, spider): print('結束爬蟲(chóng)。。。。。。')????????self.fp.close()
  第五步:程序配置(settings.py)
  UA偽裝
  USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
  對robots協(xié)議的遵守進(jìn)行修改
  ROBOTSTXT_OBEY = False
  顯示指定類(lèi)型日志信息
  LOG_LEVEL ='ERROR'
  
  開(kāi)啟中間件
  DOWNLOADER_MIDDLEWARES = { 'wangyi.middlewares.WangyiDownloaderMiddleware': 543,}
  
  開(kāi)啟管道
  ITEM_PIPELINES = { 'wangyi.pipelines.WangyiPipeline': 300,}
  
  第六步:執行項目
  Pycharm終端輸入
  scrapy?crawl?wangyi #wangyi 為爬蟲(chóng)項目名
  4.爬蟲(chóng)結果
  
  參考資料:
  《Python網(wǎng)絡(luò )爬蟲(chóng)技術(shù)與實(shí)戰》,2021,趙國生、王健著(zhù)。 查看全部

  爬蟲(chóng)實(shí)戰:Scrapy框架
  Scrapy是用Python語(yǔ)言編寫(xiě),通過(guò)Twisted異步網(wǎng)絡(luò )框架提升下載速度,是一個(gè)快速、高層次的屏幕抓取和Web抓取框架,常用于數據挖掘、監測和自動(dòng)化測試等。
  一、Scrapy框架介紹
  Scrapy內部實(shí)現了并發(fā)請求、免登錄、URL去重等操作,開(kāi)發(fā)者可根據自己的需求去編寫(xiě)部分代碼,就能抓取到所需要的數據。Scrapy框架包含的組件有調度器、下載器、Scrapy引擎、項目管道、爬蟲(chóng)以及各中間件等。
  Scrapy框架爬取流程:首先從初始URL開(kāi)始,調度器會(huì )將其交給下載器(Downloader),下載器向網(wǎng)絡(luò )服務(wù)器發(fā)送請求進(jìn)行下載,得到的響應后將下載數據交給爬蟲(chóng),爬蟲(chóng)會(huì )對網(wǎng)頁(yè)進(jìn)行分析,分析出來(lái)的結果有兩種:一種是需要進(jìn)一步抓取的鏈接,這些鏈接會(huì )被傳回調度器,另一種是需要保存的數據,它們會(huì )被傳送至項目管道,項目管道進(jìn)一步對數據進(jìn)行清洗、去重等處理,并存儲到文件或數據庫中。數據爬取過(guò)程中,Scrapy引擎用于控制整個(gè)系統的數據處理流程。
  
  Scrapy框架內包含的各組件功能如下:
  Scrapy引擎:用來(lái)控制整個(gè)系統的數據處理流程,并進(jìn)行事務(wù)處理的觸發(fā)。
  調度器中間件:位于Scrapy引擎和調度器之間,主要用于處理Scrapy引擎發(fā)送到調度器的請求和響應。
  調度器:用來(lái)接收引擎發(fā)送過(guò)來(lái)的請求,壓入隊列完成去重操作,并決定下一個(gè)要抓取的網(wǎng)站,在引擎再次請求的時(shí)候返回URL。
  下載器中間件:位于Scrapy引擎和下載器之間,主要用于處理Scrapy引擎與下載器之間的請求及響應,其中代理IP和用戶(hù)代理可以在這里設置。
  下載器:用于下載網(wǎng)頁(yè)內容,并將網(wǎng)頁(yè)響應結果返回給爬蟲(chóng)。
  爬蟲(chóng)中間件:位于Scrapy引擎和爬蟲(chóng)之間,主要用于處理爬蟲(chóng)的響應輸入和請求輸出。
  爬蟲(chóng):用于從特定網(wǎng)頁(yè)中提取需要的信息,也可以從中提取URL交給調度器,讓Scrapy繼續爬取下一個(gè)頁(yè)面。
  項目管道:負責處理爬蟲(chóng)從網(wǎng)頁(yè)中抓取的信息,主要的功能為持久化項目、驗證項目的有效性、清除不需要的信息,并完成數據存儲。
  二、爬蟲(chóng)實(shí)戰
  1.項目需求
  基于Scrapy框架爬取某網(wǎng)站的新聞標題和內容。
  2.分析頁(yè)面網(wǎng)站
  
  通過(guò)網(wǎng)頁(yè)解析,了解新聞網(wǎng)站不同模塊對應的詳情頁(yè)URL均為靜態(tài)數據。
  
  通過(guò)對不同板塊的網(wǎng)頁(yè)進(jìn)行解析,了解各模塊的新聞為動(dòng)態(tài)加載數據,且新聞標題位于“a”標簽下。
  
  進(jìn)一步,分析新聞網(wǎng)頁(yè),了解新聞內容位于“p”標簽下。
  3.項目搭建
  第一步:創(chuàng )建項目
  Pycharm終端輸入
  cd?框架 #進(jìn)入項目文件夾路徑scrapy?startproject?wangyi?#創(chuàng )建項目,wangyi為項目名cd?wangyi?#進(jìn)入項目路徑scrapy?genspider?spiderName?www.xxx.com?#在子目錄中創(chuàng )建爬蟲(chóng)文件
  
  項目結構如下:spiders用于存放爬蟲(chóng)程序(SpiderName.py)的文件夾;items用來(lái)定義數據結構,類(lèi)似于字典的功能;middlewares中間件,可設置ip代理等;pipelines用于對items中的數據進(jìn)行清洗、存儲等操作;settings是設置文件,包含爬蟲(chóng)項目的信息;scrapy.cfg是關(guān)于項目配置文件。
  第二步:編寫(xiě)爬蟲(chóng)代碼(spiderName.py)
  import scrapyfrom selenium import webdriverfrom wangyi.items import WangyiItem<br />class WangyiSpider(scrapy.Spider): name = 'wangyi' #allowed_domains = ['www.xxx.com'] start_urls = ['https://news.163.com/'] models_urls = [] #存儲五個(gè)板塊的詳情頁(yè)url #實(shí)例化瀏覽器對象 def __init__(self): self.bro = webdriver.Chrome(executable_path='D:/PyCharm/learnpython/框架/wangyi/chromedriver.exe') def parse(self, response): li_list = response.xpath('//*[@id="index2016_wrap"]/div[2]/div[2]/div[2]/div[2]/div/ul/li') alist = [2,3,5,6,7] for index in alist: model_url = li_list[index].xpath('./a/@href').extract_first() self.models_urls.append(model_url) #依次對每一個(gè)板塊對應的頁(yè)面發(fā)送請求 for url in self.models_urls: yield scrapy.Request(url,callback=self.parse_model)<br /> def parse_model(self,response): div_lists = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div') for div in div_lists: title = div.xpath('./div/div[1]/h3/a/text()').extract_first() new_detial_url = div.xpath('./div/div[1]/h3/a/@href').extract_first() item = WangyiItem()????????????item['title']?=?title yield scrapy.Request(url=new_detial_url , callback=self.parse_detial , meta={'item' : item}) def parse_detial(self,response): content = response.xpath('//*[@id="content"]/div[2]//text()').extract() content = ''.join(content) item = response.meta['item'] item['content'] = content yield item<br /> def closed(self,spider):????????self.bro.quit()
  注意不能使用return返回數據,應使用yield返回數據。使用return直接退出函數,而對于yield在調研for的時(shí)候,函數內部不會(huì )立即執行,只是返回一個(gè)生成器對象。
  第三步:設置中間件(middlewares.py)
  from scrapy import signalsfrom scrapy.http import HtmlResponsefrom time import sleep# useful for handling different item types with a single interfacefrom itemadapter import is_item, ItemAdapter<br />class?WangyiDownloaderMiddleware:????def?process_request(self,?request,?spider):????????return?None #通過(guò)該方法攔截五大板塊對應的響應對象,進(jìn)行纂改 def process_response(self, request, response, spider): #挑選出指定的響應對象精選纂改 bro = spider.bro #獲取在爬蟲(chóng)類(lèi)中定義的瀏覽器對象 if request.url in spider.models_urls: bro.get(request.url) #五個(gè)板塊url發(fā)送請求 sleep(2) page_text = bro.page_source #動(dòng)態(tài)加載的新聞數據 new_response = HtmlResponse(url=request.url,body= page_text,encoding='utf-8',request=request) return new_response else: return response<br />????def?process_exception(self,?request,?exception,?spider): pass
  第四步:數據存儲
  定義爬取數據結構(items.py)
  import scrapyclass?WangyiItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() content = scrapy.Field()????pass
  定義數據管道(pipelines.py)
  class WangyiPipeline:????fp?=?None # 重寫(xiě)父類(lèi)的一個(gè)方法,該方法只會(huì )在開(kāi)始爬蟲(chóng)的時(shí)候被調用一次 def open_spider(self, spider): print('開(kāi)始爬蟲(chóng)。。。。。。') self.fp = open('./wangyi.text', 'w', encoding='utf-8')<br /> # 用來(lái)專(zhuān)門(mén)處理item類(lèi)型對象 # 該方法每接收到一個(gè)item就會(huì )被調用一次 def process_item(self, item, spider): title = item['title'] content = item['content'] self.fp.write(title + ':' + content + '\n') print(item) return item<br /> def close_spider(self, spider): print('結束爬蟲(chóng)。。。。。。')????????self.fp.close()
  第五步:程序配置(settings.py)
  UA偽裝
  USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
  對robots協(xié)議的遵守進(jìn)行修改
  ROBOTSTXT_OBEY = False
  顯示指定類(lèi)型日志信息
  LOG_LEVEL ='ERROR'
  
  開(kāi)啟中間件
  DOWNLOADER_MIDDLEWARES = { 'wangyi.middlewares.WangyiDownloaderMiddleware': 543,}
  
  開(kāi)啟管道
  ITEM_PIPELINES = { 'wangyi.pipelines.WangyiPipeline': 300,}
  
  第六步:執行項目
  Pycharm終端輸入
  scrapy?crawl?wangyi #wangyi 為爬蟲(chóng)項目名
  4.爬蟲(chóng)結果
  
  參考資料:
  《Python網(wǎng)絡(luò )爬蟲(chóng)技術(shù)與實(shí)戰》,2021,趙國生、王健著(zhù)。

手把手教你使用Python網(wǎng)絡(luò )爬蟲(chóng)獲取基金信息

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 70 次瀏覽 ? 2022-05-01 01:09 ? 來(lái)自相關(guān)話(huà)題

  手把手教你使用Python網(wǎng)絡(luò )爬蟲(chóng)獲取基金信息
  
  文章:Python爬蟲(chóng)與數據挖掘作者:Python進(jìn)階者01前言
  前幾天有個(gè)粉絲找我獲取基金信息,這里拿出來(lái)分享一下,感興趣的小伙伴們,也可以積極嘗試。
  
  02數據獲取
  這里我們的目標網(wǎng)站是某基金官網(wǎng),需要抓取的數據如下圖所示。
  
  可以看到上圖中基金代碼那一列,有不同的數字,隨機點(diǎn)擊一個(gè),可以進(jìn)入到基金詳情頁(yè),鏈接也非常有規律,以基金代碼作為標志的。
  其實(shí)這個(gè)網(wǎng)站倒是不難,數據什么的,都沒(méi)有加密,網(wǎng)頁(yè)上的信息,在源碼中都可以直接看到。
  
  這樣就降低了抓取難度了。通過(guò)瀏覽器抓包的方法,可以看到具體的請求參數,而且可以看到請求參數中只有pi在變化,而這個(gè)值恰好對應的是頁(yè)面,直接構造請求參數就可以了。
  
  代碼實(shí)現過(guò)程
  找到數據源之后,接下來(lái)就是代碼實(shí)現了,一起來(lái)看看吧,這里給出部分關(guān)鍵代碼。
  獲取股票id數據
  response = requests.get(url, headers=headers, params=params, verify=False) pattern = re.compile(r'.*?"(?P.*?)".*?', re.S) result = re.finditer(pattern, response.text) ids = [] for item in result: # print(item.group('items')) gp_id = item.group('items').split(',')[0]
  結果如下圖所示:
  
  之后構造詳情頁(yè)鏈接,獲取詳情頁(yè)的基金信息,關(guān)鍵代碼如下:
  response = requests.get(url, headers=headers)response.encoding = response.apparent_encodingselectors = etree.HTML(response.text)danweijingzhi1 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[1]/text()')[0]danweijingzhi2 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[2]/text()')[0]leijijingzhi = selectors.xpath('//dl[@class="dataItem03"]/dd[1]/span/text()')[0]lst = selectors.xpath('//div[@class="infoOfFund"]/table//text()')
  結果如下圖所示:
  
  將具體的信息做相應的字符串處理,然后保存到csv文件中,結果如下圖所示:
  
  有了這個(gè),你可以做進(jìn)一步的統計和數據分析了。
  - 合作、交流、轉載請添加微信 moonhmily1 -<p style="outline: 0px;white-space: normal;font-size: 16px;"></p> 查看全部

  手把手教你使用Python網(wǎng)絡(luò )爬蟲(chóng)獲取基金信息
  
  文章:Python爬蟲(chóng)與數據挖掘作者:Python進(jìn)階者01前言
  前幾天有個(gè)粉絲找我獲取基金信息,這里拿出來(lái)分享一下,感興趣的小伙伴們,也可以積極嘗試。
  
  02數據獲取
  這里我們的目標網(wǎng)站是某基金官網(wǎng),需要抓取的數據如下圖所示。
  
  可以看到上圖中基金代碼那一列,有不同的數字,隨機點(diǎn)擊一個(gè),可以進(jìn)入到基金詳情頁(yè),鏈接也非常有規律,以基金代碼作為標志的。
  其實(shí)這個(gè)網(wǎng)站倒是不難,數據什么的,都沒(méi)有加密,網(wǎng)頁(yè)上的信息,在源碼中都可以直接看到。
  
  這樣就降低了抓取難度了。通過(guò)瀏覽器抓包的方法,可以看到具體的請求參數,而且可以看到請求參數中只有pi在變化,而這個(gè)值恰好對應的是頁(yè)面,直接構造請求參數就可以了。
  
  代碼實(shí)現過(guò)程
  找到數據源之后,接下來(lái)就是代碼實(shí)現了,一起來(lái)看看吧,這里給出部分關(guān)鍵代碼。
  獲取股票id數據
  response = requests.get(url, headers=headers, params=params, verify=False) pattern = re.compile(r'.*?"(?P.*?)".*?', re.S) result = re.finditer(pattern, response.text) ids = [] for item in result: # print(item.group('items')) gp_id = item.group('items').split(',')[0]
  結果如下圖所示:
  
  之后構造詳情頁(yè)鏈接,獲取詳情頁(yè)的基金信息,關(guān)鍵代碼如下:
  response = requests.get(url, headers=headers)response.encoding = response.apparent_encodingselectors = etree.HTML(response.text)danweijingzhi1 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[1]/text()')[0]danweijingzhi2 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[2]/text()')[0]leijijingzhi = selectors.xpath('//dl[@class="dataItem03"]/dd[1]/span/text()')[0]lst = selectors.xpath('//div[@class="infoOfFund"]/table//text()')
  結果如下圖所示:
  
  將具體的信息做相應的字符串處理,然后保存到csv文件中,結果如下圖所示:
  
  有了這個(gè),你可以做進(jìn)一步的統計和數據分析了。
  - 合作、交流、轉載請添加微信 moonhmily1 -<p style="outline: 0px;white-space: normal;font-size: 16px;"></p>

Python架構高薪就業(yè)班/爬蟲(chóng)/數據分析/web開(kāi)發(fā)/AI人工智能(百度云 百

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-04-29 23:25 ? 來(lái)自相關(guān)話(huà)題

  Python架構高薪就業(yè)班/爬蟲(chóng)/數據分析/web開(kāi)發(fā)/AI人工智能(百度云 百
  含大數據、前沿技術(shù)、前端開(kāi)發(fā)、后端開(kāi)發(fā)、移動(dòng)開(kāi)發(fā)、數據分析、架構、人工智能、Python、Java、Android、前端、IOS、C++、大數據、、GO、音視頻軟件測試、產(chǎn)品經(jīng)理、運維、股票基金、人工智能AI
  
  
  
  以下內容為填充,無(wú)視即可
  報表樣式的餅圖如圖13-15所示??梢詥螕羧鐖D13-16所示的鏈接單獨引用此報表。圖13-15 報表樣式的餅圖圖13-16 鏈接報表單獨的頁(yè)面能根據查詢(xún)的修改而實(shí)時(shí)變化,比如將查詢(xún)修改為:select date_format(create_time,'%Y-%m-%d') d, count(*) cfrom information_schema.tableswhere create_time &gt; '2016-06-07'group by date_format(create_time,'%Y-%m-%d')order by d;增加了where子句,再運行此查詢(xún),結果如圖13-17所示。圖13-17 圖形顯示隨查詢(xún)變化單獨鏈接的頁(yè)面也隨之自動(dòng)發(fā)生變化,如圖13-18所示。圖13-18 單獨鏈接的頁(yè)面自動(dòng)變化13.4 Hue、Zeppelin比較1.功能Zeppelin和Hue都具有一定的數據可視化功能,都提供了多種圖形化數據表示形式。單從這點(diǎn)來(lái)說(shuō),它們的功能類(lèi)似,大同小異。Hue可以通過(guò)經(jīng)緯度進(jìn)行地圖定位,這個(gè)功能在Zeppelin 0.6.0上沒(méi)有。Zeppelin支持的后端數據查詢(xún)程序較多,0.6.0版本默認有18種,原生支持Spark。
  而Hue的3.9.0版本默認只支持Hive、Impala、Pig和數據庫查詢(xún)。Zeppelin只提供了單一的數據處理功能,它將數據攝取、數據發(fā)現、數據分析、數據可視化都歸為數據處理的范疇。而Hue的功能則豐富得多,除了類(lèi)似的數據處理,還有元數據管理、Oozie工作流管理、作業(yè)管理、用戶(hù)管理、Sqoop集成等很多管理功能。從這點(diǎn)看,Zeppelin只是一個(gè)數據處理工具,而Hue更像是一個(gè)綜合管理工具。2.架構Zeppelin采用插件式的翻譯器,通過(guò)插件開(kāi)發(fā),可以添加任何后端語(yǔ)言及其數據處理程序,相對來(lái)說(shuō)更加獨立和開(kāi)放。Hue與Hadoop生態(tài)圈的其他組件密切相關(guān),一般都與CDH一同部署。3.使用場(chǎng)景Zeppelin適合單一數據處理,但后端處理語(yǔ)言繁多的場(chǎng)景,尤其適合Spark。Hue適合與Hadoop集群的多個(gè)組件交互,如Oozie工作流、Sqoop等聯(lián)合處理數據的場(chǎng)景,尤其適合與Impala協(xié)同工作。13.5 數據可視化實(shí)例本節先用Impala、DB查詢(xún)示例說(shuō)明Hue的數據查詢(xún)和可視化功能,然后交互式地建立定期執行銷(xiāo)售訂單示例ETL任務(wù)的工作流,說(shuō)明在Hue里是如何操作Oozie工作流引擎的。
  1.Impala查詢(xún)在12.4節中執行了一些聯(lián)機分析處理的查詢(xún),現在在Hue里執行查詢(xún),直觀(guān)看一下結果的圖形化表示效果。登錄Hue,單擊 圖標進(jìn)入“我的文檔”頁(yè)面。單擊 創(chuàng )建一個(gè)名為“銷(xiāo)售訂單”的新項目。單擊“新文檔”→“Impala”進(jìn)入查詢(xún)編輯頁(yè)面,創(chuàng )建一個(gè)新的Impala文檔。在Impala查詢(xún)編輯頁(yè)面,選擇olap庫,然后在編輯窗口輸入下面的查詢(xún)語(yǔ)句。-- 按產(chǎn)品分類(lèi)查詢(xún)銷(xiāo)售量和銷(xiāo)售額selectt2.product_category pro_category,sum(order_quantity) sum_quantity,sum(order_amount) sum_amountfromsales_order_fact t1, product_dim t2wheret1.product_sk = t2.product_skgroup bypro_categoryorder bypro_category;-- 按產(chǎn)品查詢(xún)銷(xiāo)售量和銷(xiāo)售額 查看全部

  Python架構高薪就業(yè)班/爬蟲(chóng)/數據分析/web開(kāi)發(fā)/AI人工智能(百度云 百
  含大數據、前沿技術(shù)、前端開(kāi)發(fā)、后端開(kāi)發(fā)、移動(dòng)開(kāi)發(fā)、數據分析、架構、人工智能、Python、Java、Android、前端、IOS、C++、大數據、、GO、音視頻軟件測試、產(chǎn)品經(jīng)理、運維、股票基金、人工智能AI
  
  
  
  以下內容為填充,無(wú)視即可
  報表樣式的餅圖如圖13-15所示??梢詥螕羧鐖D13-16所示的鏈接單獨引用此報表。圖13-15 報表樣式的餅圖圖13-16 鏈接報表單獨的頁(yè)面能根據查詢(xún)的修改而實(shí)時(shí)變化,比如將查詢(xún)修改為:select date_format(create_time,'%Y-%m-%d') d, count(*) cfrom information_schema.tableswhere create_time &gt; '2016-06-07'group by date_format(create_time,'%Y-%m-%d')order by d;增加了where子句,再運行此查詢(xún),結果如圖13-17所示。圖13-17 圖形顯示隨查詢(xún)變化單獨鏈接的頁(yè)面也隨之自動(dòng)發(fā)生變化,如圖13-18所示。圖13-18 單獨鏈接的頁(yè)面自動(dòng)變化13.4 Hue、Zeppelin比較1.功能Zeppelin和Hue都具有一定的數據可視化功能,都提供了多種圖形化數據表示形式。單從這點(diǎn)來(lái)說(shuō),它們的功能類(lèi)似,大同小異。Hue可以通過(guò)經(jīng)緯度進(jìn)行地圖定位,這個(gè)功能在Zeppelin 0.6.0上沒(méi)有。Zeppelin支持的后端數據查詢(xún)程序較多,0.6.0版本默認有18種,原生支持Spark。
  而Hue的3.9.0版本默認只支持Hive、Impala、Pig和數據庫查詢(xún)。Zeppelin只提供了單一的數據處理功能,它將數據攝取、數據發(fā)現、數據分析、數據可視化都歸為數據處理的范疇。而Hue的功能則豐富得多,除了類(lèi)似的數據處理,還有元數據管理、Oozie工作流管理、作業(yè)管理、用戶(hù)管理、Sqoop集成等很多管理功能。從這點(diǎn)看,Zeppelin只是一個(gè)數據處理工具,而Hue更像是一個(gè)綜合管理工具。2.架構Zeppelin采用插件式的翻譯器,通過(guò)插件開(kāi)發(fā),可以添加任何后端語(yǔ)言及其數據處理程序,相對來(lái)說(shuō)更加獨立和開(kāi)放。Hue與Hadoop生態(tài)圈的其他組件密切相關(guān),一般都與CDH一同部署。3.使用場(chǎng)景Zeppelin適合單一數據處理,但后端處理語(yǔ)言繁多的場(chǎng)景,尤其適合Spark。Hue適合與Hadoop集群的多個(gè)組件交互,如Oozie工作流、Sqoop等聯(lián)合處理數據的場(chǎng)景,尤其適合與Impala協(xié)同工作。13.5 數據可視化實(shí)例本節先用Impala、DB查詢(xún)示例說(shuō)明Hue的數據查詢(xún)和可視化功能,然后交互式地建立定期執行銷(xiāo)售訂單示例ETL任務(wù)的工作流,說(shuō)明在Hue里是如何操作Oozie工作流引擎的。
  1.Impala查詢(xún)在12.4節中執行了一些聯(lián)機分析處理的查詢(xún),現在在Hue里執行查詢(xún),直觀(guān)看一下結果的圖形化表示效果。登錄Hue,單擊 圖標進(jìn)入“我的文檔”頁(yè)面。單擊 創(chuàng )建一個(gè)名為“銷(xiāo)售訂單”的新項目。單擊“新文檔”→“Impala”進(jìn)入查詢(xún)編輯頁(yè)面,創(chuàng )建一個(gè)新的Impala文檔。在Impala查詢(xún)編輯頁(yè)面,選擇olap庫,然后在編輯窗口輸入下面的查詢(xún)語(yǔ)句。-- 按產(chǎn)品分類(lèi)查詢(xún)銷(xiāo)售量和銷(xiāo)售額selectt2.product_category pro_category,sum(order_quantity) sum_quantity,sum(order_amount) sum_amountfromsales_order_fact t1, product_dim t2wheret1.product_sk = t2.product_skgroup bypro_categoryorder bypro_category;-- 按產(chǎn)品查詢(xún)銷(xiāo)售量和銷(xiāo)售額

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(本節書(shū)摘來(lái)自異步社區《用Python寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)》第2章)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-04-19 15:08 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(本節書(shū)摘來(lái)自異步社區《用Python寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)》第2章)
  本節節選自異步社區作者【澳大利亞】理查德·勞森(Richard Lawson)所著(zhù)的《用Python編寫(xiě)Web爬蟲(chóng)》一書(shū)第2章第2.2節,李斌翻譯,更多章節可訪(fǎng)問(wèn)云棲社區“異步社區”公眾號查看。
  2.2 三種網(wǎng)頁(yè)抓取方法
  現在我們已經(jīng)了解了這個(gè)網(wǎng)頁(yè)的結構,有三種方法可以從中獲取數據。首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  2.2.1 正則表達式
  如果您不熟悉正則表達式,或者需要一些提示,請查看完整介紹。
  當我們使用正則表達式抓取區域數據時(shí),首先需要嘗試匹配
  里面的內容
  元素,如下圖。
   >>> import re
>>> url = 'http://example.webscraping.com/view/United
-Kingdom-239'
>>> html = download(url)
>>> re.findall('(.*?)', html)
['/places/static/images/flags/gb.png',
'244,820 square kilometres',
'62,348,447',
'GB',
'United Kingdom',
'London',
'EU',
'.uk',
'GBP',
'Pound',
'44',
'@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}
[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})
|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$',
'en-GB,cy-GB,gd',
'IE ']
  從上面的結果可以看出,標簽被用于幾個(gè)國家屬性。為了隔離area屬性,我們可以只選擇其中的第二個(gè)元素,如下圖。
   >>> re.findall('(.*?)', html)[1]
'244,820 square kilometres'
  雖然此方案目前可用,但如果頁(yè)面更改,它可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使這個(gè)正則表達式更健壯,我們可以將它作為父對象
   >>> re.findall('Area: (.*?)', html)
['244,820 square kilometres']
  這個(gè)迭代版本看起來(lái)更好,但是網(wǎng)頁(yè)更新還有很多其他方式也可以使這個(gè)正則表達式不滿(mǎn)足。例如,要將雙引號改為單引號,
  在之間添加額外的空格
  標簽,或更改 area_label 等。下面是嘗試支持這些可能性的改進(jìn)版本。
   >>> re.findall('.*?>> from bs4 import BeautifulSoup
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, 'html.parser')
>>> fixed_html = soup.prettify()
>>> print fixed_html



Area
Population



  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽,除了添加和
  標記使它成為一個(gè)完整的 HTML 文檔?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
   >>> ul = soup.find('ul', attrs={'class':'country'})
>>> ul.find('li') # returns just the first match
Area
>>> ul.find_all('li') # returns all matches
[Area, Population]
  要了解所有的方法和參數,可以參考 BeautifulSoup 的官方文檔:.
  以下是使用該方法提取樣本國家地區數據的完整代碼。
   >>> from bs4 import BeautifulSoup
>>> url = 'http://example.webscraping.com/places/view/
United-Kingdom-239'
>>> html = download(url)
>>> soup = BeautifulSoup(html)
>>> # locate the area row
>>> tr = soup.find(attrs={'id':'places_area__row'})
>>> td = tr.find(attrs={'class':'w2p_fw'}) # locate the area tag
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的小變化,例如額外的空白和選項卡屬性,我們不必再擔心了。
  2.2.3 Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。這個(gè)模塊是用C語(yǔ)言編寫(xiě)的,解析速度比Beautiful Soup快,但是安裝過(guò)程比較復雜。最新的安裝說(shuō)明可供參考。
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析相同的不完整 HTML 的示例。
   >>> import lxml.html
>>> broken_html = 'AreaPopulation'
>>> tree = lxml.html.fromstring(broken_html) # parse the HTML
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html

Area
Population

  同樣,lxml可以正確解析屬性和關(guān)閉標簽周?chē)鄙俚囊?,但是模塊不加和
  標簽。
  解析輸入內容后,進(jìn)入選擇元素的步驟。此時(shí),lxml 有幾種不同的方法,例如類(lèi)似于 Beautiful Soup 的 XPath 選擇器和 find() 方法。但是,在本例和后續示例中,我們將使用 CSS 選擇器,因為它們更簡(jiǎn)潔,可以在第 5 章解析動(dòng)態(tài)內容時(shí)重復使用。另外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼。
   >>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  CSS 選擇器的關(guān)鍵行已加粗。這行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇w2p_fw類(lèi)的表格數據子標簽。
  CSS 選擇器
  CSS 選擇器表示用于選擇元素的模式。下面是一些常用選擇器的示例。
   選擇所有標簽:*
選擇<a>標簽:a
選擇所有class="link"的元素:.link
選擇class="link"的<a>標簽:a.link
選擇id="home"的<a>標簽:a#home
選擇父元素為<a>標簽的所有子標簽:a > span
選擇<a>標簽內部的所有標簽:a span
選擇title屬性為"Home"的所有<a>標簽:a[title=Home]
  CSS3 規范已由 W3C 在 `/2011/REC-css3-selectors-20110929/ 提出。
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,不支持的功能可以在這里找到。
  需要注意的是,lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  2.2.4 性能對比
  為了更好地評估本章描述的三種抓取方法之間的權衡,我們需要比較它們的相對效率。通常,爬蟲(chóng)從網(wǎng)頁(yè)中提取多個(gè)字段。因此,為了使比較更加真實(shí),我們將在本章中實(shí)現每個(gè)爬蟲(chóng)的擴展版本,從國家頁(yè)面中提取每個(gè)可用數據。首先,我們需要回到Firebug,檢查國家頁(yè)面其他功能的格式,如圖2.4.
  
  您可以從 Firebug 的顯示中看到,表格中的每一行都有一個(gè)以 places_ 開(kāi)頭并以 __row 結尾的 ID。這些行中收錄的國家/地區數據的格式與上面示例中的格式相同。下面是使用上述信息提取所有可用國家/地區數據的實(shí)現代碼。
   FIELDS = ('area', 'population', 'iso', 'country', 'capital',
'continent', 'tld', 'currency_code', 'currency_name', 'phone',
'postal_code_format', 'postal_code_regex', 'languages',
'neighbours')
import re
def re_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search('.*?(.*?)' % field, html).groups()[0]
return results
from bs4 import BeautifulSoup
def bs_scraper(html):
soup = BeautifulSoup(html, 'html.parser')
results = {}
for field in FIELDS:
results[field] = soup.find('table').find('tr',
id='places_%s__row' % field).find('td',
class_='w2p_fw').text
return results
import lxml.html
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect('table > tr#places_%s__row
> td.w2p_fw' % field)[0].text_content()
return results
  獲取結果
  現在我們已經(jīng)完成了所有爬蟲(chóng)的代碼實(shí)現,接下來(lái)通過(guò)下面的代碼片段來(lái)測試這三種方法的相對性能。
   import time
NUM_ITERATIONS = 1000 # number of times to test each scraper
html = download('http://example.webscraping.com/places/view/
United-Kingdom-239')
for name, scraper in [('Regular expressions', re_scraper),
('BeautifulSoup', bs_scraper),
('Lxml', lxml_scraper)]:
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == re_scraper:
re.purge()
result = scraper(html)
# check scraped result is as expected
assert(result['area'] == '244,820 square kilometres')
# record end time of scrape and output the total
end = time.time()
print '%s: %.2f seconds' % (name, end – start)
  在這段代碼中,每個(gè)爬蟲(chóng)會(huì )被執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。這里使用的下載函數還是上一章定義的。請注意,我們在粗體代碼行中調用了 re.purge() 方法。默認情況下,正則表達式模塊會(huì )緩存搜索結果,為了與其他爬蟲(chóng)比較公平,我們需要使用這種方法來(lái)清除緩存。
  下面是在我的電腦上運行腳本的結果。
  $ python performance.py
Regular expressions: 5.50 seconds
BeautifulSoup: 42.84 seconds
Lxml: 7.06 seconds
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 6 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和 regex 模塊是用 C 編寫(xiě)的,而 BeautifulSoup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的行為與正則表達式一樣。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這種初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力。多么神奇的模塊!
  2.2.5 個(gè)結論
  表2.1總結了每種爬取方式的優(yōu)缺點(diǎn)。
  
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。如果你只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更合適。通常,lxml 是抓取數據的最佳選擇,因為它快速且健壯,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下有用。
  2.2.6 添加鏈接爬蟲(chóng)的爬取回調
  我們已經(jīng)看到了如何抓取國家數據,我們需要將其集成到上一章的鏈接爬蟲(chóng)中。為了重用這個(gè)爬蟲(chóng)代碼去抓取其他網(wǎng)站,我們需要添加一個(gè)回調參數來(lái)處理抓取行為?;卣{是在某個(gè)事件發(fā)生后調用的函數(在這種情況下,在網(wǎng)頁(yè)下載完成后)。爬取回調函數收錄url和html兩個(gè)參數,可以返回要爬取的url列表。下面是它的實(shí)現代碼??梢?jiàn),用Python實(shí)現這個(gè)功能非常簡(jiǎn)單。
   def link_crawler(..., scrape_callback=None):
...
links = []
if scrape_callback:
links.extend(scrape_callback(url, html) or [])
...
  在上面的代碼片段中,我們將新添加的抓取回調函數代碼加粗。如果想獲取該版本鏈接爬蟲(chóng)的完整代碼,可以訪(fǎng)問(wèn)org/wswp/code/src/tip/chapter02/link_crawler.py。
  現在,我們只需要自定義傳入的scrape_callback函數,就可以使用爬蟲(chóng)抓取其他網(wǎng)站了。下面修改lxml抓取示例的代碼,以便在回調函數中使用。
   def scrape_callback(url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = [tree.cssselect('table > tr#places_%s__row >
td.w2p_fw' % field)[0].text_content() for field in
FIELDS]
print url, row
  上面的回調函數會(huì )抓取國家數據并顯示出來(lái)。不過(guò)一般情況下,在爬取網(wǎng)站的時(shí)候,我們更希望能夠重用這些數據,所以讓我們擴展一下它的功能,把得到的數據保存在一個(gè)CSV表中。代碼如下。
   import csv
class ScrapeCallback:
def __init__(self):
self.writer = csv.writer(open('countries.csv', 'w'))
self.fields = ('area', 'population', 'iso', 'country',
'capital', 'continent', 'tld', 'currency_code',
'currency_name', 'phone', 'postal_code_format',
'postal_code_regex', 'languages',
'neighbours')
self.writer.writerow(self.fields)
def __call__(self, url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = []
for field in self.fields:
row.append(tree.cssselect('table >
tr#places_{}__row >
td.w2p_fw'.format(field))
[0].text_content())
self.writer.writerow(row)
  為了實(shí)現這個(gè)回調,我們使用回調類(lèi)而不是回調函數,以維護 csv 中 writer 屬性的狀態(tài)。在構造函數中實(shí)例化csv的writer屬性,然后在__call__方法中進(jìn)行多次寫(xiě)入。注意__call__是一個(gè)特殊的方法,當一個(gè)對象作為函數調用時(shí)會(huì )調用,這也是鏈接爬蟲(chóng)中cache_callback的調用方式。也就是說(shuō),scrape_callback(url, html) 等價(jià)于調用 scrape_callback.__call__(url, html)。如果想詳細了解Python的特殊類(lèi)方法,可以參考一下。
  以下是將回調傳遞給鏈接爬蟲(chóng)的代碼。
   link_crawler('http://example.webscraping.com/', '/(index|view)',
max_depth=-1, scrape_callback=ScrapeCallback())
  現在,當我們使用回調運行這個(gè)爬蟲(chóng)時(shí),程序會(huì )將結果寫(xiě)入 CSV 文件,我們可以使用 Excel 或 LibreOffice 等應用程序查看該文件,如圖 2.5 所示。
  
  成功!我們完成了我們的第一個(gè)工作數據抓取爬蟲(chóng)。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(本節書(shū)摘來(lái)自異步社區《用Python寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)》第2章)
  本節節選自異步社區作者【澳大利亞】理查德·勞森(Richard Lawson)所著(zhù)的《用Python編寫(xiě)Web爬蟲(chóng)》一書(shū)第2章第2.2節,李斌翻譯,更多章節可訪(fǎng)問(wèn)云棲社區“異步社區”公眾號查看。
  2.2 三種網(wǎng)頁(yè)抓取方法
  現在我們已經(jīng)了解了這個(gè)網(wǎng)頁(yè)的結構,有三種方法可以從中獲取數據。首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  2.2.1 正則表達式
  如果您不熟悉正則表達式,或者需要一些提示,請查看完整介紹。
  當我們使用正則表達式抓取區域數據時(shí),首先需要嘗試匹配
  里面的內容
  元素,如下圖。
   >>> import re
>>> url = 'http://example.webscraping.com/view/United
-Kingdom-239'
>>> html = download(url)
>>> re.findall('(.*?)', html)
['/places/static/images/flags/gb.png',
'244,820 square kilometres',
'62,348,447',
'GB',
'United Kingdom',
'London',
'EU',
'.uk',
'GBP',
'Pound',
'44',
'@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}
[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})
|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$',
'en-GB,cy-GB,gd',
'IE ']
  從上面的結果可以看出,標簽被用于幾個(gè)國家屬性。為了隔離area屬性,我們可以只選擇其中的第二個(gè)元素,如下圖。
   >>> re.findall('(.*?)', html)[1]
'244,820 square kilometres'
  雖然此方案目前可用,但如果頁(yè)面更改,它可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使這個(gè)正則表達式更健壯,我們可以將它作為父對象
   >>> re.findall('Area: (.*?)', html)
['244,820 square kilometres']
  這個(gè)迭代版本看起來(lái)更好,但是網(wǎng)頁(yè)更新還有很多其他方式也可以使這個(gè)正則表達式不滿(mǎn)足。例如,要將雙引號改為單引號,
  在之間添加額外的空格
  標簽,或更改 area_label 等。下面是嘗試支持這些可能性的改進(jìn)版本。
   >>> re.findall('.*?>> from bs4 import BeautifulSoup
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, 'html.parser')
>>> fixed_html = soup.prettify()
>>> print fixed_html



Area
Population



  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽,除了添加和
  標記使它成為一個(gè)完整的 HTML 文檔?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
   >>> ul = soup.find('ul', attrs={'class':'country'})
>>> ul.find('li') # returns just the first match
Area
>>> ul.find_all('li') # returns all matches
[Area, Population]
  要了解所有的方法和參數,可以參考 BeautifulSoup 的官方文檔:.
  以下是使用該方法提取樣本國家地區數據的完整代碼。
   >>> from bs4 import BeautifulSoup
>>> url = 'http://example.webscraping.com/places/view/
United-Kingdom-239'
>>> html = download(url)
>>> soup = BeautifulSoup(html)
>>> # locate the area row
>>> tr = soup.find(attrs={'id':'places_area__row'})
>>> td = tr.find(attrs={'class':'w2p_fw'}) # locate the area tag
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的小變化,例如額外的空白和選項卡屬性,我們不必再擔心了。
  2.2.3 Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。這個(gè)模塊是用C語(yǔ)言編寫(xiě)的,解析速度比Beautiful Soup快,但是安裝過(guò)程比較復雜。最新的安裝說(shuō)明可供參考。
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析相同的不完整 HTML 的示例。
   >>> import lxml.html
>>> broken_html = 'AreaPopulation'
>>> tree = lxml.html.fromstring(broken_html) # parse the HTML
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html

Area
Population

  同樣,lxml可以正確解析屬性和關(guān)閉標簽周?chē)鄙俚囊?,但是模塊不加和
  標簽。
  解析輸入內容后,進(jìn)入選擇元素的步驟。此時(shí),lxml 有幾種不同的方法,例如類(lèi)似于 Beautiful Soup 的 XPath 選擇器和 find() 方法。但是,在本例和后續示例中,我們將使用 CSS 選擇器,因為它們更簡(jiǎn)潔,可以在第 5 章解析動(dòng)態(tài)內容時(shí)重復使用。另外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼。
   >>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  CSS 選擇器的關(guān)鍵行已加粗。這行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇w2p_fw類(lèi)的表格數據子標簽。
  CSS 選擇器
  CSS 選擇器表示用于選擇元素的模式。下面是一些常用選擇器的示例。
   選擇所有標簽:*
選擇<a>標簽:a
選擇所有class="link"的元素:.link
選擇class="link"的<a>標簽:a.link
選擇id="home"的<a>標簽:a#home
選擇父元素為<a>標簽的所有子標簽:a > span
選擇<a>標簽內部的所有標簽:a span
選擇title屬性為"Home"的所有<a>標簽:a[title=Home]
  CSS3 規范已由 W3C 在 `/2011/REC-css3-selectors-20110929/ 提出。
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,不支持的功能可以在這里找到。
  需要注意的是,lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  2.2.4 性能對比
  為了更好地評估本章描述的三種抓取方法之間的權衡,我們需要比較它們的相對效率。通常,爬蟲(chóng)從網(wǎng)頁(yè)中提取多個(gè)字段。因此,為了使比較更加真實(shí),我們將在本章中實(shí)現每個(gè)爬蟲(chóng)的擴展版本,從國家頁(yè)面中提取每個(gè)可用數據。首先,我們需要回到Firebug,檢查國家頁(yè)面其他功能的格式,如圖2.4.
  
  您可以從 Firebug 的顯示中看到,表格中的每一行都有一個(gè)以 places_ 開(kāi)頭并以 __row 結尾的 ID。這些行中收錄的國家/地區數據的格式與上面示例中的格式相同。下面是使用上述信息提取所有可用國家/地區數據的實(shí)現代碼。
   FIELDS = ('area', 'population', 'iso', 'country', 'capital',
'continent', 'tld', 'currency_code', 'currency_name', 'phone',
'postal_code_format', 'postal_code_regex', 'languages',
'neighbours')
import re
def re_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search('.*?(.*?)' % field, html).groups()[0]
return results
from bs4 import BeautifulSoup
def bs_scraper(html):
soup = BeautifulSoup(html, 'html.parser')
results = {}
for field in FIELDS:
results[field] = soup.find('table').find('tr',
id='places_%s__row' % field).find('td',
class_='w2p_fw').text
return results
import lxml.html
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect('table > tr#places_%s__row
> td.w2p_fw' % field)[0].text_content()
return results
  獲取結果
  現在我們已經(jīng)完成了所有爬蟲(chóng)的代碼實(shí)現,接下來(lái)通過(guò)下面的代碼片段來(lái)測試這三種方法的相對性能。
   import time
NUM_ITERATIONS = 1000 # number of times to test each scraper
html = download('http://example.webscraping.com/places/view/
United-Kingdom-239')
for name, scraper in [('Regular expressions', re_scraper),
('BeautifulSoup', bs_scraper),
('Lxml', lxml_scraper)]:
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == re_scraper:
re.purge()
result = scraper(html)
# check scraped result is as expected
assert(result['area'] == '244,820 square kilometres')
# record end time of scrape and output the total
end = time.time()
print '%s: %.2f seconds' % (name, end – start)
  在這段代碼中,每個(gè)爬蟲(chóng)會(huì )被執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。這里使用的下載函數還是上一章定義的。請注意,我們在粗體代碼行中調用了 re.purge() 方法。默認情況下,正則表達式模塊會(huì )緩存搜索結果,為了與其他爬蟲(chóng)比較公平,我們需要使用這種方法來(lái)清除緩存。
  下面是在我的電腦上運行腳本的結果。
  $ python performance.py
Regular expressions: 5.50 seconds
BeautifulSoup: 42.84 seconds
Lxml: 7.06 seconds
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 6 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和 regex 模塊是用 C 編寫(xiě)的,而 BeautifulSoup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的行為與正則表達式一樣。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這種初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力。多么神奇的模塊!
  2.2.5 個(gè)結論
  表2.1總結了每種爬取方式的優(yōu)缺點(diǎn)。
  
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。如果你只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更合適。通常,lxml 是抓取數據的最佳選擇,因為它快速且健壯,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下有用。
  2.2.6 添加鏈接爬蟲(chóng)的爬取回調
  我們已經(jīng)看到了如何抓取國家數據,我們需要將其集成到上一章的鏈接爬蟲(chóng)中。為了重用這個(gè)爬蟲(chóng)代碼去抓取其他網(wǎng)站,我們需要添加一個(gè)回調參數來(lái)處理抓取行為?;卣{是在某個(gè)事件發(fā)生后調用的函數(在這種情況下,在網(wǎng)頁(yè)下載完成后)。爬取回調函數收錄url和html兩個(gè)參數,可以返回要爬取的url列表。下面是它的實(shí)現代碼??梢?jiàn),用Python實(shí)現這個(gè)功能非常簡(jiǎn)單。
   def link_crawler(..., scrape_callback=None):
...
links = []
if scrape_callback:
links.extend(scrape_callback(url, html) or [])
...
  在上面的代碼片段中,我們將新添加的抓取回調函數代碼加粗。如果想獲取該版本鏈接爬蟲(chóng)的完整代碼,可以訪(fǎng)問(wèn)org/wswp/code/src/tip/chapter02/link_crawler.py。
  現在,我們只需要自定義傳入的scrape_callback函數,就可以使用爬蟲(chóng)抓取其他網(wǎng)站了。下面修改lxml抓取示例的代碼,以便在回調函數中使用。
   def scrape_callback(url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = [tree.cssselect('table > tr#places_%s__row >
td.w2p_fw' % field)[0].text_content() for field in
FIELDS]
print url, row
  上面的回調函數會(huì )抓取國家數據并顯示出來(lái)。不過(guò)一般情況下,在爬取網(wǎng)站的時(shí)候,我們更希望能夠重用這些數據,所以讓我們擴展一下它的功能,把得到的數據保存在一個(gè)CSV表中。代碼如下。
   import csv
class ScrapeCallback:
def __init__(self):
self.writer = csv.writer(open('countries.csv', 'w'))
self.fields = ('area', 'population', 'iso', 'country',
'capital', 'continent', 'tld', 'currency_code',
'currency_name', 'phone', 'postal_code_format',
'postal_code_regex', 'languages',
'neighbours')
self.writer.writerow(self.fields)
def __call__(self, url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = []
for field in self.fields:
row.append(tree.cssselect('table >
tr#places_{}__row >
td.w2p_fw'.format(field))
[0].text_content())
self.writer.writerow(row)
  為了實(shí)現這個(gè)回調,我們使用回調類(lèi)而不是回調函數,以維護 csv 中 writer 屬性的狀態(tài)。在構造函數中實(shí)例化csv的writer屬性,然后在__call__方法中進(jìn)行多次寫(xiě)入。注意__call__是一個(gè)特殊的方法,當一個(gè)對象作為函數調用時(shí)會(huì )調用,這也是鏈接爬蟲(chóng)中cache_callback的調用方式。也就是說(shuō),scrape_callback(url, html) 等價(jià)于調用 scrape_callback.__call__(url, html)。如果想詳細了解Python的特殊類(lèi)方法,可以參考一下。
  以下是將回調傳遞給鏈接爬蟲(chóng)的代碼。
   link_crawler('http://example.webscraping.com/', '/(index|view)',
max_depth=-1, scrape_callback=ScrapeCallback())
  現在,當我們使用回調運行這個(gè)爬蟲(chóng)時(shí),程序會(huì )將結果寫(xiě)入 CSV 文件,我們可以使用 Excel 或 LibreOffice 等應用程序查看該文件,如圖 2.5 所示。
  
  成功!我們完成了我們的第一個(gè)工作數據抓取爬蟲(chóng)。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)4.2—ajax[動(dòng)態(tài)網(wǎng)頁(yè)數據]用法教程綜述)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 73 次瀏覽 ? 2022-04-19 15:05 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)4.2—ajax[動(dòng)態(tài)網(wǎng)頁(yè)數據]用法教程綜述)
  Python爬蟲(chóng)4.2——ajax【動(dòng)態(tài)網(wǎng)頁(yè)數據】使用教程
  概覽
  本系列文檔用于提供Python爬蟲(chóng)技術(shù)學(xué)習的簡(jiǎn)單教程。在鞏固你的技術(shù)知識的同時(shí),如果它恰好對你有用,那就更好了。
  Python 版本是 3.7.4
  有時(shí)當我們抓取帶有請求的頁(yè)面時(shí),結果可能與我們在瀏覽器中看到的不同。正常顯示的頁(yè)面數據在瀏覽器中是可以看到的,但是使用requests得到的結果卻不是。這是因為請求獲取的是原創(chuàng )的 HTML 文檔,而瀏覽器中的頁(yè)面是通過(guò) JavaScript 處理數據的結果。這些數據有多種來(lái)源,可以通過(guò) Ajax 加載或收錄在 HTML 中。在文檔中,也可能是通過(guò)JavaScript和特定算法計算后生成的。
  所以遇到這樣的頁(yè)面,直接使用requests等庫獲取原創(chuàng )頁(yè)面是無(wú)法獲取有效數據的。這時(shí)候就需要分析網(wǎng)頁(yè)后端向接口發(fā)送的Ajax請求了。如果可以使用requests來(lái)模擬ajax請求,那么就可以成功爬取了。
  所以,在這篇文章中,我們主要了解Ajax是什么以及如何分析和抓取Ajax請求。
  AJAX簡(jiǎn)介什么是AJAX
  AJAX(異步 JavaScript 和 XML)異步 JavaScript 和 XML。通過(guò)在后臺交換與服務(wù)器協(xié)商的數據,Ajax 實(shí)現了網(wǎng)頁(yè)的異步更新,這意味著(zhù)可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下更新網(wǎng)頁(yè)的某些部分。傳統網(wǎng)頁(yè)(沒(méi)有Ajax)如果內容需要更新,需要重新加載整個(gè)網(wǎng)頁(yè),因為傳統的數據傳輸格式使用XML語(yǔ)法,所以稱(chēng)為Ajax。其實(shí)數據交互的限制基本上就是使用JSON,Ajax加載的數據,即使是用JS渲染數據到瀏覽器,查看網(wǎng)頁(yè)源碼的時(shí)候還是看不到加載的數據通過(guò) Ajax,您只能看到 Ajax 加載的數據。由 url 加載的 HTML 代碼。
  示例說(shuō)明
  在瀏覽網(wǎng)頁(yè)時(shí),我們會(huì )發(fā)現很多頁(yè)面已經(jīng)向下滾動(dòng)以查看更多選項。比如微博、今日頭條等,有的是根據鼠標下拉自動(dòng)加載的。這些其實(shí)就是Ajax加載的過(guò)程。我們可以看到頁(yè)面并沒(méi)有完全刷新,也就是說(shuō)頁(yè)面的鏈接沒(méi)有變化,但是網(wǎng)頁(yè)中有新的內容,也就是通過(guò)Ajax獲取新數據并渲染的過(guò)程。
  請求分析
  使用Chrome開(kāi)發(fā)者工具的過(guò)濾功能,過(guò)濾掉所有的Ajax請求,這里不再詳述。
  Fiddler 抓包工具也可以用于抓包分析。 Fiddler工具的使用方法這里不做說(shuō)明。您可以在線(xiàn)搜索和查看。
  Ajax 響應結果一般為 json 數據格式。
  獲取方式直接分析Ajax使用的接口,然后通過(guò)代碼請求這個(gè)接口獲取數據(下面的例子就是這樣一個(gè)通用的)。使用 Selenium + Chromedriver 模擬瀏覽器行為獲取數據(繼續關(guān)注文章)。該方法的優(yōu)缺點(diǎn)
  分析界面
  可以直接請求數據,不需要做一些解析工作,代碼少,性能高。
  分析界面比較復雜,尤其是一些被js混淆的界面,你必須對js有一定的了解,很容易被爬蟲(chóng)發(fā)現。
  硒
  直接模擬瀏覽器的行為。瀏覽器能請求的也可以用selenium來(lái)請求,爬蟲(chóng)更穩定。
  大量代碼和低性能。
  示例說(shuō)明
  讓我們舉個(gè)例子,爬取“成為一個(gè)長(cháng)得好看的程序員是什么感覺(jué)?”這個(gè)問(wèn)題的所有答案。在問(wèn)題 知乎 下。示例代碼如下:
<p># 引入所需庫
import json
import requests
# 聲明定義請求頭
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, '
'like Gecko) Chrome/67.0.3396.99 '
'Safari/537.36',
'Host': "www.zhihu.com",
'Referer': "https://www.zhihu.com/question/37787176"
}
def answer(url_):
"""
獲取問(wèn)題答案
:param url_:
:return:
"""
r = requests.get(url_, headers=header)
data = r.text
jsonobj = json.loads(data)
return jsonobj
# 問(wèn)題答案接口地址
url = "https://www.zhihu.com/api/v4/q ... ot%3B
# 獲取回答總數
answer_total = int(answer(url)['paging']['totals'])
offset = 0
while offset 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)4.2—ajax[動(dòng)態(tài)網(wǎng)頁(yè)數據]用法教程綜述)
  Python爬蟲(chóng)4.2——ajax【動(dòng)態(tài)網(wǎng)頁(yè)數據】使用教程
  概覽
  本系列文檔用于提供Python爬蟲(chóng)技術(shù)學(xué)習的簡(jiǎn)單教程。在鞏固你的技術(shù)知識的同時(shí),如果它恰好對你有用,那就更好了。
  Python 版本是 3.7.4
  有時(shí)當我們抓取帶有請求的頁(yè)面時(shí),結果可能與我們在瀏覽器中看到的不同。正常顯示的頁(yè)面數據在瀏覽器中是可以看到的,但是使用requests得到的結果卻不是。這是因為請求獲取的是原創(chuàng )的 HTML 文檔,而瀏覽器中的頁(yè)面是通過(guò) JavaScript 處理數據的結果。這些數據有多種來(lái)源,可以通過(guò) Ajax 加載或收錄在 HTML 中。在文檔中,也可能是通過(guò)JavaScript和特定算法計算后生成的。
  所以遇到這樣的頁(yè)面,直接使用requests等庫獲取原創(chuàng )頁(yè)面是無(wú)法獲取有效數據的。這時(shí)候就需要分析網(wǎng)頁(yè)后端向接口發(fā)送的Ajax請求了。如果可以使用requests來(lái)模擬ajax請求,那么就可以成功爬取了。
  所以,在這篇文章中,我們主要了解Ajax是什么以及如何分析和抓取Ajax請求。
  AJAX簡(jiǎn)介什么是AJAX
  AJAX(異步 JavaScript 和 XML)異步 JavaScript 和 XML。通過(guò)在后臺交換與服務(wù)器協(xié)商的數據,Ajax 實(shí)現了網(wǎng)頁(yè)的異步更新,這意味著(zhù)可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下更新網(wǎng)頁(yè)的某些部分。傳統網(wǎng)頁(yè)(沒(méi)有Ajax)如果內容需要更新,需要重新加載整個(gè)網(wǎng)頁(yè),因為傳統的數據傳輸格式使用XML語(yǔ)法,所以稱(chēng)為Ajax。其實(shí)數據交互的限制基本上就是使用JSON,Ajax加載的數據,即使是用JS渲染數據到瀏覽器,查看網(wǎng)頁(yè)源碼的時(shí)候還是看不到加載的數據通過(guò) Ajax,您只能看到 Ajax 加載的數據。由 url 加載的 HTML 代碼。
  示例說(shuō)明
  在瀏覽網(wǎng)頁(yè)時(shí),我們會(huì )發(fā)現很多頁(yè)面已經(jīng)向下滾動(dòng)以查看更多選項。比如微博、今日頭條等,有的是根據鼠標下拉自動(dòng)加載的。這些其實(shí)就是Ajax加載的過(guò)程。我們可以看到頁(yè)面并沒(méi)有完全刷新,也就是說(shuō)頁(yè)面的鏈接沒(méi)有變化,但是網(wǎng)頁(yè)中有新的內容,也就是通過(guò)Ajax獲取新數據并渲染的過(guò)程。
  請求分析
  使用Chrome開(kāi)發(fā)者工具的過(guò)濾功能,過(guò)濾掉所有的Ajax請求,這里不再詳述。
  Fiddler 抓包工具也可以用于抓包分析。 Fiddler工具的使用方法這里不做說(shuō)明。您可以在線(xiàn)搜索和查看。
  Ajax 響應結果一般為 json 數據格式。
  獲取方式直接分析Ajax使用的接口,然后通過(guò)代碼請求這個(gè)接口獲取數據(下面的例子就是這樣一個(gè)通用的)。使用 Selenium + Chromedriver 模擬瀏覽器行為獲取數據(繼續關(guān)注文章)。該方法的優(yōu)缺點(diǎn)
  分析界面
  可以直接請求數據,不需要做一些解析工作,代碼少,性能高。
  分析界面比較復雜,尤其是一些被js混淆的界面,你必須對js有一定的了解,很容易被爬蟲(chóng)發(fā)現。
  硒
  直接模擬瀏覽器的行為。瀏覽器能請求的也可以用selenium來(lái)請求,爬蟲(chóng)更穩定。
  大量代碼和低性能。
  示例說(shuō)明
  讓我們舉個(gè)例子,爬取“成為一個(gè)長(cháng)得好看的程序員是什么感覺(jué)?”這個(gè)問(wèn)題的所有答案。在問(wèn)題 知乎 下。示例代碼如下:
<p># 引入所需庫
import json
import requests
# 聲明定義請求頭
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, '
'like Gecko) Chrome/67.0.3396.99 '
'Safari/537.36',
'Host': "www.zhihu.com",
'Referer': "https://www.zhihu.com/question/37787176"
}
def answer(url_):
"""
獲取問(wèn)題答案
:param url_:
:return:
"""
r = requests.get(url_, headers=header)
data = r.text
jsonobj = json.loads(data)
return jsonobj
# 問(wèn)題答案接口地址
url = "https://www.zhihu.com/api/v4/q ... ot%3B
# 獲取回答總數
answer_total = int(answer(url)['paging']['totals'])
offset = 0
while offset

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 二級建造師考試每日一練免費在線(xiàn)測試())

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 50 次瀏覽 ? 2022-04-19 01:12 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
二級建造師考試每日一練免費在線(xiàn)測試())
  
  更多《搜索引擎利用網(wǎng)絡(luò )爬蟲(chóng)不斷從網(wǎng)上爬取網(wǎng)站數據,并在本地存儲網(wǎng)站圖片。()》相關(guān)問(wèn)題
  問(wèn)題 1
  以下關(guān)于蜘蛛的說(shuō)法錯誤的是( )。
  A. 蜘蛛是搜索引擎的網(wǎng)絡(luò )爬蟲(chóng)
  灣。每個(gè)搜索引擎蜘蛛都有不同的名稱(chēng)
  C。網(wǎng)站被搜索引擎降級后蜘蛛再也不會(huì )來(lái)這里了網(wǎng)站
  D.站長(cháng)可以通過(guò)技術(shù)等優(yōu)化吸引蜘蛛爬行
  點(diǎn)擊查看答案
  問(wèn)題2
  動(dòng)態(tài) URL 幫助搜索引擎抓取網(wǎng)頁(yè)并提高 網(wǎng)站 排名。()
  點(diǎn)擊查看答案
  問(wèn)題 3
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  A. 小網(wǎng)站
  B. 中小型網(wǎng)站
  C. 大 網(wǎng)站
  D. 中型和大型 網(wǎng)站
  點(diǎn)擊查看答案
  問(wèn)題 4
  HTML版本的網(wǎng)站map只適合搜索引擎蜘蛛抓取,不利于用戶(hù)體驗。()
  點(diǎn)擊查看答案
  問(wèn)題 5
  以下關(guān)于網(wǎng)絡(luò )爬蟲(chóng)的描述是錯誤的()。
  A. 網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)提取網(wǎng)頁(yè)的程序
  B. 為搜索引擎從萬(wàn)維網(wǎng)上下載網(wǎng)頁(yè)是搜索引擎的重要組成部分
  C、爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。
  D.網(wǎng)絡(luò )爬蟲(chóng)的行為與訪(fǎng)問(wèn)網(wǎng)站的人的行為完全不同
  點(diǎn)擊查看答案
  問(wèn)題 6
  如果通過(guò)爬蟲(chóng)抓取某公司網(wǎng)站的公開(kāi)數據,分析后發(fā)現該公司的業(yè)績(jì)非常好。然后將數據或分析結果出售給基金公司,獲得銷(xiāo)售收入。這是合法的。()
  點(diǎn)擊查看答案
  問(wèn)題 7
  網(wǎng)絡(luò )數據采集常用來(lái)通過(guò)()或()的方式從網(wǎng)站獲取數據信息。
  A. 網(wǎng)絡(luò )爬蟲(chóng)
  灣。網(wǎng)站公共 API
  C。手動(dòng)獲取
  點(diǎn)擊查看答案
  問(wèn)題 8
  爬蟲(chóng)是手動(dòng)請求萬(wàn)維網(wǎng)網(wǎng)站并提取網(wǎng)頁(yè)數據的程序()
  點(diǎn)擊查看答案
  問(wèn)題 9
  網(wǎng)絡(luò )數據采集是利用互聯(lián)網(wǎng)搜索引擎技術(shù),有針對性、行業(yè)針對性、準確地抓取數據,并按照一定的規則和篩選標準對數據進(jìn)行分類(lèi),形成數據庫文件的過(guò)程。()
  點(diǎn)擊查看答案
  問(wèn)題 10
  搜索引擎營(yíng)銷(xiāo)主要用于網(wǎng)站推廣,不起到建立網(wǎng)絡(luò )品牌的作用。()
  點(diǎn)擊查看答案 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
二級建造師考試每日一練免費在線(xiàn)測試())
  
  更多《搜索引擎利用網(wǎng)絡(luò )爬蟲(chóng)不斷從網(wǎng)上爬取網(wǎng)站數據,并在本地存儲網(wǎng)站圖片。()》相關(guān)問(wèn)題
  問(wèn)題 1
  以下關(guān)于蜘蛛的說(shuō)法錯誤的是( )。
  A. 蜘蛛是搜索引擎的網(wǎng)絡(luò )爬蟲(chóng)
  灣。每個(gè)搜索引擎蜘蛛都有不同的名稱(chēng)
  C。網(wǎng)站被搜索引擎降級后蜘蛛再也不會(huì )來(lái)這里了網(wǎng)站
  D.站長(cháng)可以通過(guò)技術(shù)等優(yōu)化吸引蜘蛛爬行
  點(diǎn)擊查看答案
  問(wèn)題2
  動(dòng)態(tài) URL 幫助搜索引擎抓取網(wǎng)頁(yè)并提高 網(wǎng)站 排名。()
  點(diǎn)擊查看答案
  問(wèn)題 3
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  A. 小網(wǎng)站
  B. 中小型網(wǎng)站
  C. 大 網(wǎng)站
  D. 中型和大型 網(wǎng)站
  點(diǎn)擊查看答案
  問(wèn)題 4
  HTML版本的網(wǎng)站map只適合搜索引擎蜘蛛抓取,不利于用戶(hù)體驗。()
  點(diǎn)擊查看答案
  問(wèn)題 5
  以下關(guān)于網(wǎng)絡(luò )爬蟲(chóng)的描述是錯誤的()。
  A. 網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)提取網(wǎng)頁(yè)的程序
  B. 為搜索引擎從萬(wàn)維網(wǎng)上下載網(wǎng)頁(yè)是搜索引擎的重要組成部分
  C、爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。
  D.網(wǎng)絡(luò )爬蟲(chóng)的行為與訪(fǎng)問(wèn)網(wǎng)站的人的行為完全不同
  點(diǎn)擊查看答案
  問(wèn)題 6
  如果通過(guò)爬蟲(chóng)抓取某公司網(wǎng)站的公開(kāi)數據,分析后發(fā)現該公司的業(yè)績(jì)非常好。然后將數據或分析結果出售給基金公司,獲得銷(xiāo)售收入。這是合法的。()
  點(diǎn)擊查看答案
  問(wèn)題 7
  網(wǎng)絡(luò )數據采集常用來(lái)通過(guò)()或()的方式從網(wǎng)站獲取數據信息。
  A. 網(wǎng)絡(luò )爬蟲(chóng)
  灣。網(wǎng)站公共 API
  C。手動(dòng)獲取
  點(diǎn)擊查看答案
  問(wèn)題 8
  爬蟲(chóng)是手動(dòng)請求萬(wàn)維網(wǎng)網(wǎng)站并提取網(wǎng)頁(yè)數據的程序()
  點(diǎn)擊查看答案
  問(wèn)題 9
  網(wǎng)絡(luò )數據采集是利用互聯(lián)網(wǎng)搜索引擎技術(shù),有針對性、行業(yè)針對性、準確地抓取數據,并按照一定的規則和篩選標準對數據進(jìn)行分類(lèi),形成數據庫文件的過(guò)程。()
  點(diǎn)擊查看答案
  問(wèn)題 10
  搜索引擎營(yíng)銷(xiāo)主要用于網(wǎng)站推廣,不起到建立網(wǎng)絡(luò )品牌的作用。()
  點(diǎn)擊查看答案

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 在爬蟲(chóng)系統中,等待抓取URL隊列是很重要的)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-04-17 16:29 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在爬蟲(chóng)系統中,等待抓取URL隊列是很重要的)
  
  在爬蟲(chóng)系統中,等待爬取的URL隊列是一個(gè)非常重要的部分,而等待爬取的URL隊列中URL的順序也是一個(gè)非常重要的問(wèn)題,因為它會(huì )決定先爬到哪個(gè)頁(yè)面之后再爬取哪個(gè)頁(yè)面。而確定這些URL順序的方法稱(chēng)為爬取策略。下面主要介紹幾種常見(jiàn)的爬取策略:
  1 深度優(yōu)先遍歷策略:深度優(yōu)先遍歷策略是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,每一個(gè)鏈接一次一個(gè)鏈接,直到處理完該行才會(huì )轉到下一個(gè)起始頁(yè),并且繼續關(guān)注鏈接。遍歷路徑為:AFG ,EHI ,B ,C,D
  2 廣度優(yōu)先遍歷策略:廣度優(yōu)先遍歷策略的基本思想是將新下載的網(wǎng)頁(yè)中找到的鏈接直接放在待爬取的URL隊列的末尾。也就是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)會(huì )優(yōu)先抓取起始網(wǎng)頁(yè)中的所有鏈接。爬取完所有網(wǎng)頁(yè)后,選擇其中一個(gè)鏈接的網(wǎng)頁(yè),繼續爬取該網(wǎng)頁(yè)鏈接的所有網(wǎng)頁(yè)。它的路徑可以這樣寫(xiě):ABCDEF ,G ,H,I
  3 外鏈數策略:外鏈數是指一個(gè)網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的鏈接數,外鏈數也表示一個(gè)網(wǎng)頁(yè)的內容被他人推薦的程度. 抓取系統會(huì )使用這個(gè)指標來(lái)評估網(wǎng)頁(yè)的重要性,從而確定不同網(wǎng)頁(yè)的抓取順序。
  但是,在真實(shí)的網(wǎng)絡(luò )環(huán)境中,由于存在很多廣告鏈接、作弊鏈接等,反向鏈接的數量并不能完全等同于重要性。因此,很多搜索引擎經(jīng)常會(huì )考慮一些可靠的反向鏈接。
  4.OPIC策略策略:這個(gè)算法其實(shí)是給網(wǎng)頁(yè)的重要性打分的。在算法開(kāi)始之前,所有頁(yè)面都會(huì )被賦予相同的初始現金(cash)。當一個(gè)頁(yè)面 P 被下載后,將 P 的現金分配給從 P 分析的所有鏈接,并清除 P 的現金。URL隊列中所有待爬取的頁(yè)面,按照現金數量排序。
  5.大站點(diǎn)優(yōu)先策略:對URL隊列中所有待爬取的網(wǎng)頁(yè),按照所屬的網(wǎng)站進(jìn)行分類(lèi)。對于需要下載的頁(yè)面較多的網(wǎng)站,請先下載。這種策略也被稱(chēng)為大站優(yōu)先策略。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在爬蟲(chóng)系統中,等待抓取URL隊列是很重要的)
  
  在爬蟲(chóng)系統中,等待爬取的URL隊列是一個(gè)非常重要的部分,而等待爬取的URL隊列中URL的順序也是一個(gè)非常重要的問(wèn)題,因為它會(huì )決定先爬到哪個(gè)頁(yè)面之后再爬取哪個(gè)頁(yè)面。而確定這些URL順序的方法稱(chēng)為爬取策略。下面主要介紹幾種常見(jiàn)的爬取策略:
  1 深度優(yōu)先遍歷策略:深度優(yōu)先遍歷策略是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,每一個(gè)鏈接一次一個(gè)鏈接,直到處理完該行才會(huì )轉到下一個(gè)起始頁(yè),并且繼續關(guān)注鏈接。遍歷路徑為:AFG ,EHI ,B ,C,D
  2 廣度優(yōu)先遍歷策略:廣度優(yōu)先遍歷策略的基本思想是將新下載的網(wǎng)頁(yè)中找到的鏈接直接放在待爬取的URL隊列的末尾。也就是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)會(huì )優(yōu)先抓取起始網(wǎng)頁(yè)中的所有鏈接。爬取完所有網(wǎng)頁(yè)后,選擇其中一個(gè)鏈接的網(wǎng)頁(yè),繼續爬取該網(wǎng)頁(yè)鏈接的所有網(wǎng)頁(yè)。它的路徑可以這樣寫(xiě):ABCDEF ,G ,H,I
  3 外鏈數策略:外鏈數是指一個(gè)網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的鏈接數,外鏈數也表示一個(gè)網(wǎng)頁(yè)的內容被他人推薦的程度. 抓取系統會(huì )使用這個(gè)指標來(lái)評估網(wǎng)頁(yè)的重要性,從而確定不同網(wǎng)頁(yè)的抓取順序。
  但是,在真實(shí)的網(wǎng)絡(luò )環(huán)境中,由于存在很多廣告鏈接、作弊鏈接等,反向鏈接的數量并不能完全等同于重要性。因此,很多搜索引擎經(jīng)常會(huì )考慮一些可靠的反向鏈接。
  4.OPIC策略策略:這個(gè)算法其實(shí)是給網(wǎng)頁(yè)的重要性打分的。在算法開(kāi)始之前,所有頁(yè)面都會(huì )被賦予相同的初始現金(cash)。當一個(gè)頁(yè)面 P 被下載后,將 P 的現金分配給從 P 分析的所有鏈接,并清除 P 的現金。URL隊列中所有待爬取的頁(yè)面,按照現金數量排序。
  5.大站點(diǎn)優(yōu)先策略:對URL隊列中所有待爬取的網(wǎng)頁(yè),按照所屬的網(wǎng)站進(jìn)行分類(lèi)。對于需要下載的頁(yè)面較多的網(wǎng)站,請先下載。這種策略也被稱(chēng)為大站優(yōu)先策略。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(農村最恐怖的還是螞蝗,它無(wú)處不在吸你多少血了)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 46 次瀏覽 ? 2022-04-15 06:33 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(農村最恐怖的還是螞蝗,它無(wú)處不在吸你多少血了)
  農村最可怕的就是水蛭,到處都是。當它無(wú)意識地咬你,當你感覺(jué)到它。我不知道我從你身上吸了多少血,也吸不出來(lái)。你要拍它才肯下來(lái),這東西更可怕。只是不容易死。你把它分成幾段。
  它也不會(huì )死,記得我小時(shí)候。我們的幾個(gè)朋友去堰和池塘洗澡。沒(méi)學(xué)過(guò)游泳,只是邊玩邊玩。洗漱完畢,上岸。他的屁股上有一只巨大的水蛭,嚇得他哭了。這東西吸血,太可怕了,惡心。農村的大人小孩都害怕。
  尤其是女孩子,她們的父母讓她幫忙種水稻。先問(wèn)有沒(méi)有螞蟥,殺了就不去了。大人就好了,習慣就好。如果你看到幾個(gè)耳光,就一拍即合。我們小時(shí)候被咬過(guò)很多次,很多次。我倒不是太害怕,我只是看到自己吸了那么多血。
  有點(diǎn)疼,現在稻田里沒(méi)有那么多水蛭了。稻谷是用收割機收割的,是時(shí)候收割了。在收割機下田收割之前,必須排干稻田中的所有水。沒(méi)有水,水蛭就會(huì )減少。動(dòng)物只有在有水的情況下才能吸血。我希望這東西可以滅絕。
  python爬蟲(chóng)是怎么做的?
  從各種搜索引擎到日常小數據采集,都離不開(kāi)網(wǎng)絡(luò )爬蟲(chóng)。爬蟲(chóng)的基本原理很簡(jiǎn)單。它遍歷網(wǎng)絡(luò )中的網(wǎng)頁(yè)并抓取感興趣的數據內容。本篇文章將介紹如何編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)從零開(kāi)始爬取數據,進(jìn)而逐步完善爬蟲(chóng)的爬取功能。
  工具安裝
  我們需要安裝python、python的requests和BeautifulSoup庫。我們使用 Requests 庫來(lái)抓取網(wǎng)頁(yè)內容,并使用 BeautifulSoup 庫從網(wǎng)頁(yè)中提取數據。
  安裝蟒蛇
  運行 pip 安裝請求
  運行 pip install BeautifulSoup
  爬網(wǎng)
  完成必要工具的安裝后,我們就正式開(kāi)始編寫(xiě)我們的爬蟲(chóng)了。我們的首要任務(wù)是抓取豆瓣上的所有圖書(shū)信息。我們以它為例,首先看一下如何爬取網(wǎng)頁(yè)的內容。
  使用python的requests提供的get()方法,我們可以很方便的獲取到指定網(wǎng)頁(yè)的內容。代碼如下:
  提取內容
  爬取網(wǎng)頁(yè)內容后,我們要做的就是提取我們想要的內容。在我們的第一個(gè)示例中,我們只需要提取書(shū)名。首先,我們導入 BeautifulSoup 庫。使用 BeautifulSoup,我們可以輕松提取網(wǎng)頁(yè)的具體內容。
  連續爬網(wǎng)
  至此,我們已經(jīng)可以爬取單個(gè)頁(yè)面的內容了,下面我們來(lái)看看如何爬取整個(gè)網(wǎng)站的內容。我們知道網(wǎng)頁(yè)是通過(guò)超鏈接相互連接的,通過(guò)超鏈接我們可以訪(fǎng)問(wèn)整個(gè)網(wǎng)絡(luò )。所以我們可以從每個(gè)頁(yè)面中提取到其他頁(yè)面的鏈接,然后反復爬取新的鏈接。
  通過(guò)以上步驟,我們就可以寫(xiě)出一個(gè)最原創(chuàng )的爬蟲(chóng)了。在了解爬蟲(chóng)原理的基礎上,我們可以進(jìn)一步完善爬蟲(chóng)。
  寫(xiě)了一個(gè)關(guān)于爬蟲(chóng)的系列文章:。如果你有興趣,你可以去看看。
  Python基礎環(huán)境搭建、爬蟲(chóng)基本原理及爬蟲(chóng)原型
  Python 爬蟲(chóng)入門(mén)(第 1 部分)
  如何使用 BeautifulSoup 提取網(wǎng)頁(yè)內容
  Python 爬蟲(chóng)入門(mén)(第 2 部分)
  爬蟲(chóng)運行時(shí)數據的存儲數據,以 SQLite 和 MySQL 為例
  Python 爬蟲(chóng)入門(mén)(第 3 部分)
  使用 selenium webdriver 抓取動(dòng)態(tài)網(wǎng)頁(yè)
  Python 爬蟲(chóng)入門(mén)(第 4 部分)
  討論了如何處理網(wǎng)站的反爬策略
  Python 爬蟲(chóng)入門(mén)(第 5 部分)
  介紹了Python的Scrapy爬蟲(chóng)框架,并簡(jiǎn)要演示了如何在Scrapy下開(kāi)發(fā)
  Python 爬蟲(chóng)入門(mén)(第 6 部分) 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(農村最恐怖的還是螞蝗,它無(wú)處不在吸你多少血了)
  農村最可怕的就是水蛭,到處都是。當它無(wú)意識地咬你,當你感覺(jué)到它。我不知道我從你身上吸了多少血,也吸不出來(lái)。你要拍它才肯下來(lái),這東西更可怕。只是不容易死。你把它分成幾段。
  它也不會(huì )死,記得我小時(shí)候。我們的幾個(gè)朋友去堰和池塘洗澡。沒(méi)學(xué)過(guò)游泳,只是邊玩邊玩。洗漱完畢,上岸。他的屁股上有一只巨大的水蛭,嚇得他哭了。這東西吸血,太可怕了,惡心。農村的大人小孩都害怕。
  尤其是女孩子,她們的父母讓她幫忙種水稻。先問(wèn)有沒(méi)有螞蟥,殺了就不去了。大人就好了,習慣就好。如果你看到幾個(gè)耳光,就一拍即合。我們小時(shí)候被咬過(guò)很多次,很多次。我倒不是太害怕,我只是看到自己吸了那么多血。
  有點(diǎn)疼,現在稻田里沒(méi)有那么多水蛭了。稻谷是用收割機收割的,是時(shí)候收割了。在收割機下田收割之前,必須排干稻田中的所有水。沒(méi)有水,水蛭就會(huì )減少。動(dòng)物只有在有水的情況下才能吸血。我希望這東西可以滅絕。
  python爬蟲(chóng)是怎么做的?
  從各種搜索引擎到日常小數據采集,都離不開(kāi)網(wǎng)絡(luò )爬蟲(chóng)。爬蟲(chóng)的基本原理很簡(jiǎn)單。它遍歷網(wǎng)絡(luò )中的網(wǎng)頁(yè)并抓取感興趣的數據內容。本篇文章將介紹如何編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)從零開(kāi)始爬取數據,進(jìn)而逐步完善爬蟲(chóng)的爬取功能。
  工具安裝
  我們需要安裝python、python的requests和BeautifulSoup庫。我們使用 Requests 庫來(lái)抓取網(wǎng)頁(yè)內容,并使用 BeautifulSoup 庫從網(wǎng)頁(yè)中提取數據。
  安裝蟒蛇
  運行 pip 安裝請求
  運行 pip install BeautifulSoup
  爬網(wǎng)
  完成必要工具的安裝后,我們就正式開(kāi)始編寫(xiě)我們的爬蟲(chóng)了。我們的首要任務(wù)是抓取豆瓣上的所有圖書(shū)信息。我們以它為例,首先看一下如何爬取網(wǎng)頁(yè)的內容。
  使用python的requests提供的get()方法,我們可以很方便的獲取到指定網(wǎng)頁(yè)的內容。代碼如下:
  提取內容
  爬取網(wǎng)頁(yè)內容后,我們要做的就是提取我們想要的內容。在我們的第一個(gè)示例中,我們只需要提取書(shū)名。首先,我們導入 BeautifulSoup 庫。使用 BeautifulSoup,我們可以輕松提取網(wǎng)頁(yè)的具體內容。
  連續爬網(wǎng)
  至此,我們已經(jīng)可以爬取單個(gè)頁(yè)面的內容了,下面我們來(lái)看看如何爬取整個(gè)網(wǎng)站的內容。我們知道網(wǎng)頁(yè)是通過(guò)超鏈接相互連接的,通過(guò)超鏈接我們可以訪(fǎng)問(wèn)整個(gè)網(wǎng)絡(luò )。所以我們可以從每個(gè)頁(yè)面中提取到其他頁(yè)面的鏈接,然后反復爬取新的鏈接。
  通過(guò)以上步驟,我們就可以寫(xiě)出一個(gè)最原創(chuàng )的爬蟲(chóng)了。在了解爬蟲(chóng)原理的基礎上,我們可以進(jìn)一步完善爬蟲(chóng)。
  寫(xiě)了一個(gè)關(guān)于爬蟲(chóng)的系列文章:。如果你有興趣,你可以去看看。
  Python基礎環(huán)境搭建、爬蟲(chóng)基本原理及爬蟲(chóng)原型
  Python 爬蟲(chóng)入門(mén)(第 1 部分)
  如何使用 BeautifulSoup 提取網(wǎng)頁(yè)內容
  Python 爬蟲(chóng)入門(mén)(第 2 部分)
  爬蟲(chóng)運行時(shí)數據的存儲數據,以 SQLite 和 MySQL 為例
  Python 爬蟲(chóng)入門(mén)(第 3 部分)
  使用 selenium webdriver 抓取動(dòng)態(tài)網(wǎng)頁(yè)
  Python 爬蟲(chóng)入門(mén)(第 4 部分)
  討論了如何處理網(wǎng)站的反爬策略
  Python 爬蟲(chóng)入門(mén)(第 5 部分)
  介紹了Python的Scrapy爬蟲(chóng)框架,并簡(jiǎn)要演示了如何在Scrapy下開(kāi)發(fā)
  Python 爬蟲(chóng)入門(mén)(第 6 部分)

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(imarowadtencc語(yǔ)言treefindall抓取國家面積數據的方法-蘇州安嘉)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-04-15 06:09 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(imarowadtencc語(yǔ)言treefindall抓取國家面積數據的方法-蘇州安嘉)
  標簽: imarowadtencc 語(yǔ)言 treefindall 將是新版本
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  ? 如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  ?當我們使用正則表達式抓取國家地區數據時(shí),我們首先嘗試匹配元素中的內容,像這樣:
  >>> import re
>>> import urllib2
>>> url = ‘http://example.webscraping.com ... m-239‘
>>> html = urllib2.urlopen(url).read()
>>> re.findall(‘(.*?)‘, html)
[‘‘, ‘244,820 square kilometres‘, ‘62,348,447‘, ‘GB‘, ‘United Kingdom‘, ‘London‘, ‘EU‘, ‘.uk‘, ‘GBP‘, ‘Pound‘, ‘44‘, ‘@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA‘, ‘^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$‘, ‘en-GB,cy-GB,gd‘, ‘IE ‘]
>>>
  ? 從以上結果可以看出,&lt;td class=”w2p_fw” &gt; 標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall(‘(.*?)‘, html)[1]
‘244,820 square kilometres‘
  ? 雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素 &lt;tr&gt;。由于元素具有 ID 屬性,因此它應該是唯一的。
  &gt;&gt;&gt; re.findall('Area: (.*?)', html)['244820平方公里'] Python爬蟲(chóng)三種網(wǎng)絡(luò )爬取方式的性能對比 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(imarowadtencc語(yǔ)言treefindall抓取國家面積數據的方法-蘇州安嘉)
  標簽: imarowadtencc 語(yǔ)言 treefindall 將是新版本
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  ? 如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  ?當我們使用正則表達式抓取國家地區數據時(shí),我們首先嘗試匹配元素中的內容,像這樣:
  >>> import re
>>> import urllib2
>>> url = ‘http://example.webscraping.com ... m-239
>>> html = urllib2.urlopen(url).read()
>>> re.findall(‘(.*?)‘, html)
[‘‘, ‘244,820 square kilometres‘, ‘62,348,447‘, ‘GB‘, ‘United Kingdom‘, ‘London‘, ‘EU‘, ‘.uk‘, ‘GBP‘, ‘Pound‘, ‘44‘, ‘@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA‘, ‘^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$‘, ‘en-GB,cy-GB,gd‘, ‘IE ‘]
>>>
  ? 從以上結果可以看出,&lt;td class=”w2p_fw” &gt; 標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall(‘(.*?)‘, html)[1]
‘244,820 square kilometres‘
  ? 雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素 &lt;tr&gt;。由于元素具有 ID 屬性,因此它應該是唯一的。
  &gt;&gt;&gt; re.findall('Area: (.*?)', html)['244820平方公里'] Python爬蟲(chóng)三種網(wǎng)絡(luò )爬取方式的性能對比

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(我組開(kāi)發(fā)遺留下來(lái)的分類(lèi)保存到的文件和扒取)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-04-14 14:01 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(我組開(kāi)發(fā)遺留下來(lái)的分類(lèi)保存到的文件和扒取)
  2021-09-27
  需要:
  我們組的研究課題是編寫(xiě)一個(gè)更實(shí)用的爬蟲(chóng)軟件,將其應用到一些前輩的代碼中,并在此基礎上進(jìn)行完善和創(chuàng )新。
  鑒于高級代碼已經(jīng)實(shí)現了基本功能,即從網(wǎng)站中爬取相關(guān)Word文檔和其他計算機相關(guān)文件資料,過(guò)濾掉無(wú)關(guān)信息。我組將從以下幾個(gè)方面著(zhù)手改進(jìn)和完善:
  1.增強的去廣告功能:
  如今的網(wǎng)頁(yè)情況,很多網(wǎng)頁(yè),包括貼吧、微博都充斥著(zhù)廣告,其中一些不可避免地與電腦有關(guān),但這些廣告的作用并沒(méi)有實(shí)際意義。高級代碼中確實(shí)有相應的刪除廣告的功能,但效果并不明顯。在很多情況下,無(wú)法識別網(wǎng)絡(luò )廣告和實(shí)際有用的信息,因此會(huì )出現一些數據浪費或數據丟失。. 針對這種情況,我們小組決定對其廣告過(guò)濾功能進(jìn)行改進(jìn)和修改。
  2.按類(lèi)別保存提取的文件:
  對爬蟲(chóng)抓取的數據進(jìn)行分類(lèi)非常重要。學(xué)長(cháng)的代碼中,獲取的數據沒(méi)有入庫分類(lèi)存儲,給下一組的開(kāi)發(fā)留下了一些問(wèn)題。,我組研究后認為應該增加保存黨的分類(lèi)的功能。
  3.添加視頻采集功能:
  前輩的代碼只實(shí)現了部分文本文件的提取,并沒(méi)有進(jìn)行視頻數據的提取。但是由于網(wǎng)上很多視頻都有相應的版權問(wèn)題,而且大部分視頻占用了很大的硬盤(pán)容量,所以我們會(huì )抓取視頻的地址并存入數據庫。
  4.CSS 和 Javascript網(wǎng)站:
  在原創(chuàng )代碼中,只能抓取 HTTP6 網(wǎng)頁(yè)。我們認為數據采集將過(guò)于有限。因此,我們想在這個(gè)問(wèn)題中加入 CSS 和 Javascript 網(wǎng)站 的抓取功能。生成大量的代碼工作量,只是一個(gè)初步的想法。
  5.網(wǎng)頁(yè)質(zhì)量判斷:
  有些網(wǎng)站由于缺乏相關(guān)的和計算機知識的內容,重復搜索只會(huì )造成時(shí)間和資源的浪費。針對這種情況,我們認為應該增加一個(gè)判斷網(wǎng)頁(yè)質(zhì)量的功能,把不合適的網(wǎng)站去掉,提高軟件運行效率。
  方法(實(shí)踐):
  1.對于抓取到的網(wǎng)站,獲取URL,查看下一級網(wǎng)站的AD字段以及下一級網(wǎng)站與關(guān)鍵字的關(guān)聯(lián)度
  上學(xué)年對這個(gè)項目的評測中,去廣告的功能并不完善,還夾雜了很多廣告。他們在博客上寫(xiě)道,說(shuō)是根據AD領(lǐng)域來(lái)判斷這是否網(wǎng)站 是一個(gè)廣告網(wǎng)站。我們覺(jué)得如果只根據AD字段來(lái)判斷,有可能在網(wǎng)站中間的網(wǎng)站中抓取一些無(wú)用的廣告。因此,我們覺(jué)得應該再往下檢查一級。如果下一級網(wǎng)站中有??很多廣告網(wǎng)站,則排除這個(gè)網(wǎng)站。因為我們考慮到如果投放了一個(gè)廣告,最多會(huì )經(jīng)過(guò)一次網(wǎng)站傳輸,否則廣告投放是不會(huì )生效的。因此,我們考慮多一個(gè)檢測級別的方法,這應該可以在很大程度上解決問(wèn)題。得到的網(wǎng)站中的廣告有很多問(wèn)題。
  2.抓取的不同文件會(huì )根據文件格式的不同分別保存(先按文件夾分開(kāi))
  捕獲的 網(wǎng)站 根據它們與關(guān)鍵字的相關(guān)性進(jìn)行分級和排序。上學(xué)年項目負責組評價(jià)寫(xiě)道,該組抓到的文件沒(méi)有分類(lèi),所有文件都混在一起,給用戶(hù)使用帶來(lái)不便。我們想在這個(gè)軟件中添加一個(gè)對捕獲的文件進(jìn)行分類(lèi)和存儲的功能。當某個(gè)文件被抓取時(shí),會(huì )根據文件的類(lèi)型,將其放置在該文件所在的存儲區域中,從而完成軟件運行。之后得到分類(lèi)文件,方便用戶(hù)使用。
  3.提供視頻鏈接,以便用戶(hù)觀(guān)看源視頻
  上一組沒(méi)有完成相關(guān)視頻的爬取功能。我們認為,如果它是一個(gè)網(wǎng)絡(luò )爬蟲(chóng),它的初衷是為互聯(lián)網(wǎng)上的用戶(hù)爬取有用的資源,而現在視頻資源也很重要。因此,我們要增加視頻捕捉功能。與內容和關(guān)鍵詞相關(guān)的視頻也會(huì )反饋給用戶(hù),以便用戶(hù)觀(guān)看相關(guān)視頻。
  4.CSS 和 Javascript網(wǎng)站
  暫定。
  5.檢查關(guān)鍵詞是否出現在被捕獲的網(wǎng)站或者文件的標題中,如果在被捕獲的網(wǎng)站或者文件的文本中頻繁出現,用這個(gè)來(lái)判斷此 網(wǎng)站 或文件的值給用戶(hù)
  我們認為,如果我們抓取其中出現關(guān)鍵詞的所有資源,我們可能會(huì )抓取一些網(wǎng)站或不相關(guān)但出現關(guān)鍵詞的文件,但在排除網(wǎng)站@之后&gt; 以及對用戶(hù)來(lái)說(shuō)價(jià)值不大的文件,通過(guò)以上方法,我們抓取的東西質(zhì)量會(huì )大大提高。
  好處(好處):
  1.能夠更好地從結果中去除廣告網(wǎng)站,優(yōu)化用戶(hù)體驗
  去除廣告是我們爬蟲(chóng)非常重要的功能。爬蟲(chóng)的初衷是為用戶(hù)高效地爬取互聯(lián)網(wǎng)上有用的相關(guān)資源。如果可爬取資源中有大量的廣告,會(huì )讓用戶(hù)的瀏覽很不方便,也就失去了爬蟲(chóng)的意義。. 我們將檢查到下一個(gè)級別網(wǎng)站,并使用此方法排除廣告網(wǎng)站。這樣可以提高抓取資源的質(zhì)量,用戶(hù)可以更方便的使用爬蟲(chóng)的功能。
  2.讓用戶(hù)更容易找到資源
  如果爬蟲(chóng)把所有抓取到的資源放在一起,當用戶(hù)需要一個(gè)格式單一的文件時(shí)會(huì )很麻煩。我們將采集到的資源按照類(lèi)型分別保存,讓用戶(hù)可以更方便的使用軟件,獲得更好的用戶(hù)體驗。
  3.讓用戶(hù)可以觀(guān)看相關(guān)視頻
  這是一個(gè)全新的功能。之前的版本無(wú)法采集視頻資源。雖然由于版權原因我們無(wú)法完全下載視頻,但我們可以為用戶(hù)提供源視頻的鏈接,以便用戶(hù)觀(guān)看?,F在互聯(lián)網(wǎng)上有很多資源以視頻的形式存在。我們加入這個(gè)功能是為了讓這個(gè)軟件更實(shí)用,更能滿(mǎn)足用戶(hù)不斷增長(cháng)的需求。
  4.不限于HTML5網(wǎng)站,可以獲得更多資源(暫定)
  目前的版本只能爬取HTML5的網(wǎng)站,但是網(wǎng)站里面也有很多有用的資源是用javascript或者css的。我們更新了這個(gè)軟件,支持javascript和css,可以讓爬蟲(chóng)抓取更多的資源,為用戶(hù)提供更多的服務(wù)。
  5.提高采集結果的質(zhì)量,增加剔除低質(zhì)量資源的功能(暫定)
  如果只關(guān)注捕獲文件的數量和網(wǎng)站,可能會(huì )導致捕獲文件和網(wǎng)站的質(zhì)量很差,但是會(huì )減少結果中有用的文件和網(wǎng)站里面的成分讓用戶(hù)體驗更差。我們將通過(guò)檢測關(guān)鍵詞是否出現在其標題及其出現頻率等方法來(lái)確定該文件或網(wǎng)站對用戶(hù)的價(jià)值。如果值不高,那么這個(gè)文件或 網(wǎng)站 @> 被排除。這將使我們能夠抓取更高質(zhì)量的文件和 網(wǎng)站。
  競爭對手:
  網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)獲取網(wǎng)頁(yè)內容的程序,是搜索引擎的重要組成部分?,F在的搜索引擎基本上都涉及到爬蟲(chóng)的設計和優(yōu)化。搜索引擎的速度也與爬蟲(chóng)的優(yōu)化程度密切相關(guān)。從另一個(gè)角度來(lái)看,不僅僅是搜索引擎,所有的數據挖掘軟件都會(huì )涉及到爬蟲(chóng)。因此,爬蟲(chóng)在整個(gè)軟件行業(yè)的地位很高,應用范圍非常廣泛。這里我們主要通過(guò)搜索引擎中的爬蟲(chóng)來(lái)分析競爭。
  首先,拿兩個(gè)最常用的搜索引擎:百度和谷歌。從爬取信息來(lái)看,兩者都是行業(yè)的佼佼者,爬取算法也很不錯,可以按類(lèi)型分類(lèi)。,以方便用戶(hù)操作。它爬取整個(gè)萬(wàn)維網(wǎng)的速度非???。雖然我們的軟件在速度和爬取算法方面還不是很成熟,但是我們的軟件會(huì )為了方便用戶(hù)而設計。我們會(huì )檢查爬取文件的匹配度,對它們的優(yōu)先級進(jìn)行排序。這也將大大提高用戶(hù)體驗的質(zhì)量。我將從以下幾個(gè)方面來(lái)討論我們軟件的競爭力。
  1.爬行速度和爬行負載,這也是衡量爬蟲(chóng)的標準
  與其他軟件相比,我們的軟件在速度上還不錯。我們通過(guò)廣度優(yōu)先的搜索順序進(jìn)行搜索,可以提高爬蟲(chóng)的爬取速度。同時(shí),我們使用多個(gè)隊列進(jìn)行數據處理,這也使得爬蟲(chóng)可以同時(shí)處理多個(gè)數據。分組數據,承載能力更強。
  2.爬取質(zhì)量和特異性
  很多網(wǎng)站爬蟲(chóng)爬取給定URL中的所有內容,不僅影響爬取內容的質(zhì)量,還拖慢了預算。我們的爬蟲(chóng)會(huì )專(zhuān)門(mén)爬取電腦相關(guān)的數據,讓爬取的內容更符合用戶(hù)的需求。同時(shí)我們會(huì )對廣告進(jìn)行處理,也可以讓爬蟲(chóng)的爬取質(zhì)量更高。同時(shí),我們會(huì )在爬取時(shí)與關(guān)鍵詞進(jìn)行匹配比較,可以大大減少廣告和無(wú)關(guān)信息。
  3.分類(lèi)存儲
  用戶(hù)的下一步操作可能會(huì )使用不同類(lèi)型的數據。爬蟲(chóng)會(huì )在爬取過(guò)程中輕松對數據進(jìn)行分類(lèi)。分類(lèi)可以讓用戶(hù)獲得更好的用戶(hù)體驗,讓用戶(hù)在搜索的過(guò)程中可以更快的找到自己需要的信息。這應該更受程序員的歡迎。
  4.接口與實(shí)現
  用戶(hù)在獲取爬蟲(chóng)時(shí),需要知道爬蟲(chóng)的輸出形式和爬取速度,這就需要我們設計一個(gè)簡(jiǎn)單的接口來(lái)實(shí)現。我們的界面將以最簡(jiǎn)單的方式將輸出呈現給用戶(hù),這將非常直觀(guān)。
  5.創(chuàng )新功能
  我們將為原創(chuàng )爬蟲(chóng)添加新功能。比如抓取視頻文件時(shí),我們會(huì )將視頻地址反饋給用戶(hù)。這允許用戶(hù)直接通過(guò)地址觀(guān)看視頻。此外,我們還計劃實(shí)現不限于 html5 網(wǎng)頁(yè)的爬取,甚至嘗試爬取 CSS 或 javascript。這樣可以更方便用戶(hù)操作。
  分類(lèi):
  技術(shù)要點(diǎn):
  相關(guān)文章: 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(我組開(kāi)發(fā)遺留下來(lái)的分類(lèi)保存到的文件和扒取)
  2021-09-27
  需要:
  我們組的研究課題是編寫(xiě)一個(gè)更實(shí)用的爬蟲(chóng)軟件,將其應用到一些前輩的代碼中,并在此基礎上進(jìn)行完善和創(chuàng )新。
  鑒于高級代碼已經(jīng)實(shí)現了基本功能,即從網(wǎng)站中爬取相關(guān)Word文檔和其他計算機相關(guān)文件資料,過(guò)濾掉無(wú)關(guān)信息。我組將從以下幾個(gè)方面著(zhù)手改進(jìn)和完善:
  1.增強的去廣告功能:
  如今的網(wǎng)頁(yè)情況,很多網(wǎng)頁(yè),包括貼吧、微博都充斥著(zhù)廣告,其中一些不可避免地與電腦有關(guān),但這些廣告的作用并沒(méi)有實(shí)際意義。高級代碼中確實(shí)有相應的刪除廣告的功能,但效果并不明顯。在很多情況下,無(wú)法識別網(wǎng)絡(luò )廣告和實(shí)際有用的信息,因此會(huì )出現一些數據浪費或數據丟失。. 針對這種情況,我們小組決定對其廣告過(guò)濾功能進(jìn)行改進(jìn)和修改。
  2.按類(lèi)別保存提取的文件:
  對爬蟲(chóng)抓取的數據進(jìn)行分類(lèi)非常重要。學(xué)長(cháng)的代碼中,獲取的數據沒(méi)有入庫分類(lèi)存儲,給下一組的開(kāi)發(fā)留下了一些問(wèn)題。,我組研究后認為應該增加保存黨的分類(lèi)的功能。
  3.添加視頻采集功能:
  前輩的代碼只實(shí)現了部分文本文件的提取,并沒(méi)有進(jìn)行視頻數據的提取。但是由于網(wǎng)上很多視頻都有相應的版權問(wèn)題,而且大部分視頻占用了很大的硬盤(pán)容量,所以我們會(huì )抓取視頻的地址并存入數據庫。
  4.CSS 和 Javascript網(wǎng)站:
  在原創(chuàng )代碼中,只能抓取 HTTP6 網(wǎng)頁(yè)。我們認為數據采集將過(guò)于有限。因此,我們想在這個(gè)問(wèn)題中加入 CSS 和 Javascript 網(wǎng)站 的抓取功能。生成大量的代碼工作量,只是一個(gè)初步的想法。
  5.網(wǎng)頁(yè)質(zhì)量判斷:
  有些網(wǎng)站由于缺乏相關(guān)的和計算機知識的內容,重復搜索只會(huì )造成時(shí)間和資源的浪費。針對這種情況,我們認為應該增加一個(gè)判斷網(wǎng)頁(yè)質(zhì)量的功能,把不合適的網(wǎng)站去掉,提高軟件運行效率。
  方法(實(shí)踐):
  1.對于抓取到的網(wǎng)站,獲取URL,查看下一級網(wǎng)站的AD字段以及下一級網(wǎng)站與關(guān)鍵字的關(guān)聯(lián)度
  上學(xué)年對這個(gè)項目的評測中,去廣告的功能并不完善,還夾雜了很多廣告。他們在博客上寫(xiě)道,說(shuō)是根據AD領(lǐng)域來(lái)判斷這是否網(wǎng)站 是一個(gè)廣告網(wǎng)站。我們覺(jué)得如果只根據AD字段來(lái)判斷,有可能在網(wǎng)站中間的網(wǎng)站中抓取一些無(wú)用的廣告。因此,我們覺(jué)得應該再往下檢查一級。如果下一級網(wǎng)站中有??很多廣告網(wǎng)站,則排除這個(gè)網(wǎng)站。因為我們考慮到如果投放了一個(gè)廣告,最多會(huì )經(jīng)過(guò)一次網(wǎng)站傳輸,否則廣告投放是不會(huì )生效的。因此,我們考慮多一個(gè)檢測級別的方法,這應該可以在很大程度上解決問(wèn)題。得到的網(wǎng)站中的廣告有很多問(wèn)題。
  2.抓取的不同文件會(huì )根據文件格式的不同分別保存(先按文件夾分開(kāi))
  捕獲的 網(wǎng)站 根據它們與關(guān)鍵字的相關(guān)性進(jìn)行分級和排序。上學(xué)年項目負責組評價(jià)寫(xiě)道,該組抓到的文件沒(méi)有分類(lèi),所有文件都混在一起,給用戶(hù)使用帶來(lái)不便。我們想在這個(gè)軟件中添加一個(gè)對捕獲的文件進(jìn)行分類(lèi)和存儲的功能。當某個(gè)文件被抓取時(shí),會(huì )根據文件的類(lèi)型,將其放置在該文件所在的存儲區域中,從而完成軟件運行。之后得到分類(lèi)文件,方便用戶(hù)使用。
  3.提供視頻鏈接,以便用戶(hù)觀(guān)看源視頻
  上一組沒(méi)有完成相關(guān)視頻的爬取功能。我們認為,如果它是一個(gè)網(wǎng)絡(luò )爬蟲(chóng),它的初衷是為互聯(lián)網(wǎng)上的用戶(hù)爬取有用的資源,而現在視頻資源也很重要。因此,我們要增加視頻捕捉功能。與內容和關(guān)鍵詞相關(guān)的視頻也會(huì )反饋給用戶(hù),以便用戶(hù)觀(guān)看相關(guān)視頻。
  4.CSS 和 Javascript網(wǎng)站
  暫定。
  5.檢查關(guān)鍵詞是否出現在被捕獲的網(wǎng)站或者文件的標題中,如果在被捕獲的網(wǎng)站或者文件的文本中頻繁出現,用這個(gè)來(lái)判斷此 網(wǎng)站 或文件的值給用戶(hù)
  我們認為,如果我們抓取其中出現關(guān)鍵詞的所有資源,我們可能會(huì )抓取一些網(wǎng)站或不相關(guān)但出現關(guān)鍵詞的文件,但在排除網(wǎng)站@之后&gt; 以及對用戶(hù)來(lái)說(shuō)價(jià)值不大的文件,通過(guò)以上方法,我們抓取的東西質(zhì)量會(huì )大大提高。
  好處(好處):
  1.能夠更好地從結果中去除廣告網(wǎng)站,優(yōu)化用戶(hù)體驗
  去除廣告是我們爬蟲(chóng)非常重要的功能。爬蟲(chóng)的初衷是為用戶(hù)高效地爬取互聯(lián)網(wǎng)上有用的相關(guān)資源。如果可爬取資源中有大量的廣告,會(huì )讓用戶(hù)的瀏覽很不方便,也就失去了爬蟲(chóng)的意義。. 我們將檢查到下一個(gè)級別網(wǎng)站,并使用此方法排除廣告網(wǎng)站。這樣可以提高抓取資源的質(zhì)量,用戶(hù)可以更方便的使用爬蟲(chóng)的功能。
  2.讓用戶(hù)更容易找到資源
  如果爬蟲(chóng)把所有抓取到的資源放在一起,當用戶(hù)需要一個(gè)格式單一的文件時(shí)會(huì )很麻煩。我們將采集到的資源按照類(lèi)型分別保存,讓用戶(hù)可以更方便的使用軟件,獲得更好的用戶(hù)體驗。
  3.讓用戶(hù)可以觀(guān)看相關(guān)視頻
  這是一個(gè)全新的功能。之前的版本無(wú)法采集視頻資源。雖然由于版權原因我們無(wú)法完全下載視頻,但我們可以為用戶(hù)提供源視頻的鏈接,以便用戶(hù)觀(guān)看?,F在互聯(lián)網(wǎng)上有很多資源以視頻的形式存在。我們加入這個(gè)功能是為了讓這個(gè)軟件更實(shí)用,更能滿(mǎn)足用戶(hù)不斷增長(cháng)的需求。
  4.不限于HTML5網(wǎng)站,可以獲得更多資源(暫定)
  目前的版本只能爬取HTML5的網(wǎng)站,但是網(wǎng)站里面也有很多有用的資源是用javascript或者css的。我們更新了這個(gè)軟件,支持javascript和css,可以讓爬蟲(chóng)抓取更多的資源,為用戶(hù)提供更多的服務(wù)。
  5.提高采集結果的質(zhì)量,增加剔除低質(zhì)量資源的功能(暫定)
  如果只關(guān)注捕獲文件的數量和網(wǎng)站,可能會(huì )導致捕獲文件和網(wǎng)站的質(zhì)量很差,但是會(huì )減少結果中有用的文件和網(wǎng)站里面的成分讓用戶(hù)體驗更差。我們將通過(guò)檢測關(guān)鍵詞是否出現在其標題及其出現頻率等方法來(lái)確定該文件或網(wǎng)站對用戶(hù)的價(jià)值。如果值不高,那么這個(gè)文件或 網(wǎng)站 @> 被排除。這將使我們能夠抓取更高質(zhì)量的文件和 網(wǎng)站。
  競爭對手:
  網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)獲取網(wǎng)頁(yè)內容的程序,是搜索引擎的重要組成部分?,F在的搜索引擎基本上都涉及到爬蟲(chóng)的設計和優(yōu)化。搜索引擎的速度也與爬蟲(chóng)的優(yōu)化程度密切相關(guān)。從另一個(gè)角度來(lái)看,不僅僅是搜索引擎,所有的數據挖掘軟件都會(huì )涉及到爬蟲(chóng)。因此,爬蟲(chóng)在整個(gè)軟件行業(yè)的地位很高,應用范圍非常廣泛。這里我們主要通過(guò)搜索引擎中的爬蟲(chóng)來(lái)分析競爭。
  首先,拿兩個(gè)最常用的搜索引擎:百度和谷歌。從爬取信息來(lái)看,兩者都是行業(yè)的佼佼者,爬取算法也很不錯,可以按類(lèi)型分類(lèi)。,以方便用戶(hù)操作。它爬取整個(gè)萬(wàn)維網(wǎng)的速度非???。雖然我們的軟件在速度和爬取算法方面還不是很成熟,但是我們的軟件會(huì )為了方便用戶(hù)而設計。我們會(huì )檢查爬取文件的匹配度,對它們的優(yōu)先級進(jìn)行排序。這也將大大提高用戶(hù)體驗的質(zhì)量。我將從以下幾個(gè)方面來(lái)討論我們軟件的競爭力。
  1.爬行速度和爬行負載,這也是衡量爬蟲(chóng)的標準
  與其他軟件相比,我們的軟件在速度上還不錯。我們通過(guò)廣度優(yōu)先的搜索順序進(jìn)行搜索,可以提高爬蟲(chóng)的爬取速度。同時(shí),我們使用多個(gè)隊列進(jìn)行數據處理,這也使得爬蟲(chóng)可以同時(shí)處理多個(gè)數據。分組數據,承載能力更強。
  2.爬取質(zhì)量和特異性
  很多網(wǎng)站爬蟲(chóng)爬取給定URL中的所有內容,不僅影響爬取內容的質(zhì)量,還拖慢了預算。我們的爬蟲(chóng)會(huì )專(zhuān)門(mén)爬取電腦相關(guān)的數據,讓爬取的內容更符合用戶(hù)的需求。同時(shí)我們會(huì )對廣告進(jìn)行處理,也可以讓爬蟲(chóng)的爬取質(zhì)量更高。同時(shí),我們會(huì )在爬取時(shí)與關(guān)鍵詞進(jìn)行匹配比較,可以大大減少廣告和無(wú)關(guān)信息。
  3.分類(lèi)存儲
  用戶(hù)的下一步操作可能會(huì )使用不同類(lèi)型的數據。爬蟲(chóng)會(huì )在爬取過(guò)程中輕松對數據進(jìn)行分類(lèi)。分類(lèi)可以讓用戶(hù)獲得更好的用戶(hù)體驗,讓用戶(hù)在搜索的過(guò)程中可以更快的找到自己需要的信息。這應該更受程序員的歡迎。
  4.接口與實(shí)現
  用戶(hù)在獲取爬蟲(chóng)時(shí),需要知道爬蟲(chóng)的輸出形式和爬取速度,這就需要我們設計一個(gè)簡(jiǎn)單的接口來(lái)實(shí)現。我們的界面將以最簡(jiǎn)單的方式將輸出呈現給用戶(hù),這將非常直觀(guān)。
  5.創(chuàng )新功能
  我們將為原創(chuàng )爬蟲(chóng)添加新功能。比如抓取視頻文件時(shí),我們會(huì )將視頻地址反饋給用戶(hù)。這允許用戶(hù)直接通過(guò)地址觀(guān)看視頻。此外,我們還計劃實(shí)現不限于 html5 網(wǎng)頁(yè)的爬取,甚至嘗試爬取 CSS 或 javascript。這樣可以更方便用戶(hù)操作。
  分類(lèi):
  技術(shù)要點(diǎn):
  相關(guān)文章:

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python對象的bs4解析方式和屬性的方法和方法)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-04-13 09:39 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python對象的bs4解析方式和屬性的方法和方法)
  bs4,全稱(chēng)BeautifulSoup 4,是Python獨有的解析方式。也就是說(shuō),只有 Python 語(yǔ)言可以這樣解析數據。
  BeautifulSoup 3 只支持 Python 2,所以它已經(jīng)過(guò)時(shí)了。
  官網(wǎng)的介紹是這樣的
  Beautiful Soup 提供了簡(jiǎn)單的類(lèi)似 python 的函數來(lái)處理導航、搜索、修改解析樹(shù)等。它是一個(gè)工具箱,通過(guò)解析文檔為用戶(hù)提供他們需要抓取的數據。由于其簡(jiǎn)單性,編寫(xiě)完整的應用程序不需要太多代碼。Beautiful Soup 自動(dòng)將輸入文檔轉換為 Unicode 編碼,將輸出文檔自動(dòng)轉換為 utf-8 編碼。不需要考慮編碼方式,除非文檔沒(méi)有指定編碼方式,否則Beautiful Soup無(wú)法自動(dòng)識別編碼方式。然后,您只需要指定原創(chuàng )編碼。Beautiful Soup 已經(jīng)成為與 lxml 和 html6lib 一樣優(yōu)秀的 python 解釋器,為用戶(hù)提供不同解析策略的靈活性或強大的速度。
  看起來(lái)很復雜,我用自己的理解簡(jiǎn)單解釋一下
  我們知道一個(gè)網(wǎng)頁(yè)的源代碼是由多個(gè)標簽組成的,比如,
  ,,,等等,而bs4是用來(lái)幫助我們準確定位標簽位置的工具,從而獲取標簽的內容或標簽屬性。bs4默認自帶的解析器,但官方推薦的是更強大更快的lxml解析器
  其他解析器的優(yōu)缺點(diǎn)
  
  一、bs4的安裝
  pip install bs4
pip install lxml
  用bs4解析時(shí),推薦使用lxml解析器。使用 xpath 解析時(shí)也會(huì )用到
  二、bs4解析原理1、如何實(shí)例化BeautySoup對象 導入bs4包
  from bs4 import BeautifulSoup
  灣。實(shí)例化對象
  網(wǎng)頁(yè)源代碼進(jìn)一步分為本地已經(jīng)持久化的HTML文件和網(wǎng)絡(luò )上直接獲取的源代碼。
  如果是本地持久化文件,可以通過(guò)如下方式將源碼加載到bs4對象中
  fp = open('xxx.html', 'r', encoding='utf-8')
# lxml:解析器
soup = BeautifulSoup(fp, 'lxml')
  如果是通過(guò)requests庫獲取的網(wǎng)頁(yè)源代碼,按如下方式加載
  response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
  C。數據解析的方法和屬性
  bs4 能夠將復雜的 HTML 轉換為樹(shù)結構,其中每個(gè)節點(diǎn)都是一個(gè) Python 對象。
  soup.tagName(標簽名):返回文檔中第一次出現tagName對應的標簽及其對應的內容
  soup.tageName1.tageName2:返回tag1中tag1的標簽和內容
  soup.find:等價(jià)于soup.tagName,返回第一個(gè)匹配的對象
  soup.find_all:返回所有匹配的對象。
  通過(guò)查看源碼你會(huì )發(fā)現find的本質(zhì)就是調用find_all然后返回第一個(gè)元素
  參數說(shuō)明:
   def find(self, name=None, attrs={}, recursive=True, text=None,
**kwargs):
"""Return only the first child of this Tag matching the given
criteria."""
r = None
l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
if l:
r = l[0]
return r
  【外鏈圖片傳輸失敗,源站可能有防盜鏈機制,建議保存圖片直接上傳(img-iXUox6yw-53)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-23454&lt; @0.png )]
  上圖是我從某網(wǎng)站中截取的部分畫(huà)面,翻譯成HTML如下(只保留對本次分析有用的部分,刪除地址的域名信息為閱讀方便)
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  看下面的例子
  # 獲取第一個(gè)li標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)<p>鄭爽
print(soup.li)
# # 獲取第一個(gè)li標簽中a標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)
  鄭爽
print(soup.li.a)
#獲取第一個(gè)li標簽中a標簽
print(soup.find('li').a)
# 獲取所有li標簽
print(soup.find_all('li'))
# 獲取title標簽
print(soup.title)
# 獲取a標簽的父級標簽
print(soup.a.parent)
# 獲取a標簽的父級標簽的名字
print(soup.a.parent.name)</p>
  如何在 HTML 中獲取href?
  分析:href是a標簽中的一個(gè)屬性,a標簽在li標簽中
  提取bs4中tags中的屬性可以通過(guò)attrs獲取
  其他補充劑
  # 返回子孫節點(diǎn)
# children返回迭代器
result = soup.a.children
for i in result:
print(i)
# 返回子孫節點(diǎn), contents返回列表
r = soup.a.contents
print(r)
# 可以通過(guò)正則對某個(gè)屬性進(jìn)行匹配
# 比如返回href中以zh開(kāi)頭的標簽
import re
reg = re.compile('^zh')
result = soup.find_all(href=reg)
print(result)
  選擇器
  bs4 非常強大,也支持 css 選擇器。通過(guò)選擇完成
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  from bs4 import BeautifulSoup
fp = open('baidu.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
# 返回一個(gè)所有a標簽的列表
result = soup.select('a')
# 返回第一個(gè)
result1 = soup.select('a')[0]
"""
class選擇器 : .className
"""
# 一層一層的進(jìn)行選擇,用 > 連接 即 > : 表示一個(gè)層級
# 輸出 class = nr_zt 下ul下的li下的a標簽集合
a = soup.select('.nr_zt > ul > li > a')
# 多個(gè)層級關(guān)聯(lián),使用 空格。
# 輸出 class= 'nr_zt' 下的a標簽集合
b = soup.select('.nr_zt a')
"""
id選擇器: # idName
"""
result = soup.select('#star')
# 通過(guò)href屬性查找,返回列表
soup.select('a[href="zhengshuang.html"]')
# 獲取對應標簽中img標簽的src值
a = soup.select('a[href="zhengshuang.html"]')[0]
print(a.img['src']) # 5940f2cd6b759.jpg
  以上是bs4的常用操作代碼。其實(shí)在具體的爬取過(guò)程中,匹配的方式比較靈活,大家不用死記硬背,記住原理即可。
  
  網(wǎng)絡(luò )爬蟲(chóng)
  
  Python 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python對象的bs4解析方式和屬性的方法和方法)
  bs4,全稱(chēng)BeautifulSoup 4,是Python獨有的解析方式。也就是說(shuō),只有 Python 語(yǔ)言可以這樣解析數據。
  BeautifulSoup 3 只支持 Python 2,所以它已經(jīng)過(guò)時(shí)了。
  官網(wǎng)的介紹是這樣的
  Beautiful Soup 提供了簡(jiǎn)單的類(lèi)似 python 的函數來(lái)處理導航、搜索、修改解析樹(shù)等。它是一個(gè)工具箱,通過(guò)解析文檔為用戶(hù)提供他們需要抓取的數據。由于其簡(jiǎn)單性,編寫(xiě)完整的應用程序不需要太多代碼。Beautiful Soup 自動(dòng)將輸入文檔轉換為 Unicode 編碼,將輸出文檔自動(dòng)轉換為 utf-8 編碼。不需要考慮編碼方式,除非文檔沒(méi)有指定編碼方式,否則Beautiful Soup無(wú)法自動(dòng)識別編碼方式。然后,您只需要指定原創(chuàng )編碼。Beautiful Soup 已經(jīng)成為與 lxml 和 html6lib 一樣優(yōu)秀的 python 解釋器,為用戶(hù)提供不同解析策略的靈活性或強大的速度。
  看起來(lái)很復雜,我用自己的理解簡(jiǎn)單解釋一下
  我們知道一個(gè)網(wǎng)頁(yè)的源代碼是由多個(gè)標簽組成的,比如,
  ,,,等等,而bs4是用來(lái)幫助我們準確定位標簽位置的工具,從而獲取標簽的內容或標簽屬性。bs4默認自帶的解析器,但官方推薦的是更強大更快的lxml解析器
  其他解析器的優(yōu)缺點(diǎn)
  
  一、bs4的安裝
  pip install bs4
pip install lxml
  用bs4解析時(shí),推薦使用lxml解析器。使用 xpath 解析時(shí)也會(huì )用到
  二、bs4解析原理1、如何實(shí)例化BeautySoup對象 導入bs4包
  from bs4 import BeautifulSoup
  灣。實(shí)例化對象
  網(wǎng)頁(yè)源代碼進(jìn)一步分為本地已經(jīng)持久化的HTML文件和網(wǎng)絡(luò )上直接獲取的源代碼。
  如果是本地持久化文件,可以通過(guò)如下方式將源碼加載到bs4對象中
  fp = open('xxx.html', 'r', encoding='utf-8')
# lxml:解析器
soup = BeautifulSoup(fp, 'lxml')
  如果是通過(guò)requests庫獲取的網(wǎng)頁(yè)源代碼,按如下方式加載
  response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
  C。數據解析的方法和屬性
  bs4 能夠將復雜的 HTML 轉換為樹(shù)結構,其中每個(gè)節點(diǎn)都是一個(gè) Python 對象。
  soup.tagName(標簽名):返回文檔中第一次出現tagName對應的標簽及其對應的內容
  soup.tageName1.tageName2:返回tag1中tag1的標簽和內容
  soup.find:等價(jià)于soup.tagName,返回第一個(gè)匹配的對象
  soup.find_all:返回所有匹配的對象。
  通過(guò)查看源碼你會(huì )發(fā)現find的本質(zhì)就是調用find_all然后返回第一個(gè)元素
  參數說(shuō)明:
   def find(self, name=None, attrs={}, recursive=True, text=None,
**kwargs):
"""Return only the first child of this Tag matching the given
criteria."""
r = None
l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
if l:
r = l[0]
return r
  【外鏈圖片傳輸失敗,源站可能有防盜鏈機制,建議保存圖片直接上傳(img-iXUox6yw-53)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-23454&lt; @0.png )]
  上圖是我從某網(wǎng)站中截取的部分畫(huà)面,翻譯成HTML如下(只保留對本次分析有用的部分,刪除地址的域名信息為閱讀方便)
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  看下面的例子
  # 獲取第一個(gè)li標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)<p>鄭爽
print(soup.li)
# # 獲取第一個(gè)li標簽中a標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)
  鄭爽
print(soup.li.a)
#獲取第一個(gè)li標簽中a標簽
print(soup.find('li').a)
# 獲取所有li標簽
print(soup.find_all('li'))
# 獲取title標簽
print(soup.title)
# 獲取a標簽的父級標簽
print(soup.a.parent)
# 獲取a標簽的父級標簽的名字
print(soup.a.parent.name)</p>
  如何在 HTML 中獲取href?
  分析:href是a標簽中的一個(gè)屬性,a標簽在li標簽中
  提取bs4中tags中的屬性可以通過(guò)attrs獲取
  其他補充劑
  # 返回子孫節點(diǎn)
# children返回迭代器
result = soup.a.children
for i in result:
print(i)
# 返回子孫節點(diǎn), contents返回列表
r = soup.a.contents
print(r)
# 可以通過(guò)正則對某個(gè)屬性進(jìn)行匹配
# 比如返回href中以zh開(kāi)頭的標簽
import re
reg = re.compile('^zh')
result = soup.find_all(href=reg)
print(result)
  選擇器
  bs4 非常強大,也支持 css 選擇器。通過(guò)選擇完成
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  from bs4 import BeautifulSoup
fp = open('baidu.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
# 返回一個(gè)所有a標簽的列表
result = soup.select('a')
# 返回第一個(gè)
result1 = soup.select('a')[0]
"""
class選擇器 : .className
"""
# 一層一層的進(jìn)行選擇,用 > 連接 即 > : 表示一個(gè)層級
# 輸出 class = nr_zt 下ul下的li下的a標簽集合
a = soup.select('.nr_zt > ul > li > a')
# 多個(gè)層級關(guān)聯(lián),使用 空格。
# 輸出 class= 'nr_zt' 下的a標簽集合
b = soup.select('.nr_zt a')
"""
id選擇器: # idName
"""
result = soup.select('#star')
# 通過(guò)href屬性查找,返回列表
soup.select('a[href="zhengshuang.html"]')
# 獲取對應標簽中img標簽的src值
a = soup.select('a[href="zhengshuang.html"]')[0]
print(a.img['src']) # 5940f2cd6b759.jpg
  以上是bs4的常用操作代碼。其實(shí)在具體的爬取過(guò)程中,匹配的方式比較靈活,大家不用死記硬背,記住原理即可。
  
  網(wǎng)絡(luò )爬蟲(chóng)
  
  Python

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 在學(xué)習Python之前,我們要知道,,Python的用途)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-04-13 09:37 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在學(xué)習Python之前,我們要知道,,Python的用途)
  
  在學(xué)習 Python 之前,我們需要了解 Python 的用途以及學(xué)習它能給我們帶來(lái)什么?
  Python主要包括網(wǎng)絡(luò )爬蟲(chóng)、網(wǎng)站開(kāi)發(fā)、人工智能、自動(dòng)化運維
  這里我們主要看一下網(wǎng)絡(luò )爬蟲(chóng),什么是網(wǎng)絡(luò )爬蟲(chóng)?
  網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛,是指一種腳本程序,它按照一定的規則在網(wǎng)絡(luò )上爬取想要的內容。眾所周知,每個(gè)網(wǎng)頁(yè)通常都收錄其他網(wǎng)頁(yè)的入口,網(wǎng)絡(luò )爬蟲(chóng)通過(guò)一個(gè)URL依次進(jìn)入其他網(wǎng)址,獲取想要的內容。
  
  爬行動(dòng)物有什么用?
  做垂直搜索引擎(google、baidu等)。
  科學(xué)研究:在線(xiàn)人類(lèi)行為、在線(xiàn)社區進(jìn)化、人類(lèi)動(dòng)力學(xué)研究、定量社會(huì )學(xué)、復雜網(wǎng)絡(luò )、數據挖掘等實(shí)證研究領(lǐng)域需要大量數據,而網(wǎng)絡(luò )爬蟲(chóng)是采集相關(guān)數據的有力工具。
  偷窺、黑客攻擊、垃圾郵件……
  爬行是搜索引擎的第一步,也是最簡(jiǎn)單的一步。
  用什么語(yǔ)言編寫(xiě)爬蟲(chóng)?
  C、C++。高效、快速,適合一般搜索引擎爬取全網(wǎng)。缺點(diǎn),開(kāi)發(fā)慢,寫(xiě)起來(lái)又臭又長(cháng),例如:天網(wǎng)搜索源碼。
  腳本語(yǔ)言:Perl、Python、Java、Ruby。簡(jiǎn)單易學(xué),良好的文本處理可以方便網(wǎng)頁(yè)內容的詳細提取,但效率往往不高,適合少量網(wǎng)站的集中抓取
  C#?
  為什么 Python 現在最流行?
  
  就個(gè)人而言,我用 c# 和 java 編寫(xiě)了爬蟲(chóng)。差別不大,原則是用好正則表達式。只是平臺問(wèn)題。后來(lái)才知道很多爬蟲(chóng)都是用python寫(xiě)的,所以一發(fā)不可收拾。Python有很多優(yōu)點(diǎn),總結兩個(gè)要點(diǎn):
  1)抓取網(wǎng)頁(yè)本身的接口
  相比其他靜態(tài)編程語(yǔ)言,如java、c#、C++、python,爬取網(wǎng)頁(yè)文檔的界面更加簡(jiǎn)潔;與 perl、shell 等其他動(dòng)態(tài)腳本語(yǔ)言相比,python 的 urllib2 包提供了對 web 文檔更完整的訪(fǎng)問(wèn)。API。(當然紅寶石也是不錯的選擇)
  另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這就是我們需要模擬用戶(hù)代理的行為來(lái)構造適當的請求的地方,例如模擬用戶(hù)登錄,模擬會(huì )話(huà)/cookie存儲和設置。python中有非常好的第三方包可以幫助你,比如Requests,mechanize
  2)網(wǎng)頁(yè)抓取后的處理
  抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,比如過(guò)濾html標簽、提取文本等。Python的beautifulsoap提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
  其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是python可以做到最快最干凈。人生苦短,你需要蟒蛇。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在學(xué)習Python之前,我們要知道,,Python的用途)
  
  在學(xué)習 Python 之前,我們需要了解 Python 的用途以及學(xué)習它能給我們帶來(lái)什么?
  Python主要包括網(wǎng)絡(luò )爬蟲(chóng)、網(wǎng)站開(kāi)發(fā)、人工智能、自動(dòng)化運維
  這里我們主要看一下網(wǎng)絡(luò )爬蟲(chóng),什么是網(wǎng)絡(luò )爬蟲(chóng)?
  網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛,是指一種腳本程序,它按照一定的規則在網(wǎng)絡(luò )上爬取想要的內容。眾所周知,每個(gè)網(wǎng)頁(yè)通常都收錄其他網(wǎng)頁(yè)的入口,網(wǎng)絡(luò )爬蟲(chóng)通過(guò)一個(gè)URL依次進(jìn)入其他網(wǎng)址,獲取想要的內容。
  
  爬行動(dòng)物有什么用?
  做垂直搜索引擎(google、baidu等)。
  科學(xué)研究:在線(xiàn)人類(lèi)行為、在線(xiàn)社區進(jìn)化、人類(lèi)動(dòng)力學(xué)研究、定量社會(huì )學(xué)、復雜網(wǎng)絡(luò )、數據挖掘等實(shí)證研究領(lǐng)域需要大量數據,而網(wǎng)絡(luò )爬蟲(chóng)是采集相關(guān)數據的有力工具。
  偷窺、黑客攻擊、垃圾郵件……
  爬行是搜索引擎的第一步,也是最簡(jiǎn)單的一步。
  用什么語(yǔ)言編寫(xiě)爬蟲(chóng)?
  C、C++。高效、快速,適合一般搜索引擎爬取全網(wǎng)。缺點(diǎn),開(kāi)發(fā)慢,寫(xiě)起來(lái)又臭又長(cháng),例如:天網(wǎng)搜索源碼。
  腳本語(yǔ)言:Perl、Python、Java、Ruby。簡(jiǎn)單易學(xué),良好的文本處理可以方便網(wǎng)頁(yè)內容的詳細提取,但效率往往不高,適合少量網(wǎng)站的集中抓取
  C#?
  為什么 Python 現在最流行?
  
  就個(gè)人而言,我用 c# 和 java 編寫(xiě)了爬蟲(chóng)。差別不大,原則是用好正則表達式。只是平臺問(wèn)題。后來(lái)才知道很多爬蟲(chóng)都是用python寫(xiě)的,所以一發(fā)不可收拾。Python有很多優(yōu)點(diǎn),總結兩個(gè)要點(diǎn):
  1)抓取網(wǎng)頁(yè)本身的接口
  相比其他靜態(tài)編程語(yǔ)言,如java、c#、C++、python,爬取網(wǎng)頁(yè)文檔的界面更加簡(jiǎn)潔;與 perl、shell 等其他動(dòng)態(tài)腳本語(yǔ)言相比,python 的 urllib2 包提供了對 web 文檔更完整的訪(fǎng)問(wèn)。API。(當然紅寶石也是不錯的選擇)
  另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這就是我們需要模擬用戶(hù)代理的行為來(lái)構造適當的請求的地方,例如模擬用戶(hù)登錄,模擬會(huì )話(huà)/cookie存儲和設置。python中有非常好的第三方包可以幫助你,比如Requests,mechanize
  2)網(wǎng)頁(yè)抓取后的處理
  抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,比如過(guò)濾html標簽、提取文本等。Python的beautifulsoap提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
  其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是python可以做到最快最干凈。人生苦短,你需要蟒蛇。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求的三個(gè)步驟分析)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-04-13 07:19 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求的三個(gè)步驟分析)
  爬蟲(chóng)的大致思路:抓取網(wǎng)頁(yè),分析請求
  解析網(wǎng)頁(yè)并查找數據
  存儲數據,多頁(yè)面處理
  本課主要講授如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求。
  三步找到真正的請求
  分析:使用 Google Chrome 開(kāi)發(fā)者工具分析網(wǎng)頁(yè)請求
  測試:測試URL請求中各個(gè)參數的作用,找出控制翻頁(yè)等功能的參數
  Repeat:反復尋找滿(mǎn)足爬蟲(chóng)需求的真實(shí)請求
  實(shí)用鏈接:爬取知乎
  通過(guò)爬取知乎“輪子哥”——vczh相關(guān)人士分析Ajax或JavaScript加載數據的真實(shí)請求,并展示該爬取方式的具體過(guò)程。
  1. 尋找真實(shí)請求的測試首先進(jìn)入“輪子哥-vczh”關(guān)注者的頁(yè)面(注意:需要登錄個(gè)人知乎帳戶(hù)優(yōu)先)
  通過(guò)禁用javascript加載發(fā)現頁(yè)面無(wú)法正常加載,確認頁(yè)面的翻頁(yè)是通過(guò)javascript加載數據實(shí)現的
  使用谷歌瀏覽器開(kāi)發(fā)者工具查找收錄關(guān)注者信息的真實(shí)請求??梢园l(fā)現,真正的請求是以“followees”開(kāi)頭的請求,返回的是一個(gè)JSON格式的數據,對應下一頁(yè)的“Followees”。人”:
  雙擊該請求返回JSON格式的數據,通過(guò)安裝JSONView插件可以更好的顯示在瀏覽器中
  然后您可以嘗試抓取請求的數據
  2. 嘗試爬取真實(shí)請求的數據 先嘗試使用前幾課學(xué)習的requests.get() 來(lái)爬取數據
  可以發(fā)現返回“500 Server Error”,即由于網(wǎng)站反爬蟲(chóng),服務(wù)器返回“500 Service Error”
  這個(gè)問(wèn)題可以通過(guò)添加headers請求頭信息來(lái)解決
  3. 添加headers請求頭信息,模擬瀏覽器訪(fǎng)問(wèn)。請求頭信息攜帶客戶(hù)端瀏覽器、請求頁(yè)面、服務(wù)器等信息,用于通知服務(wù)器發(fā)起請求的客戶(hù)端的具體信息
  p>
  知乎反爬機制是通過(guò)檢查請求頭信息實(shí)現的,所以在使用request請求數據的時(shí)候需要加上需要的請求頭
  對比知乎的請求頭信息和普通請求頭信息,發(fā)現知乎的請求頭有更多的授權和X-UDID信息
  向爬蟲(chóng)添加請求頭信息,即添加headers# -*- coding:utf-8 -*-
  導入請求
  標題 = {
  'authorization':' ',#括號內填寫(xiě)你的授權
  'User-Agent':' ',#括號里填你的User-Agent
  }
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset=20&limit=20'
  response=requests.get(url, headers = headers).json()
  打?。憫?br />   最終代碼:#!/usr/bin/env python3
  # -*- 編碼:utf-8 -*-
  """
  創(chuàng )建于 2018 年 3 月 20 日星期二 16:01:47
  @作者:杰基
  """
  導入請求
  將熊貓導入為 pd
  進(jìn)口時(shí)間
  標題 = {
  '授權': '承載 2 | 1:0 | 10:1519627538 | 4:z_c0 | 92: Mi4xYzBvWkFBQUFBQUFBSU1JaTVqRU1EQ1lBQUFCZ0FsVk5FdnVBV3dEdHdaRmtBR1lmZEpqT3VvdmtpSm5QMWtkZ1ZB | 787597598f41757929f46f687f78434dbc66d6abc980e40fb50b55cd09062b07',
  'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/6< @4.0.3282.186 Safari/537.36',
  'x-udid':'ACDCIuYxDAyPTg7eVnDe8ytVGX6ivGdKZ9E=',
  }
  user_data = []
  def get_user_data(page):
  for i in range(page):
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset={}&limit=20'.format(i*20)
  response = requests.get(url, headers = headers).json()['data']
  user_data.extend(響應)
  print('爬取頁(yè)面 %s' %str(i+1))
  時(shí)間.sleep(1)
  如果 __name__ == '__main__':
  get_user_data(3)
  df = pd.DataFrame(user_data)
  df.to_csv('users.csv')
  
  補充知識
  1. JSONJSON 是一種輕量級的數據交換格式。連接API爬取數據時(shí),一般數據返回格式為JSON。
  JSONView 插件:前往 Chrome JSONView 插件安裝,下載并安裝 JSONView 插件,以使 JSON 格式的數據在 Google Chrome 中更好地呈現 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求的三個(gè)步驟分析)
  爬蟲(chóng)的大致思路:抓取網(wǎng)頁(yè),分析請求
  解析網(wǎng)頁(yè)并查找數據
  存儲數據,多頁(yè)面處理
  本課主要講授如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求。
  三步找到真正的請求
  分析:使用 Google Chrome 開(kāi)發(fā)者工具分析網(wǎng)頁(yè)請求
  測試:測試URL請求中各個(gè)參數的作用,找出控制翻頁(yè)等功能的參數
  Repeat:反復尋找滿(mǎn)足爬蟲(chóng)需求的真實(shí)請求
  實(shí)用鏈接:爬取知乎
  通過(guò)爬取知乎“輪子哥”——vczh相關(guān)人士分析Ajax或JavaScript加載數據的真實(shí)請求,并展示該爬取方式的具體過(guò)程。
  1. 尋找真實(shí)請求的測試首先進(jìn)入“輪子哥-vczh”關(guān)注者的頁(yè)面(注意:需要登錄個(gè)人知乎帳戶(hù)優(yōu)先)
  通過(guò)禁用javascript加載發(fā)現頁(yè)面無(wú)法正常加載,確認頁(yè)面的翻頁(yè)是通過(guò)javascript加載數據實(shí)現的
  使用谷歌瀏覽器開(kāi)發(fā)者工具查找收錄關(guān)注者信息的真實(shí)請求??梢园l(fā)現,真正的請求是以“followees”開(kāi)頭的請求,返回的是一個(gè)JSON格式的數據,對應下一頁(yè)的“Followees”。人”:
  雙擊該請求返回JSON格式的數據,通過(guò)安裝JSONView插件可以更好的顯示在瀏覽器中
  然后您可以嘗試抓取請求的數據
  2. 嘗試爬取真實(shí)請求的數據 先嘗試使用前幾課學(xué)習的requests.get() 來(lái)爬取數據
  可以發(fā)現返回“500 Server Error”,即由于網(wǎng)站反爬蟲(chóng),服務(wù)器返回“500 Service Error”
  這個(gè)問(wèn)題可以通過(guò)添加headers請求頭信息來(lái)解決
  3. 添加headers請求頭信息,模擬瀏覽器訪(fǎng)問(wèn)。請求頭信息攜帶客戶(hù)端瀏覽器、請求頁(yè)面、服務(wù)器等信息,用于通知服務(wù)器發(fā)起請求的客戶(hù)端的具體信息
  p>
  知乎反爬機制是通過(guò)檢查請求頭信息實(shí)現的,所以在使用request請求數據的時(shí)候需要加上需要的請求頭
  對比知乎的請求頭信息和普通請求頭信息,發(fā)現知乎的請求頭有更多的授權和X-UDID信息
  向爬蟲(chóng)添加請求頭信息,即添加headers# -*- coding:utf-8 -*-
  導入請求
  標題 = {
  'authorization':' ',#括號內填寫(xiě)你的授權
  'User-Agent':' ',#括號里填你的User-Agent
  }
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset=20&limit=20'
  response=requests.get(url, headers = headers).json()
  打?。憫?br />   最終代碼:#!/usr/bin/env python3
  # -*- 編碼:utf-8 -*-
  """
  創(chuàng )建于 2018 年 3 月 20 日星期二 16:01:47
  @作者:杰基
  """
  導入請求
  將熊貓導入為 pd
  進(jìn)口時(shí)間
  標題 = {
  '授權': '承載 2 | 1:0 | 10:1519627538 | 4:z_c0 | 92: Mi4xYzBvWkFBQUFBQUFBSU1JaTVqRU1EQ1lBQUFCZ0FsVk5FdnVBV3dEdHdaRmtBR1lmZEpqT3VvdmtpSm5QMWtkZ1ZB | 787597598f41757929f46f687f78434dbc66d6abc980e40fb50b55cd09062b07',
  'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/6< @4.0.3282.186 Safari/537.36',
  'x-udid':'ACDCIuYxDAyPTg7eVnDe8ytVGX6ivGdKZ9E=',
  }
  user_data = []
  def get_user_data(page):
  for i in range(page):
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset={}&limit=20'.format(i*20)
  response = requests.get(url, headers = headers).json()['data']
  user_data.extend(響應)
  print('爬取頁(yè)面 %s' %str(i+1))
  時(shí)間.sleep(1)
  如果 __name__ == '__main__':
  get_user_data(3)
  df = pd.DataFrame(user_data)
  df.to_csv('users.csv')
  
  補充知識
  1. JSONJSON 是一種輕量級的數據交換格式。連接API爬取數據時(shí),一般數據返回格式為JSON。
  JSONView 插件:前往 Chrome JSONView 插件安裝,下載并安裝 JSONView 插件,以使 JSON 格式的數據在 Google Chrome 中更好地呈現

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何寫(xiě)爬蟲(chóng)“賊船”等上了賊船才發(fā)現)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-04-11 06:10 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何寫(xiě)爬蟲(chóng)“賊船”等上了賊船才發(fā)現)
  寫(xiě)爬蟲(chóng)是一項考驗綜合實(shí)力的工作。有時(shí),您可以輕松獲取所需的數據;有時(shí)候,你努力了,卻一無(wú)所獲。
  很多Python爬蟲(chóng)入門(mén)教程都是一行代碼騙你上“賊船”,上賊船才發(fā)現,水好深~
  例如,爬取一個(gè)網(wǎng)頁(yè)可以是非常簡(jiǎn)單的一行代碼:
  r = requests.get(&#39;http://news.baidu.com&#39;)
  
  很簡(jiǎn)單,但它的作用只是爬取一個(gè)網(wǎng)頁(yè),而一個(gè)有用的爬蟲(chóng)遠不止是爬取一個(gè)網(wǎng)頁(yè)。
  一個(gè)有用的爬蟲(chóng),只用兩個(gè)詞衡量:
  但是要實(shí)現這兩個(gè)字,還需要下一番功夫。自己努力是一方面,但同樣很重要的一點(diǎn)是你想要達到的網(wǎng)站的目標是它給你帶來(lái)了多少問(wèn)題。綜合來(lái)看,寫(xiě)爬蟲(chóng)有多難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)一:只爬 HTML 頁(yè)面但可擴展
  這里我們以新聞爬蟲(chóng)為例。大家都用過(guò)百度的新聞搜索,我就用它的爬蟲(chóng)說(shuō)說(shuō)實(shí)現的難點(diǎn)。
  新聞網(wǎng)站基本不設防,新聞內容全部在網(wǎng)頁(yè)的html代碼中,抓取整個(gè)網(wǎng)頁(yè)基本上就是一行。聽(tīng)起來(lái)很簡(jiǎn)單,但對于一個(gè)搜索引擎級別的爬蟲(chóng)來(lái)說(shuō),就不是那么簡(jiǎn)單了,要及時(shí)爬取上萬(wàn)條新聞網(wǎng)站的新聞也不是一件容易的事。
  我們先來(lái)看一下新聞爬蟲(chóng)的簡(jiǎn)單流程圖:
  
  從一些種子頁(yè)開(kāi)始,種子頁(yè)往往是一些新聞網(wǎng)站的首頁(yè),爬蟲(chóng)抓取該頁(yè)面,從中提取出網(wǎng)站的URL,放入URL池中進(jìn)行爬取。這從幾頁(yè)開(kāi)始,然后繼續擴展到其他頁(yè)面。爬蟲(chóng)爬取的網(wǎng)頁(yè)越來(lái)越多,提取的新網(wǎng)址也會(huì )成倍增加。
  如何在最短的時(shí)間內抓取更多的網(wǎng)址?
  這是難點(diǎn)之一,不是目的URL帶來(lái)的,而是對我們自身意愿的考驗:
  如何及時(shí)掌握最新消息?
  這是效率之外的另一個(gè)難點(diǎn)。如何保證時(shí)效?上千條新聞網(wǎng)站時(shí)刻都在發(fā)布最新消息。爬蟲(chóng)如何在織網(wǎng)抓取“舊”新聞的同時(shí)兼顧“新”新聞的獲???
  如何存儲大量捕獲的新聞?
  爬蟲(chóng)的抓取會(huì )翻出幾年前和幾十年前的每一個(gè)新聞頁(yè)面網(wǎng)站,從而獲取大量需要存儲的頁(yè)面。就是存儲的難點(diǎn)。
  如何清理提取的網(wǎng)頁(yè)內容?
  快速準確地從新聞網(wǎng)頁(yè)的html中提取想要的信息數據,如標題、發(fā)布時(shí)間、正文內容等,給內容提取帶來(lái)困難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)二:需要登錄才能抓取想要的數據
  人們很貪婪,想要無(wú)窮無(wú)盡的數據,但是很多數據并不容易提供給你。有一大類(lèi)數據,只有賬號登錄才能看到。也就是說(shuō),爬蟲(chóng)在請求的時(shí)候必須登錄才能抓取數據。
  如何獲取登錄狀態(tài)? 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何寫(xiě)爬蟲(chóng)“賊船”等上了賊船才發(fā)現)
  寫(xiě)爬蟲(chóng)是一項考驗綜合實(shí)力的工作。有時(shí),您可以輕松獲取所需的數據;有時(shí)候,你努力了,卻一無(wú)所獲。
  很多Python爬蟲(chóng)入門(mén)教程都是一行代碼騙你上“賊船”,上賊船才發(fā)現,水好深~
  例如,爬取一個(gè)網(wǎng)頁(yè)可以是非常簡(jiǎn)單的一行代碼:
  r = requests.get(&#39;http://news.baidu.com&#39;)
  
  很簡(jiǎn)單,但它的作用只是爬取一個(gè)網(wǎng)頁(yè),而一個(gè)有用的爬蟲(chóng)遠不止是爬取一個(gè)網(wǎng)頁(yè)。
  一個(gè)有用的爬蟲(chóng),只用兩個(gè)詞衡量:
  但是要實(shí)現這兩個(gè)字,還需要下一番功夫。自己努力是一方面,但同樣很重要的一點(diǎn)是你想要達到的網(wǎng)站的目標是它給你帶來(lái)了多少問(wèn)題。綜合來(lái)看,寫(xiě)爬蟲(chóng)有多難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)一:只爬 HTML 頁(yè)面但可擴展
  這里我們以新聞爬蟲(chóng)為例。大家都用過(guò)百度的新聞搜索,我就用它的爬蟲(chóng)說(shuō)說(shuō)實(shí)現的難點(diǎn)。
  新聞網(wǎng)站基本不設防,新聞內容全部在網(wǎng)頁(yè)的html代碼中,抓取整個(gè)網(wǎng)頁(yè)基本上就是一行。聽(tīng)起來(lái)很簡(jiǎn)單,但對于一個(gè)搜索引擎級別的爬蟲(chóng)來(lái)說(shuō),就不是那么簡(jiǎn)單了,要及時(shí)爬取上萬(wàn)條新聞網(wǎng)站的新聞也不是一件容易的事。
  我們先來(lái)看一下新聞爬蟲(chóng)的簡(jiǎn)單流程圖:
  
  從一些種子頁(yè)開(kāi)始,種子頁(yè)往往是一些新聞網(wǎng)站的首頁(yè),爬蟲(chóng)抓取該頁(yè)面,從中提取出網(wǎng)站的URL,放入URL池中進(jìn)行爬取。這從幾頁(yè)開(kāi)始,然后繼續擴展到其他頁(yè)面。爬蟲(chóng)爬取的網(wǎng)頁(yè)越來(lái)越多,提取的新網(wǎng)址也會(huì )成倍增加。
  如何在最短的時(shí)間內抓取更多的網(wǎng)址?
  這是難點(diǎn)之一,不是目的URL帶來(lái)的,而是對我們自身意愿的考驗:
  如何及時(shí)掌握最新消息?
  這是效率之外的另一個(gè)難點(diǎn)。如何保證時(shí)效?上千條新聞網(wǎng)站時(shí)刻都在發(fā)布最新消息。爬蟲(chóng)如何在織網(wǎng)抓取“舊”新聞的同時(shí)兼顧“新”新聞的獲???
  如何存儲大量捕獲的新聞?
  爬蟲(chóng)的抓取會(huì )翻出幾年前和幾十年前的每一個(gè)新聞頁(yè)面網(wǎng)站,從而獲取大量需要存儲的頁(yè)面。就是存儲的難點(diǎn)。
  如何清理提取的網(wǎng)頁(yè)內容?
  快速準確地從新聞網(wǎng)頁(yè)的html中提取想要的信息數據,如標題、發(fā)布時(shí)間、正文內容等,給內容提取帶來(lái)困難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)二:需要登錄才能抓取想要的數據
  人們很貪婪,想要無(wú)窮無(wú)盡的數據,但是很多數據并不容易提供給你。有一大類(lèi)數據,只有賬號登錄才能看到。也就是說(shuō),爬蟲(chóng)在請求的時(shí)候必須登錄才能抓取數據。
  如何獲取登錄狀態(tài)?

網(wǎng)絡(luò )爬蟲(chóng)—利用SAS抓取網(wǎng)頁(yè)方法

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 99 次瀏覽 ? 2022-05-14 02:43 ? 來(lái)自相關(guān)話(huà)題

  網(wǎng)絡(luò )爬蟲(chóng)—利用SAS抓取網(wǎng)頁(yè)方法
  萬(wàn)維網(wǎng)過(guò)多的信息,股票報價(jià),電影評論,市場(chǎng)價(jià)格趨勢話(huà)題,幾乎所有的東西,可以發(fā)現在點(diǎn)擊一個(gè)按鈕。在分析數據中發(fā)現,許多SAS用戶(hù)感興趣在網(wǎng)絡(luò )上,但你得到這個(gè)數據的SAS環(huán)境呢?有很多方法,如 SAS數據步驟中的代碼在設計你自己的網(wǎng)絡(luò )爬蟲(chóng)或利用SAS%TMFILTER宏 ? 文本挖掘。在本文中,我們將審查一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構。我們將討論獲得網(wǎng)站的方法到SAS的信息,以及審查內部所謂的SAS搜索從實(shí)驗項目的實(shí)驗代碼管道。我們也將提供咨詢(xún)如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng),以適應個(gè)性化需求,以及如何具體的數據導入到SAS ? 企業(yè)礦工?。
  簡(jiǎn)介:互聯(lián)網(wǎng)已經(jīng)成為一個(gè)有用的信息來(lái)源。通常是Web上的數據,我們要使用內的SAS,所以我們需要找到一種方式來(lái)獲得這個(gè)數據。最好的辦法是使用一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。 SAS提供幾個(gè)從Web爬行和提取信息的方法。您可以使用基本的SAS數據步驟中的代碼,或SAS文本礦工的%TMFILTER宏。雖然目前無(wú)法使用,SAS搜索管道將是一個(gè)功能強大的Web爬行產(chǎn)品,并提供更多的工具,網(wǎng)絡(luò )爬行。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),所以取決于你想實(shí)現抓取的,它是最好對其進(jìn)行審查。
  首先,重要的是要了解網(wǎng)絡(luò )爬蟲(chóng)是如何工作的。你應該熟悉數據步驟的代碼,宏,和SAS過(guò)程PROC SQL,然后再繼續。
  網(wǎng)絡(luò )爬蟲(chóng)概述:一個(gè)網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,一個(gè)或多個(gè)起始地址作為“種子URL”,下載網(wǎng)站這些URL相關(guān)的網(wǎng)頁(yè),在網(wǎng)頁(yè)中包含的任何超鏈接提取,并遞歸地繼續這些超鏈接標識下載Web頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)是很簡(jiǎn)單的。
  一個(gè)Web 履帶式有四項職責:
  1。從候選人中選擇一個(gè)網(wǎng)址。
  2。它下載相關(guān)的Web頁(yè)。
  3。它提取物在網(wǎng)頁(yè)中的URL(超鏈接)。
  4。它補充說(shuō),未曾遇到的候選集的URL
  方法1:在WEB SAS數據步驟中的代碼履帶式
  首先創(chuàng )建一個(gè)網(wǎng)址的網(wǎng)站的Web crawler將開(kāi)始列表。
  data work.links_to_crawl;
  length url $256 ;
  input url $;
  datalines;
  ;
  run
  為了確保我們不抓取相同的URL一次以上,持有環(huán)節已創(chuàng )建一個(gè)數據抓取。
  當Web數據集將在開(kāi)始時(shí)是空的,但一個(gè)網(wǎng)站的網(wǎng)址將被添加到數據集履帶式完成抓取該網(wǎng)站。
  data work.links_crawled;
  length url $256;
  run;
  現在我們開(kāi)始爬行!該代碼需要我們的 work.links_to_crawl數據集的第一個(gè)URL。在第一觀(guān)察“_N_式1”,網(wǎng)址是投入名為 next_url 宏變量,所有剩余的URL放回我們的種子URL數據集,使他們在未來(lái)的迭代。
  /* pop the next url off */
  %let next_url = ;
  data work.links_to_crawl;
  set work.links_to_crawl;
  if _n_ eq 1 then call symput(“next_url”, url);
  else output;
  run;
  現在,從互聯(lián)網(wǎng)上下載的網(wǎng)址。創(chuàng )建一個(gè)文件名稱(chēng) _nexturl 。我們讓SAS知道它是一個(gè)URL 而且可以發(fā)現,AT&next_url,這是我們的宏觀(guān)變量,它包含的網(wǎng)址我們從拉 work.links_to_crawl數據集。
  /* crawl the url */
  filename _nexturl url “&next_url”
  建立后的文件名的URL參考,確定一個(gè)地方把我們下載的文件。創(chuàng )建另一個(gè)文件名引用所謂 htmlfilm的條目,并在那里把從 url_file.html收集到的信息。
  /* put the file we crawled here */
  filename htmlfile “url_file.html”
  接下來(lái),我們通過(guò)數據的循環(huán),把它寫(xiě)htmlfilm的條目文件名參考,并尋找更多的網(wǎng)址添加到我們的 work.links_to_crawl數據集。
  /* find more urls */
  data work._urls(keep=url);
  length url $256 ;
  file htmlfile;
  infile _nexturl length=len;
  input text $varying2000. len;
  put text;
  start = 1;
  stop = length(text);
  使用正則表達式一個(gè)網(wǎng)站的網(wǎng)址,以幫助搜索。正則表達式的匹配方法文本字符串,如字,詞,或字符模式。 SAS已經(jīng)提供了許多強大的字符串功能。然而,正則表達式通常會(huì )提供一個(gè)更簡(jiǎn)潔的方式,操縱和匹配的文本.
  if _n_ = 1 then do;
  retain patternID;
  pattern = ‘/href=”([^"]+)”/i’;
  patternID = prxparse(pattern);
  end
  首次觀(guān)察到,創(chuàng )建一個(gè)patternID將保持整個(gè)數據步運行。尋找的模式是: “/href=”([^"]+)”/i’”.,這意味著(zhù)我們正在尋找字符串“HREF =”“,然后再尋找任何字符串,是至少有一個(gè)字符長(cháng),不包含引號(“),并結束在引號(”)。在’我’ 目的的手段使用不區分大小寫(xiě)的方法,以配合我們的正則表達式。
  As a result, the Web crawler will find these types of strings:
  href=”sgf/2010/papers.html”
  href=””
  HREF=””
  hReF=””
  現在正則表達式匹配的一個(gè)網(wǎng)站上的文字。 PRXNEXT需要五個(gè)參數:正則表達式我們要尋找,尋找開(kāi)始尋找正則表達式的開(kāi)始位置,結束位置停止正則表達式,一旦發(fā)現字符串中的位置,而字符串的長(cháng)度,如果發(fā)現的位置將是0,如果沒(méi)有找到字符串。 PRXNEXT也改變了開(kāi)始的參數,使搜索重新開(kāi)始后的最后一場(chǎng)比賽是發(fā)現。
  call prxnext(patternID, start, stop, text, position, length);
  代碼中的循環(huán),在網(wǎng)站上找到的所有環(huán)節顯示的文本。
  do while (position ^= 0);
  url = substr(text, position+6, length-7);
  output;
  call prxnext(patternID, start, stop, text, position, length);
  end;
  run;
  如果代碼發(fā)現一個(gè)網(wǎng)址,它會(huì )檢索唯一的URL的一部分,啟動(dòng)后的第一個(gè)引號。例如,如果代碼中發(fā)現的HREF =“”,那么它應該保持 。使用 substr到刪除前的6個(gè)字符和最后一個(gè)字符的URL的其余部分輸出的work._urls 數據集?,F在,我們插入的URL代碼只是以跟蹤抓取到一個(gè)數據集名為 work.links_crawled 我們已經(jīng)和確保我們不再次瀏覽有。
  /* add the current link to the list of urls we have already crawled */
  data work._old_link;
  url = “&next_url”;
  run;
  proc append base=work.links_crawled data=work._old_link force;
  run;
  下一步是在數據集 work._urls 的過(guò)程中發(fā)現的網(wǎng)址列表,以確保:
  1。我們尚未抓取他們,換句話(huà)說(shuō)URL是不是在 work.links_crawled)。
  2。我們沒(méi)有排隊抓取的URL(網(wǎng)址換句話(huà)說(shuō),是不是在work.links_to_crawl )。
  /*
  * only add urls that we have not already crawled
  * or that are not queued up to be crawled
  *
  */
  proc sql noprint;
  create table work._append as
  select url
  from work._urls
  where url not in (select url from work.links_crawled)
  and url not in (select url from work.links_to_crawl);
  quit;
  然后,我們添加網(wǎng)址還沒(méi)有被抓取,而不是已經(jīng)排隊 work.links_to_crawl數據集。
  /* add new links */
  proc append base=work.links_to_crawl data=work._append force;
  run;
  此時(shí)的代碼循環(huán)回到開(kāi)始劫掠 work.links_to_crawl數據集的下一個(gè)URL。 查看全部

  網(wǎng)絡(luò )爬蟲(chóng)—利用SAS抓取網(wǎng)頁(yè)方法
  萬(wàn)維網(wǎng)過(guò)多的信息,股票報價(jià),電影評論,市場(chǎng)價(jià)格趨勢話(huà)題,幾乎所有的東西,可以發(fā)現在點(diǎn)擊一個(gè)按鈕。在分析數據中發(fā)現,許多SAS用戶(hù)感興趣在網(wǎng)絡(luò )上,但你得到這個(gè)數據的SAS環(huán)境呢?有很多方法,如 SAS數據步驟中的代碼在設計你自己的網(wǎng)絡(luò )爬蟲(chóng)或利用SAS%TMFILTER宏 ? 文本挖掘。在本文中,我們將審查一個(gè)網(wǎng)絡(luò )爬蟲(chóng)的總體架構。我們將討論獲得網(wǎng)站的方法到SAS的信息,以及審查內部所謂的SAS搜索從實(shí)驗項目的實(shí)驗代碼管道。我們也將提供咨詢(xún)如何輕松定制一個(gè)網(wǎng)絡(luò )爬蟲(chóng),以適應個(gè)性化需求,以及如何具體的數據導入到SAS ? 企業(yè)礦工?。
  簡(jiǎn)介:互聯(lián)網(wǎng)已經(jīng)成為一個(gè)有用的信息來(lái)源。通常是Web上的數據,我們要使用內的SAS,所以我們需要找到一種方式來(lái)獲得這個(gè)數據。最好的辦法是使用一個(gè)網(wǎng)絡(luò )爬蟲(chóng)。 SAS提供幾個(gè)從Web爬行和提取信息的方法。您可以使用基本的SAS數據步驟中的代碼,或SAS文本礦工的%TMFILTER宏。雖然目前無(wú)法使用,SAS搜索管道將是一個(gè)功能強大的Web爬行產(chǎn)品,并提供更多的工具,網(wǎng)絡(luò )爬行。每種方法都有其優(yōu)點(diǎn)和缺點(diǎn),所以取決于你想實(shí)現抓取的,它是最好對其進(jìn)行審查。
  首先,重要的是要了解網(wǎng)絡(luò )爬蟲(chóng)是如何工作的。你應該熟悉數據步驟的代碼,宏,和SAS過(guò)程PROC SQL,然后再繼續。
  網(wǎng)絡(luò )爬蟲(chóng)概述:一個(gè)網(wǎng)絡(luò )爬蟲(chóng)是一個(gè)程序,一個(gè)或多個(gè)起始地址作為“種子URL”,下載網(wǎng)站這些URL相關(guān)的網(wǎng)頁(yè),在網(wǎng)頁(yè)中包含的任何超鏈接提取,并遞歸地繼續這些超鏈接標識下載Web頁(yè)。從概念上講,網(wǎng)絡(luò )爬蟲(chóng)是很簡(jiǎn)單的。
  一個(gè)Web 履帶式有四項職責:
  1。從候選人中選擇一個(gè)網(wǎng)址。
  2。它下載相關(guān)的Web頁(yè)。
  3。它提取物在網(wǎng)頁(yè)中的URL(超鏈接)。
  4。它補充說(shuō),未曾遇到的候選集的URL
  方法1:在WEB SAS數據步驟中的代碼履帶式
  首先創(chuàng )建一個(gè)網(wǎng)址的網(wǎng)站的Web crawler將開(kāi)始列表。
  data work.links_to_crawl;
  length url $256 ;
  input url $;
  datalines;
  ;
  run
  為了確保我們不抓取相同的URL一次以上,持有環(huán)節已創(chuàng )建一個(gè)數據抓取。
  當Web數據集將在開(kāi)始時(shí)是空的,但一個(gè)網(wǎng)站的網(wǎng)址將被添加到數據集履帶式完成抓取該網(wǎng)站。
  data work.links_crawled;
  length url $256;
  run;
  現在我們開(kāi)始爬行!該代碼需要我們的 work.links_to_crawl數據集的第一個(gè)URL。在第一觀(guān)察“_N_式1”,網(wǎng)址是投入名為 next_url 宏變量,所有剩余的URL放回我們的種子URL數據集,使他們在未來(lái)的迭代。
  /* pop the next url off */
  %let next_url = ;
  data work.links_to_crawl;
  set work.links_to_crawl;
  if _n_ eq 1 then call symput(“next_url”, url);
  else output;
  run;
  現在,從互聯(lián)網(wǎng)上下載的網(wǎng)址。創(chuàng )建一個(gè)文件名稱(chēng) _nexturl 。我們讓SAS知道它是一個(gè)URL 而且可以發(fā)現,AT&next_url,這是我們的宏觀(guān)變量,它包含的網(wǎng)址我們從拉 work.links_to_crawl數據集。
  /* crawl the url */
  filename _nexturl url “&next_url”
  建立后的文件名的URL參考,確定一個(gè)地方把我們下載的文件。創(chuàng )建另一個(gè)文件名引用所謂 htmlfilm的條目,并在那里把從 url_file.html收集到的信息。
  /* put the file we crawled here */
  filename htmlfile “url_file.html”
  接下來(lái),我們通過(guò)數據的循環(huán),把它寫(xiě)htmlfilm的條目文件名參考,并尋找更多的網(wǎng)址添加到我們的 work.links_to_crawl數據集。
  /* find more urls */
  data work._urls(keep=url);
  length url $256 ;
  file htmlfile;
  infile _nexturl length=len;
  input text $varying2000. len;
  put text;
  start = 1;
  stop = length(text);
  使用正則表達式一個(gè)網(wǎng)站的網(wǎng)址,以幫助搜索。正則表達式的匹配方法文本字符串,如字,詞,或字符模式。 SAS已經(jīng)提供了許多強大的字符串功能。然而,正則表達式通常會(huì )提供一個(gè)更簡(jiǎn)潔的方式,操縱和匹配的文本.
  if _n_ = 1 then do;
  retain patternID;
  pattern = ‘/href=”([^"]+)”/i’;
  patternID = prxparse(pattern);
  end
  首次觀(guān)察到,創(chuàng )建一個(gè)patternID將保持整個(gè)數據步運行。尋找的模式是: “/href=”([^"]+)”/i’”.,這意味著(zhù)我們正在尋找字符串“HREF =”“,然后再尋找任何字符串,是至少有一個(gè)字符長(cháng),不包含引號(“),并結束在引號(”)。在’我’ 目的的手段使用不區分大小寫(xiě)的方法,以配合我們的正則表達式。
  As a result, the Web crawler will find these types of strings:
  href=”sgf/2010/papers.html”
  href=””
  HREF=””
  hReF=””
  現在正則表達式匹配的一個(gè)網(wǎng)站上的文字。 PRXNEXT需要五個(gè)參數:正則表達式我們要尋找,尋找開(kāi)始尋找正則表達式的開(kāi)始位置,結束位置停止正則表達式,一旦發(fā)現字符串中的位置,而字符串的長(cháng)度,如果發(fā)現的位置將是0,如果沒(méi)有找到字符串。 PRXNEXT也改變了開(kāi)始的參數,使搜索重新開(kāi)始后的最后一場(chǎng)比賽是發(fā)現。
  call prxnext(patternID, start, stop, text, position, length);
  代碼中的循環(huán),在網(wǎng)站上找到的所有環(huán)節顯示的文本。
  do while (position ^= 0);
  url = substr(text, position+6, length-7);
  output;
  call prxnext(patternID, start, stop, text, position, length);
  end;
  run;
  如果代碼發(fā)現一個(gè)網(wǎng)址,它會(huì )檢索唯一的URL的一部分,啟動(dòng)后的第一個(gè)引號。例如,如果代碼中發(fā)現的HREF =“”,那么它應該保持 。使用 substr到刪除前的6個(gè)字符和最后一個(gè)字符的URL的其余部分輸出的work._urls 數據集?,F在,我們插入的URL代碼只是以跟蹤抓取到一個(gè)數據集名為 work.links_crawled 我們已經(jīng)和確保我們不再次瀏覽有。
  /* add the current link to the list of urls we have already crawled */
  data work._old_link;
  url = “&next_url”;
  run;
  proc append base=work.links_crawled data=work._old_link force;
  run;
  下一步是在數據集 work._urls 的過(guò)程中發(fā)現的網(wǎng)址列表,以確保:
  1。我們尚未抓取他們,換句話(huà)說(shuō)URL是不是在 work.links_crawled)。
  2。我們沒(méi)有排隊抓取的URL(網(wǎng)址換句話(huà)說(shuō),是不是在work.links_to_crawl )。
  /*
  * only add urls that we have not already crawled
  * or that are not queued up to be crawled
  *
  */
  proc sql noprint;
  create table work._append as
  select url
  from work._urls
  where url not in (select url from work.links_crawled)
  and url not in (select url from work.links_to_crawl);
  quit;
  然后,我們添加網(wǎng)址還沒(méi)有被抓取,而不是已經(jīng)排隊 work.links_to_crawl數據集。
  /* add new links */
  proc append base=work.links_to_crawl data=work._append force;
  run;
  此時(shí)的代碼循環(huán)回到開(kāi)始劫掠 work.links_to_crawl數據集的下一個(gè)URL。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的選擇思路及選擇方法介紹-requests

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 82 次瀏覽 ? 2022-05-11 15:02 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的選擇思路及選擇方法介紹-requests
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的工具很多,比如requests、beautifulsoup等等;另外爬蟲(chóng)還可以用scrapy框架做反爬蟲(chóng)。甚至apache/nginx做反反爬蟲(chóng)也可以。本文會(huì )結合requests做網(wǎng)頁(yè)反爬蟲(chóng)。文章包含以下主要內容1.介紹一下requests庫2.先介紹爬蟲(chóng)是怎么獲取網(wǎng)頁(yè)數據的3.解決爬蟲(chóng)服務(wù)器速度慢、不穩定的問(wèn)題4.在各種網(wǎng)頁(yè)爬蟲(chóng)框架中的選擇思路5.requests詳細流程看起來(lái)主要內容不多,一行代碼搞定,但上述一些問(wèn)題確很麻煩。
  以上每一個(gè)都會(huì )成為一篇文章,首先說(shuō)明這里每一個(gè)主要代碼單獨抽取下即可,其實(shí)大多是我寫(xiě)的。再說(shuō)明上述操作本質(zhì)上是對url和網(wǎng)頁(yè)元素進(jìn)行了解析。由于requests方便的處理url,因此解析html這件事可以交給自己來(lái)做。requests最簡(jiǎn)單的實(shí)現抓取網(wǎng)頁(yè)時(shí),沒(méi)有必要在html網(wǎng)頁(yè)處理過(guò)程中還需要保存html信息,基本步驟:1.獲取網(wǎng)頁(yè)包含信息2.解析html3.存儲數據對爬蟲(chóng)爬取html來(lái)說(shuō),需要經(jīng)歷requests庫爬取網(wǎng)頁(yè)時(shí)傳遞參數,傳遞到selenium線(xiàn)程池,由線(xiàn)程池來(lái)解析html信息。
  selenium不需要保存任何網(wǎng)頁(yè)信息,直接處理后分析為webapi輸出即可。所以上述的各個(gè)步驟和html編碼沒(méi)有太大關(guān)系。也不要問(wèn)為什么不用xpath,因為xpath和html編碼不一樣,在抓取網(wǎng)頁(yè)時(shí)必須轉換為xpath/emoji可讀語(yǔ)言才能讀取正?!,F在有一些爬蟲(chóng)框架都有支持requests,比如scrapy、kibana和motrix;正因為requests簡(jiǎn)單,因此其解析html的方式也簡(jiǎn)單;我們介紹一下其中一些爬蟲(chóng)框架的爬取html的方式。
  這樣的主要目的是想通過(guò)對requests的熟悉,進(jìn)一步使用其他框架做爬蟲(chóng)之類(lèi)的。requestsjs官網(wǎng):requests的一個(gè)重要版本,很多第三方包支持其爬取html信息。javascript解析html模塊庫:v8解析javascript/text/string,使用jsonp:直接發(fā)送http請求或是使用瀏覽器的瀏覽器api返回html數據,jquery解析javascript代碼,并將javascript數據以html數據格式返回。
  prestojs(已經(jīng)被大棄)/zeptojs(github)requestsjs的主要代碼都來(lái)自于這里;web容器:injection來(lái)負責生成html標簽和處理html;有一個(gè)重要組件是seleniumdriver和requests的交互,getseleniumdriver做的事情非常類(lèi)似于html編程中的函數調用,類(lèi)似于open和session來(lái)做html編程中的dom操作;httpurlconnectionhttpconnection負責接收請求并處理響應,并且通過(guò)post請求,向服務(wù)器發(fā)送數據,請求的格式使用headers:attributes:user-agent:mozilla/5.0(ipad;cpuiphoneosx10_。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的選擇思路及選擇方法介紹-requests
  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據的工具很多,比如requests、beautifulsoup等等;另外爬蟲(chóng)還可以用scrapy框架做反爬蟲(chóng)。甚至apache/nginx做反反爬蟲(chóng)也可以。本文會(huì )結合requests做網(wǎng)頁(yè)反爬蟲(chóng)。文章包含以下主要內容1.介紹一下requests庫2.先介紹爬蟲(chóng)是怎么獲取網(wǎng)頁(yè)數據的3.解決爬蟲(chóng)服務(wù)器速度慢、不穩定的問(wèn)題4.在各種網(wǎng)頁(yè)爬蟲(chóng)框架中的選擇思路5.requests詳細流程看起來(lái)主要內容不多,一行代碼搞定,但上述一些問(wèn)題確很麻煩。
  以上每一個(gè)都會(huì )成為一篇文章,首先說(shuō)明這里每一個(gè)主要代碼單獨抽取下即可,其實(shí)大多是我寫(xiě)的。再說(shuō)明上述操作本質(zhì)上是對url和網(wǎng)頁(yè)元素進(jìn)行了解析。由于requests方便的處理url,因此解析html這件事可以交給自己來(lái)做。requests最簡(jiǎn)單的實(shí)現抓取網(wǎng)頁(yè)時(shí),沒(méi)有必要在html網(wǎng)頁(yè)處理過(guò)程中還需要保存html信息,基本步驟:1.獲取網(wǎng)頁(yè)包含信息2.解析html3.存儲數據對爬蟲(chóng)爬取html來(lái)說(shuō),需要經(jīng)歷requests庫爬取網(wǎng)頁(yè)時(shí)傳遞參數,傳遞到selenium線(xiàn)程池,由線(xiàn)程池來(lái)解析html信息。
  selenium不需要保存任何網(wǎng)頁(yè)信息,直接處理后分析為webapi輸出即可。所以上述的各個(gè)步驟和html編碼沒(méi)有太大關(guān)系。也不要問(wèn)為什么不用xpath,因為xpath和html編碼不一樣,在抓取網(wǎng)頁(yè)時(shí)必須轉換為xpath/emoji可讀語(yǔ)言才能讀取正?!,F在有一些爬蟲(chóng)框架都有支持requests,比如scrapy、kibana和motrix;正因為requests簡(jiǎn)單,因此其解析html的方式也簡(jiǎn)單;我們介紹一下其中一些爬蟲(chóng)框架的爬取html的方式。
  這樣的主要目的是想通過(guò)對requests的熟悉,進(jìn)一步使用其他框架做爬蟲(chóng)之類(lèi)的。requestsjs官網(wǎng):requests的一個(gè)重要版本,很多第三方包支持其爬取html信息。javascript解析html模塊庫:v8解析javascript/text/string,使用jsonp:直接發(fā)送http請求或是使用瀏覽器的瀏覽器api返回html數據,jquery解析javascript代碼,并將javascript數據以html數據格式返回。
  prestojs(已經(jīng)被大棄)/zeptojs(github)requestsjs的主要代碼都來(lái)自于這里;web容器:injection來(lái)負責生成html標簽和處理html;有一個(gè)重要組件是seleniumdriver和requests的交互,getseleniumdriver做的事情非常類(lèi)似于html編程中的函數調用,類(lèi)似于open和session來(lái)做html編程中的dom操作;httpurlconnectionhttpconnection負責接收請求并處理響應,并且通過(guò)post請求,向服務(wù)器發(fā)送數據,請求的格式使用headers:attributes:user-agent:mozilla/5.0(ipad;cpuiphoneosx10_。

爬蟲(chóng)入門(mén)到精通-網(wǎng)頁(yè)的下載

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 119 次瀏覽 ? 2022-05-09 09:27 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)入門(mén)到精通-網(wǎng)頁(yè)的下載
  
  本文章屬于爬蟲(chóng)入門(mén)到精通系統教程第四講
  在爬蟲(chóng)入門(mén)到精通第二講中,我們了解了HTTP協(xié)議
  #rd,那么我們現在使用這些協(xié)議來(lái)快速爬蟲(chóng)吧
  本文的目標
  當你看完本文后,你應該能爬?。◣缀酰┤魏蔚木W(wǎng)頁(yè)
  使用chrome抓包抓包(packet capture)就是將網(wǎng)絡(luò )傳輸發(fā)送與接收的數據包進(jìn)行截獲、重發(fā)、編輯、轉存等操作,也用來(lái)檢查網(wǎng)絡(luò )安全。抓包也經(jīng)常被用來(lái)進(jìn)行數據截取等。第一個(gè)案列:抓取輪子哥的動(dòng)態(tài)()
  1.打開(kāi)輪子哥動(dòng)態(tài)這個(gè)網(wǎng)頁(yè)
  
  2.打開(kāi)抓包工具
  應該會(huì )看到如下界面
  
  3.找到我們需要的請求
  可以看到如下截圖,里面有這么多的請求,那么到底哪一個(gè)才是我們需要的呢 ?
  
  這邊提供一個(gè)小技巧
  簡(jiǎn)單來(lái)講就是如果整個(gè)頁(yè)面沒(méi)有刷新的話(huà),那就是在XHR里面,否則在DOC里面
  因為本次抓包整個(gè)頁(yè)面有刷新,所以,我們需要找的請求在DOC下面,可以看到只有一個(gè)請求
  
  4.驗證請求是對的
  有以下兩種方法(基本上用1,因為比較快)
  在我們要抓包的頁(yè)面隨便copy出幾個(gè)字,在Respoinse中使用ctrl+f 查找,如果有找到,說(shuō)明我們找到的是對的 (我查找的是"和微軟粉絲談")
  
  2.把response中所有的內容復制到一個(gè)txt中,并改名為"#.html"(這里的#可以隨便取)
  然后打開(kāi)這個(gè)html,看看是否和我們要抓的一樣
  
  如果發(fā)現要找的不對,那你可以打開(kāi)下一個(gè)請求檢查下
  5.模擬發(fā)送
  點(diǎn)擊Headers
  可以看到請求的url是:
  方法是: GET
  requests headers 是(下圖中框出來(lái)的地方)
  
  所以我們的代碼應該是:
  import requests# 這里的headers就是我們上圖框中的headers
request_headers = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', ?
'Accept-Encoding':'gzip, deflate, sdch, br','Accept-Language':'zh-CN,zh;q=0.8','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'','Host':'www.zhihu.com','Referer':'https://www.zhihu.com/','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
#上圖中的url
url = "https://www.zhihu.com/people/e ... ot%3B
# 上圖中的請求方法(get)
z = requests.get(url,headers=request_headers)
print z.content
  這段代碼簡(jiǎn)單來(lái)說(shuō)就是把 我們抓包看到的用程序來(lái)實(shí)現
  一個(gè)小總結
  我們爬取一個(gè)網(wǎng)頁(yè)的步驟可以分為如下:
  打開(kāi)要爬取的網(wǎng)頁(yè)
  打開(kāi)開(kāi)發(fā)者工具,并讓請求重發(fā)一次(簡(jiǎn)單講就是抓包)
  找到正確的請求
  用程序模擬發(fā)送
  第二個(gè)案列:點(diǎn)贊
  1.打開(kāi)要爬取的網(wǎng)頁(yè) 查看全部

  爬蟲(chóng)入門(mén)到精通-網(wǎng)頁(yè)的下載
  
  本文章屬于爬蟲(chóng)入門(mén)到精通系統教程第四講
  在爬蟲(chóng)入門(mén)到精通第二講中,我們了解了HTTP協(xié)議
  #rd,那么我們現在使用這些協(xié)議來(lái)快速爬蟲(chóng)吧
  本文的目標
  當你看完本文后,你應該能爬?。◣缀酰┤魏蔚木W(wǎng)頁(yè)
  使用chrome抓包抓包(packet capture)就是將網(wǎng)絡(luò )傳輸發(fā)送與接收的數據包進(jìn)行截獲、重發(fā)、編輯、轉存等操作,也用來(lái)檢查網(wǎng)絡(luò )安全。抓包也經(jīng)常被用來(lái)進(jìn)行數據截取等。第一個(gè)案列:抓取輪子哥的動(dòng)態(tài)()
  1.打開(kāi)輪子哥動(dòng)態(tài)這個(gè)網(wǎng)頁(yè)
  
  2.打開(kāi)抓包工具
  應該會(huì )看到如下界面
  
  3.找到我們需要的請求
  可以看到如下截圖,里面有這么多的請求,那么到底哪一個(gè)才是我們需要的呢 ?
  
  這邊提供一個(gè)小技巧
  簡(jiǎn)單來(lái)講就是如果整個(gè)頁(yè)面沒(méi)有刷新的話(huà),那就是在XHR里面,否則在DOC里面
  因為本次抓包整個(gè)頁(yè)面有刷新,所以,我們需要找的請求在DOC下面,可以看到只有一個(gè)請求
  
  4.驗證請求是對的
  有以下兩種方法(基本上用1,因為比較快)
  在我們要抓包的頁(yè)面隨便copy出幾個(gè)字,在Respoinse中使用ctrl+f 查找,如果有找到,說(shuō)明我們找到的是對的 (我查找的是"和微軟粉絲談")
  
  2.把response中所有的內容復制到一個(gè)txt中,并改名為"#.html"(這里的#可以隨便取)
  然后打開(kāi)這個(gè)html,看看是否和我們要抓的一樣
  
  如果發(fā)現要找的不對,那你可以打開(kāi)下一個(gè)請求檢查下
  5.模擬發(fā)送
  點(diǎn)擊Headers
  可以看到請求的url是:
  方法是: GET
  requests headers 是(下圖中框出來(lái)的地方)
  
  所以我們的代碼應該是:
  import requests# 這里的headers就是我們上圖框中的headers
request_headers = {
'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8', ?
'Accept-Encoding':'gzip, deflate, sdch, br','Accept-Language':'zh-CN,zh;q=0.8','Cache-Control':'max-age=0','Connection':'keep-alive','Cookie':'','Host':'www.zhihu.com','Referer':'https://www.zhihu.com/','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'
}
#上圖中的url
url = "https://www.zhihu.com/people/e ... ot%3B
# 上圖中的請求方法(get)
z = requests.get(url,headers=request_headers)
print z.content
  這段代碼簡(jiǎn)單來(lái)說(shuō)就是把 我們抓包看到的用程序來(lái)實(shí)現
  一個(gè)小總結
  我們爬取一個(gè)網(wǎng)頁(yè)的步驟可以分為如下:
  打開(kāi)要爬取的網(wǎng)頁(yè)
  打開(kāi)開(kāi)發(fā)者工具,并讓請求重發(fā)一次(簡(jiǎn)單講就是抓包)
  找到正確的請求
  用程序模擬發(fā)送
  第二個(gè)案列:點(diǎn)贊
  1.打開(kāi)要爬取的網(wǎng)頁(yè)

淺談網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法和簡(jiǎn)單代碼實(shí)現

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 51 次瀏覽 ? 2022-05-05 06:12 ? 來(lái)自相關(guān)話(huà)題

  淺談網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法和簡(jiǎn)單代碼實(shí)現
  點(diǎn)擊上方“程序人生”,選擇“置頂公眾號”
  第一時(shí)間關(guān)注程序猿(媛)身邊的故事
  
  作者
  Python進(jìn)階者
  已獲原作者授權,如需轉載,請聯(lián)系原作者。
  我們今天要學(xué)習的內容,主要是給大家普及一下深度優(yōu)先算法的基本概念,詳情內容如下。
  學(xué)過(guò)網(wǎng)站設計的小伙伴們都知道網(wǎng)站通常都是分層進(jìn)行設計的,最上層的是頂級域名,之后是子域名,子域名下又有子域名等等,同時(shí),每個(gè)子域名可能還會(huì )擁有多個(gè)同級域名,而且URL之間可能還有相互鏈接,千姿百態(tài),由此構成一個(gè)復雜的網(wǎng)絡(luò )。
  
  當一個(gè)網(wǎng)站的URL非常多的時(shí)候,我們務(wù)必要設計好URL,否則在后期的理解、維護或者開(kāi)發(fā)過(guò)程中就會(huì )非常的混亂。理解以上的網(wǎng)頁(yè)結構設計之后,現在正式的引入網(wǎng)絡(luò )爬蟲(chóng)中的深度優(yōu)先算法。
  
  上圖是一個(gè)二叉樹(shù)結構,通過(guò)對這個(gè)二叉樹(shù)的遍歷,來(lái)類(lèi)比抓取網(wǎng)頁(yè),加深對爬蟲(chóng)策略的理解。深度優(yōu)先算法的主要思想是首先從頂級域名A開(kāi)始,之后從中提取出兩個(gè)鏈接B和C,待鏈接B抓取完成之后,下一個(gè)要抓取的鏈接則是D或者E,而不是說(shuō)抓取完成鏈接B之后,立馬去抓取鏈接C。抓取完鏈接D之后,發(fā)現鏈接D中所有的URL已經(jīng)被訪(fǎng)問(wèn)過(guò)了,在這之前我們已經(jīng)建立了一個(gè)被訪(fǎng)問(wèn)過(guò)的URL列表,專(zhuān)門(mén)用于存儲被訪(fǎng)問(wèn)過(guò)的URL。當鏈接D完全被抓取完成之后,接下來(lái)就會(huì )去抓取鏈接E。待鏈接E爬取完成之后,不會(huì )去爬取鏈接C,而是會(huì )繼續往下深入的去爬取鏈接I。原則就是鏈接會(huì )一步一步的往下爬,只要鏈接下還有子鏈接,且該子鏈接尚未被訪(fǎng)問(wèn)過(guò),這就是深度優(yōu)先算法的主要思想。深度優(yōu)先算法是讓爬蟲(chóng)一步一步往下進(jìn)行抓取完成之后,再一步一步退回來(lái),優(yōu)先考慮深度。理解好深度優(yōu)先算法之后,再來(lái)看上圖,可以得到該二叉樹(shù)呈現的爬蟲(chóng)抓取鏈接的順序依次為:A、B、D、E、I、C、F、G、H(這里假設左邊的鏈接先會(huì )被爬?。?。實(shí)際上,我們在做網(wǎng)絡(luò )爬蟲(chóng)過(guò)程中,很多時(shí)候都是在用這種算法進(jìn)行實(shí)現的,其實(shí)我們常用的Scrapy爬蟲(chóng)框架默認也是用該算法來(lái)進(jìn)行實(shí)現的。通過(guò)上面的理解,我們可以認為深度優(yōu)先算法本質(zhì)上是通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現的。
  下圖展示的是深度優(yōu)先算法的代碼實(shí)現過(guò)程。
  
  深度優(yōu)先過(guò)程實(shí)際上是通過(guò)一種遞歸的方式來(lái)進(jìn)行實(shí)現的??瓷蠄D的代碼,首先定義一個(gè)函數,用于實(shí)現深度優(yōu)先過(guò)程,然后傳入節點(diǎn)參數,如果該節點(diǎn)非空的話(huà),則將其打印出來(lái),可以類(lèi)比一下二叉樹(shù)中的頂級點(diǎn)A。將節點(diǎn)打印完成之后,看看其是否存在左節點(diǎn)(鏈接B)和右節點(diǎn)(鏈接C),如果左節點(diǎn)非空的話(huà),則將其進(jìn)行返回,再次調用深度優(yōu)先函數本身進(jìn)行遞歸,得到新的左節點(diǎn)(鏈接D)和右節點(diǎn)(鏈接E),以此類(lèi)推,直到所有的節點(diǎn)都被遍歷或者達到既定的條件才會(huì )停止。右節點(diǎn)的實(shí)現過(guò)程亦是如此,不再贅述。
  
  深度優(yōu)先過(guò)程通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現,當遞歸不斷進(jìn)行,沒(méi)有跳出遞歸或者遞歸太深的話(huà),很容易出現棧溢出的情況,所以在實(shí)際應用的過(guò)程中要有這個(gè)意識。
  深度優(yōu)先算法和廣度優(yōu)先算法是數據結構里邊非常重要的一種算法結構,也是非常常用的一種算法,而且在面試過(guò)程中也是非常常見(jiàn)的一道面試題,所以建議大家都需要掌握它,下一篇文章我們將介紹廣度優(yōu)先算法,敬請期待。
  
  關(guān)于網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法的簡(jiǎn)單介紹就到這里了,小伙伴們get到木有咧?
  - The End -
  「若你有原創(chuàng )文章想與大家分享,歡迎投稿?!?
  加編輯微信ID,備注#投稿#:
  程序 丨 druidlost
  小七 丨 duoshangshuang 查看全部

  淺談網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法和簡(jiǎn)單代碼實(shí)現
  點(diǎn)擊上方“程序人生”,選擇“置頂公眾號”
  第一時(shí)間關(guān)注程序猿(媛)身邊的故事
  
  作者
  Python進(jìn)階者
  已獲原作者授權,如需轉載,請聯(lián)系原作者。
  我們今天要學(xué)習的內容,主要是給大家普及一下深度優(yōu)先算法的基本概念,詳情內容如下。
  學(xué)過(guò)網(wǎng)站設計的小伙伴們都知道網(wǎng)站通常都是分層進(jìn)行設計的,最上層的是頂級域名,之后是子域名,子域名下又有子域名等等,同時(shí),每個(gè)子域名可能還會(huì )擁有多個(gè)同級域名,而且URL之間可能還有相互鏈接,千姿百態(tài),由此構成一個(gè)復雜的網(wǎng)絡(luò )。
  
  當一個(gè)網(wǎng)站的URL非常多的時(shí)候,我們務(wù)必要設計好URL,否則在后期的理解、維護或者開(kāi)發(fā)過(guò)程中就會(huì )非常的混亂。理解以上的網(wǎng)頁(yè)結構設計之后,現在正式的引入網(wǎng)絡(luò )爬蟲(chóng)中的深度優(yōu)先算法。
  
  上圖是一個(gè)二叉樹(shù)結構,通過(guò)對這個(gè)二叉樹(shù)的遍歷,來(lái)類(lèi)比抓取網(wǎng)頁(yè),加深對爬蟲(chóng)策略的理解。深度優(yōu)先算法的主要思想是首先從頂級域名A開(kāi)始,之后從中提取出兩個(gè)鏈接B和C,待鏈接B抓取完成之后,下一個(gè)要抓取的鏈接則是D或者E,而不是說(shuō)抓取完成鏈接B之后,立馬去抓取鏈接C。抓取完鏈接D之后,發(fā)現鏈接D中所有的URL已經(jīng)被訪(fǎng)問(wèn)過(guò)了,在這之前我們已經(jīng)建立了一個(gè)被訪(fǎng)問(wèn)過(guò)的URL列表,專(zhuān)門(mén)用于存儲被訪(fǎng)問(wèn)過(guò)的URL。當鏈接D完全被抓取完成之后,接下來(lái)就會(huì )去抓取鏈接E。待鏈接E爬取完成之后,不會(huì )去爬取鏈接C,而是會(huì )繼續往下深入的去爬取鏈接I。原則就是鏈接會(huì )一步一步的往下爬,只要鏈接下還有子鏈接,且該子鏈接尚未被訪(fǎng)問(wèn)過(guò),這就是深度優(yōu)先算法的主要思想。深度優(yōu)先算法是讓爬蟲(chóng)一步一步往下進(jìn)行抓取完成之后,再一步一步退回來(lái),優(yōu)先考慮深度。理解好深度優(yōu)先算法之后,再來(lái)看上圖,可以得到該二叉樹(shù)呈現的爬蟲(chóng)抓取鏈接的順序依次為:A、B、D、E、I、C、F、G、H(這里假設左邊的鏈接先會(huì )被爬?。?。實(shí)際上,我們在做網(wǎng)絡(luò )爬蟲(chóng)過(guò)程中,很多時(shí)候都是在用這種算法進(jìn)行實(shí)現的,其實(shí)我們常用的Scrapy爬蟲(chóng)框架默認也是用該算法來(lái)進(jìn)行實(shí)現的。通過(guò)上面的理解,我們可以認為深度優(yōu)先算法本質(zhì)上是通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現的。
  下圖展示的是深度優(yōu)先算法的代碼實(shí)現過(guò)程。
  
  深度優(yōu)先過(guò)程實(shí)際上是通過(guò)一種遞歸的方式來(lái)進(jìn)行實(shí)現的??瓷蠄D的代碼,首先定義一個(gè)函數,用于實(shí)現深度優(yōu)先過(guò)程,然后傳入節點(diǎn)參數,如果該節點(diǎn)非空的話(huà),則將其打印出來(lái),可以類(lèi)比一下二叉樹(shù)中的頂級點(diǎn)A。將節點(diǎn)打印完成之后,看看其是否存在左節點(diǎn)(鏈接B)和右節點(diǎn)(鏈接C),如果左節點(diǎn)非空的話(huà),則將其進(jìn)行返回,再次調用深度優(yōu)先函數本身進(jìn)行遞歸,得到新的左節點(diǎn)(鏈接D)和右節點(diǎn)(鏈接E),以此類(lèi)推,直到所有的節點(diǎn)都被遍歷或者達到既定的條件才會(huì )停止。右節點(diǎn)的實(shí)現過(guò)程亦是如此,不再贅述。
  
  深度優(yōu)先過(guò)程通過(guò)遞歸的方式來(lái)進(jìn)行實(shí)現,當遞歸不斷進(jìn)行,沒(méi)有跳出遞歸或者遞歸太深的話(huà),很容易出現棧溢出的情況,所以在實(shí)際應用的過(guò)程中要有這個(gè)意識。
  深度優(yōu)先算法和廣度優(yōu)先算法是數據結構里邊非常重要的一種算法結構,也是非常常用的一種算法,而且在面試過(guò)程中也是非常常見(jiàn)的一道面試題,所以建議大家都需要掌握它,下一篇文章我們將介紹廣度優(yōu)先算法,敬請期待。
  
  關(guān)于網(wǎng)絡(luò )爬蟲(chóng)中深度優(yōu)先算法的簡(jiǎn)單介紹就到這里了,小伙伴們get到木有咧?
  - The End -
  「若你有原創(chuàng )文章想與大家分享,歡迎投稿?!?
  加編輯微信ID,備注#投稿#:
  程序 丨 druidlost
  小七 丨 duoshangshuang

Python 編寫(xiě)知乎爬蟲(chóng)實(shí)踐

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 72 次瀏覽 ? 2022-05-05 06:09 ? 來(lái)自相關(guān)話(huà)題

  Python 編寫(xiě)知乎爬蟲(chóng)實(shí)踐
  點(diǎn)擊上方“Python開(kāi)發(fā)”,選擇“置頂公眾號”
  關(guān)鍵時(shí)刻,第一時(shí)間送達!
  
  爬蟲(chóng)的基本流程
  
  網(wǎng)絡(luò )爬蟲(chóng)的基本工作流程如下:
  爬蟲(chóng)的抓取策略
  在爬蟲(chóng)系統中,待抓取 URL 隊列是很重要的一部分。待抓取 URL 隊列中的 URL 以什么樣的順序排列也是一個(gè)很重要的問(wèn)題,因為這涉及到先抓取那個(gè)頁(yè)面,后抓取哪個(gè)頁(yè)面。而決定這些 URL 排列順序的方法,叫做抓取策略。下面重點(diǎn)介紹幾種常見(jiàn)的抓取策略:
  
  了解了爬蟲(chóng)的工作流程和爬取策略后,就可以動(dòng)手實(shí)現一個(gè)爬蟲(chóng)了!那么在 python 里怎么實(shí)現呢?
  技術(shù)?;緦?shí)現
  下面是一個(gè)偽代碼
  <p>import Queue
  initial_page = "https://www.zhihu.com/people/gaoming623"
  url_queue = Queue.Queue()
  seen = set()
  seen.insert(initial_page)
  url_queue.put(initial_page)
  while(True): #一直進(jìn)行
   ? ?if url_queue.size()>0:
   ? ? ? ?current_url = url_queue.get() ? ? ? ? ? ? ?#拿出隊例中第一個(gè)的 url
   ? ? ? ?store(current_url) ? ? ? ? ? ? ? ? ? ? ? ? #把這個(gè) url 代表的網(wǎng)頁(yè)存儲好
   ? ? ? ?for next_url in extract_urls(current_url): #提取把這個(gè) url 里鏈向的 url
   ? ? ? ? ? ?if next_url not in seen: ? ? ?
   ? ? ? ? ? ? ? ?seen.put(next_url)
   ? ? ? ? ? ? ? ?url_queue.put(next_url)
   ? ?else:
   ? ? ? ?break</p>
  如果你直接加工一下上面的代碼直接運行的話(huà),你需要很長(cháng)的時(shí)間才能爬下整個(gè)知乎用戶(hù)的信息,畢竟知乎有 6000 萬(wàn)月活躍用戶(hù)。更別說(shuō) Google 這樣的搜索引擎需要爬下全網(wǎng)的內容了。那么問(wèn)題出現在哪里?
  布隆過(guò)濾器
  需要爬的網(wǎng)頁(yè)實(shí)在太多太多了,而上面的代碼太慢太慢了。設想全網(wǎng)有 N 個(gè)網(wǎng)站,那么分析一下判重的復雜度就是 N*log(N),因為所有網(wǎng)頁(yè)要遍歷一次,而每次判重用 set 的話(huà)需要 log(N) 的復雜度。OK,我知道 python 的 set 實(shí)現是 hash——不過(guò)這樣還是太慢了,至少內存使用效率不高。
  通常的判重做法是怎樣呢?Bloom Filter. 簡(jiǎn)單講它仍然是一種 hash 的方法,但是它的特點(diǎn)是,它可以使用固定的內存(不隨 url 的數量而增長(cháng))以 O(1) 的效率判定 url 是否已經(jīng)在 set 中??上煜聸](méi)有白吃的午餐,它的唯一問(wèn)題在于,如果這個(gè) url 不在 set 中,BF 可以 100%確定這個(gè) url 沒(méi)有看過(guò)。但是如果這個(gè) url 在 set 中,它會(huì )告訴你:這個(gè) url 應該已經(jīng)出現過(guò),不過(guò)我有 2%的不確定性。注意這里的不確定性在你分配的內存足夠大的時(shí)候,可以變得很小很少。
  <p># bloom_filter.py
  BIT_SIZE = 5000000
  class BloomFilter:
   ? ?def __init__(self):
   ? ? ? ?# Initialize bloom filter, set size and all bits to 0
   ? ? ? ?bit_array = bitarray(BIT_SIZE)
   ? ? ? ?bit_array.setall(0)
   ? ? ? ?self.bit_array = bit_array
   ? ?def add(self, url):
   ? ? ? ?# Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.)
   ? ? ? ?# Here use 7 hash functions.
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?self.bit_array[b] = 1
   ? ?def contains(self, url):
   ? ? ? ?# Check if a url is in a collection
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?result = True
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?result = result and self.bit_array[b]
   ? ? ? ?return result
   ? ?def get_postions(self, url):
   ? ? ? ?# Get points positions in bit vector.
   ? ? ? ?point1 = mmh3.hash(url, 41) % BIT_SIZE
   ? ? ? ?point2 = mmh3.hash(url, 42) % BIT_SIZE
   ? ? ? ?point3 = mmh3.hash(url, 43) % BIT_SIZE
   ? ? ? ?point4 = mmh3.hash(url, 44) % BIT_SIZE
   ? ? ? ?point5 = mmh3.hash(url, 45) % BIT_SIZE
   ? ? ? ?point6 = mmh3.hash(url, 46) % BIT_SIZE
   ? ? ? ?point7 = mmh3.hash(url, 47) % BIT_SIZE
   ? ? ? ?return [point1, point2, point3, point4, point5, point6, point7]</p>
  BF 詳細的原理參考我之前寫(xiě)的文章:布隆過(guò)濾器(Bloom Filter) 的原理和實(shí)現
  建表
  用戶(hù)有價(jià)值的信息包括用戶(hù)名、簡(jiǎn)介、行業(yè)、院校、專(zhuān)業(yè)及在平臺上活動(dòng)的數據比如回答數、文章數、提問(wèn)數、粉絲數等等。
  用戶(hù)信息存儲的表結構如下:
  <p>CREATE DATABASE `zhihu_user` /*!40100 DEFAULT CHARACTER SET utf8 */;
  -- User base information table
  CREATE TABLE `t_user` (
   ?`uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   ?`username` varchar(50) NOT NULL COMMENT '用戶(hù)名', ? ? ? ? ? ? ? ? ? ? ?
   ?`brief_info` varchar(400) ?COMMENT '個(gè)人簡(jiǎn)介',
   ?`industry` varchar(50) COMMENT '所處行業(yè)', ? ? ? ? ? ?
   ?`education` varchar(50) COMMENT '畢業(yè)院校', ? ? ? ? ? ?
   ?`major` varchar(50) COMMENT '主修專(zhuān)業(yè)',
   ?`answer_count` int(10) unsigned DEFAULT 0 COMMENT '回答數',
   ?`article_count` int(10) unsigned DEFAULT 0 COMMENT '文章數',
   ?`ask_question_count` int(10) unsigned DEFAULT 0 COMMENT '提問(wèn)數',
   ?`collection_count` int(10) unsigned DEFAULT 0 COMMENT '收藏數',
   ?`follower_count` int(10) unsigned DEFAULT 0 COMMENT '被關(guān)注數',
   ?`followed_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注數',
   ?`follow_live_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注直播數',
   ?`follow_topic_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注話(huà)題數',
   ?`follow_column_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注專(zhuān)欄數',
   ?`follow_question_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注問(wèn)題數',
   ?`follow_collection_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注收藏夾數',
   ?`gmt_create` datetime NOT NULL COMMENT '創(chuàng )建時(shí)間', ?
   ?`gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次編輯', ? ? ? ? ? ?
   ?PRIMARY KEY (`uid`)
  ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶(hù)基本信息表';</p>
  網(wǎng)頁(yè)下載后通過(guò) XPath 進(jìn)行解析,提取用戶(hù)各個(gè)維度的數據,最后保存到數據庫中。
  反爬蟲(chóng)策略應對-Headers
  一般網(wǎng)站會(huì )從幾個(gè)維度來(lái)反爬蟲(chóng):用戶(hù)請求的 Headers,用戶(hù)行為,網(wǎng)站和數據加載的方式。從用戶(hù)請求的 Headers 反爬蟲(chóng)是最常見(jiàn)的策略,很多網(wǎng)站都會(huì )對 Headers 的 User-Agent 進(jìn)行檢測,還有一部分網(wǎng)站會(huì )對 Referer 進(jìn)行檢測(一些資源網(wǎng)站的防盜鏈就是檢測 Referer)。
  如果遇到了這類(lèi)反爬蟲(chóng)機制,可以直接在爬蟲(chóng)中添加 Headers,將瀏覽器的 User-Agent 復制到爬蟲(chóng)的 Headers 中;或者將 Referer 值修改為目標網(wǎng)站域名。對于檢測 Headers 的反爬蟲(chóng),在爬蟲(chóng)中修改或者添加 Headers 就能很好的繞過(guò)。
  <p>cookies = {
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"login": "NzM5ZDc2M2JkYzYwNDZlOGJlYWQ1YmI4OTg5NDhmMTY=|1480901173|9c296f424b32f241d1471203244eaf30729420f0",
   ? ?"n_c": "1",
   ? ?"q_c1": "395b12e529e541cbb400e9718395e346|1479808003000|1468847182000",
   ? ?"l_cap_id": "NzI0MTQwZGY2NjQyNDQ1NThmYTY0MjJhYmU2NmExMGY=|1480901160|2e7a7faee3b3e8d0afb550e8e7b38d86c15a31bc",
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"cap_id": "N2U1NmQwODQ1NjFiNGI2Yzg2YTE2NzJkOTU5N2E0NjI=|1480901160|fd59e2ed79faacc2be1010687d27dd559ec1552a"
  }
  headers = {
   ? ?"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.3",
   ? ?"Referer": "https://www.zhihu.com/"
  }
  r = requests.get(url, cookies = cookies, headers = headers)</p>
  反爬蟲(chóng)策略應對-代理 IP 池
  還有一部分網(wǎng)站是通過(guò)檢測用戶(hù)行為,例如同一 IP 短時(shí)間內多次訪(fǎng)問(wèn)同一頁(yè)面,或者同一賬戶(hù)短時(shí)間內多次進(jìn)行相同操作。
  大多數網(wǎng)站都是前一種情況,對于這種情況,使用 IP 代理就可以解決。這樣的代理 ip 爬蟲(chóng)經(jīng)常會(huì )用到,最好自己準備一個(gè)。有了大量代理 ip 后可以每請求幾次更換一個(gè) ip,這在 requests 或者 urllib2 中很容易做到,這樣就能很容易的繞過(guò)第一種反爬蟲(chóng)。目前知乎已經(jīng)對爬蟲(chóng)做了限制,如果是單個(gè) IP 的話(huà),一段時(shí)間系統便會(huì )提示異常流量,無(wú)法繼續爬取了。因此代理 IP 池非常關(guān)鍵。網(wǎng)上有個(gè)免費的代理 IP API:
  <p>import requests
  import random
  class Proxy:
   ? ?def __init__(self):
   ? ? ? ?self.cache_ip_list = []
   ? ?# Get random ip from free proxy api url.
   ? ?def get_random_ip(self):
   ? ? ? ?if not len(self.cache_ip_list):
   ? ? ? ? ? ?api_url = 'http://api.xicidaili.com/free2016.txt'
   ? ? ? ? ? ?try:
   ? ? ? ? ? ? ? ?r = requests.get(api_url)
   ? ? ? ? ? ? ? ?ip_list = r.text.split('rn')
   ? ? ? ? ? ? ? ?self.cache_ip_list = ip_list
   ? ? ? ? ? ?except Exception as e:
   ? ? ? ? ? ? ? ?# Return null list when caught exception.
   ? ? ? ? ? ? ? ?# In this case, crawler will not use proxy ip.
   ? ? ? ? ? ? ? ?print e
   ? ? ? ? ? ? ? ?return {}
   ? ? ? ?proxy_ip = random.choice(self.cache_ip_list)
   ? ? ? ?proxies = {'http': 'http://' ? proxy_ip}
   ? ? ? ?return proxies</p>
  后續
  爬蟲(chóng)源代碼:zhihu-crawler下載之后通過(guò) pip 安裝相關(guān)三方包后,運行$ python crawler.py 即可(喜歡的幫忙點(diǎn)個(gè) star 哈,同時(shí)也方便看到后續功能的更新)
  運行截圖:
  
   查看全部

  Python 編寫(xiě)知乎爬蟲(chóng)實(shí)踐
  點(diǎn)擊上方“Python開(kāi)發(fā)”,選擇“置頂公眾號”
  關(guān)鍵時(shí)刻,第一時(shí)間送達!
  
  爬蟲(chóng)的基本流程
  
  網(wǎng)絡(luò )爬蟲(chóng)的基本工作流程如下:
  爬蟲(chóng)的抓取策略
  在爬蟲(chóng)系統中,待抓取 URL 隊列是很重要的一部分。待抓取 URL 隊列中的 URL 以什么樣的順序排列也是一個(gè)很重要的問(wèn)題,因為這涉及到先抓取那個(gè)頁(yè)面,后抓取哪個(gè)頁(yè)面。而決定這些 URL 排列順序的方法,叫做抓取策略。下面重點(diǎn)介紹幾種常見(jiàn)的抓取策略:
  
  了解了爬蟲(chóng)的工作流程和爬取策略后,就可以動(dòng)手實(shí)現一個(gè)爬蟲(chóng)了!那么在 python 里怎么實(shí)現呢?
  技術(shù)?;緦?shí)現
  下面是一個(gè)偽代碼
  <p>import Queue
  initial_page = "https://www.zhihu.com/people/gaoming623"
  url_queue = Queue.Queue()
  seen = set()
  seen.insert(initial_page)
  url_queue.put(initial_page)
  while(True): #一直進(jìn)行
   ? ?if url_queue.size()>0:
   ? ? ? ?current_url = url_queue.get() ? ? ? ? ? ? ?#拿出隊例中第一個(gè)的 url
   ? ? ? ?store(current_url) ? ? ? ? ? ? ? ? ? ? ? ? #把這個(gè) url 代表的網(wǎng)頁(yè)存儲好
   ? ? ? ?for next_url in extract_urls(current_url): #提取把這個(gè) url 里鏈向的 url
   ? ? ? ? ? ?if next_url not in seen: ? ? ?
   ? ? ? ? ? ? ? ?seen.put(next_url)
   ? ? ? ? ? ? ? ?url_queue.put(next_url)
   ? ?else:
   ? ? ? ?break</p>
  如果你直接加工一下上面的代碼直接運行的話(huà),你需要很長(cháng)的時(shí)間才能爬下整個(gè)知乎用戶(hù)的信息,畢竟知乎有 6000 萬(wàn)月活躍用戶(hù)。更別說(shuō) Google 這樣的搜索引擎需要爬下全網(wǎng)的內容了。那么問(wèn)題出現在哪里?
  布隆過(guò)濾器
  需要爬的網(wǎng)頁(yè)實(shí)在太多太多了,而上面的代碼太慢太慢了。設想全網(wǎng)有 N 個(gè)網(wǎng)站,那么分析一下判重的復雜度就是 N*log(N),因為所有網(wǎng)頁(yè)要遍歷一次,而每次判重用 set 的話(huà)需要 log(N) 的復雜度。OK,我知道 python 的 set 實(shí)現是 hash——不過(guò)這樣還是太慢了,至少內存使用效率不高。
  通常的判重做法是怎樣呢?Bloom Filter. 簡(jiǎn)單講它仍然是一種 hash 的方法,但是它的特點(diǎn)是,它可以使用固定的內存(不隨 url 的數量而增長(cháng))以 O(1) 的效率判定 url 是否已經(jīng)在 set 中??上煜聸](méi)有白吃的午餐,它的唯一問(wèn)題在于,如果這個(gè) url 不在 set 中,BF 可以 100%確定這個(gè) url 沒(méi)有看過(guò)。但是如果這個(gè) url 在 set 中,它會(huì )告訴你:這個(gè) url 應該已經(jīng)出現過(guò),不過(guò)我有 2%的不確定性。注意這里的不確定性在你分配的內存足夠大的時(shí)候,可以變得很小很少。
  <p># bloom_filter.py
  BIT_SIZE = 5000000
  class BloomFilter:
   ? ?def __init__(self):
   ? ? ? ?# Initialize bloom filter, set size and all bits to 0
   ? ? ? ?bit_array = bitarray(BIT_SIZE)
   ? ? ? ?bit_array.setall(0)
   ? ? ? ?self.bit_array = bit_array
   ? ?def add(self, url):
   ? ? ? ?# Add a url, and set points in bitarray to 1 (Points count is equal to hash funcs count.)
   ? ? ? ?# Here use 7 hash functions.
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?self.bit_array[b] = 1
   ? ?def contains(self, url):
   ? ? ? ?# Check if a url is in a collection
   ? ? ? ?point_list = self.get_postions(url)
   ? ? ? ?result = True
   ? ? ? ?for b in point_list:
   ? ? ? ? ? ?result = result and self.bit_array[b]
   ? ? ? ?return result
   ? ?def get_postions(self, url):
   ? ? ? ?# Get points positions in bit vector.
   ? ? ? ?point1 = mmh3.hash(url, 41) % BIT_SIZE
   ? ? ? ?point2 = mmh3.hash(url, 42) % BIT_SIZE
   ? ? ? ?point3 = mmh3.hash(url, 43) % BIT_SIZE
   ? ? ? ?point4 = mmh3.hash(url, 44) % BIT_SIZE
   ? ? ? ?point5 = mmh3.hash(url, 45) % BIT_SIZE
   ? ? ? ?point6 = mmh3.hash(url, 46) % BIT_SIZE
   ? ? ? ?point7 = mmh3.hash(url, 47) % BIT_SIZE
   ? ? ? ?return [point1, point2, point3, point4, point5, point6, point7]</p>
  BF 詳細的原理參考我之前寫(xiě)的文章:布隆過(guò)濾器(Bloom Filter) 的原理和實(shí)現
  建表
  用戶(hù)有價(jià)值的信息包括用戶(hù)名、簡(jiǎn)介、行業(yè)、院校、專(zhuān)業(yè)及在平臺上活動(dòng)的數據比如回答數、文章數、提問(wèn)數、粉絲數等等。
  用戶(hù)信息存儲的表結構如下:
  <p>CREATE DATABASE `zhihu_user` /*!40100 DEFAULT CHARACTER SET utf8 */;
  -- User base information table
  CREATE TABLE `t_user` (
   ?`uid` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
   ?`username` varchar(50) NOT NULL COMMENT '用戶(hù)名', ? ? ? ? ? ? ? ? ? ? ?
   ?`brief_info` varchar(400) ?COMMENT '個(gè)人簡(jiǎn)介',
   ?`industry` varchar(50) COMMENT '所處行業(yè)', ? ? ? ? ? ?
   ?`education` varchar(50) COMMENT '畢業(yè)院校', ? ? ? ? ? ?
   ?`major` varchar(50) COMMENT '主修專(zhuān)業(yè)',
   ?`answer_count` int(10) unsigned DEFAULT 0 COMMENT '回答數',
   ?`article_count` int(10) unsigned DEFAULT 0 COMMENT '文章數',
   ?`ask_question_count` int(10) unsigned DEFAULT 0 COMMENT '提問(wèn)數',
   ?`collection_count` int(10) unsigned DEFAULT 0 COMMENT '收藏數',
   ?`follower_count` int(10) unsigned DEFAULT 0 COMMENT '被關(guān)注數',
   ?`followed_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注數',
   ?`follow_live_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注直播數',
   ?`follow_topic_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注話(huà)題數',
   ?`follow_column_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注專(zhuān)欄數',
   ?`follow_question_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注問(wèn)題數',
   ?`follow_collection_count` int(10) unsigned DEFAULT 0 COMMENT '關(guān)注收藏夾數',
   ?`gmt_create` datetime NOT NULL COMMENT '創(chuàng )建時(shí)間', ?
   ?`gmt_modify` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '最后一次編輯', ? ? ? ? ? ?
   ?PRIMARY KEY (`uid`)
  ) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用戶(hù)基本信息表';</p>
  網(wǎng)頁(yè)下載后通過(guò) XPath 進(jìn)行解析,提取用戶(hù)各個(gè)維度的數據,最后保存到數據庫中。
  反爬蟲(chóng)策略應對-Headers
  一般網(wǎng)站會(huì )從幾個(gè)維度來(lái)反爬蟲(chóng):用戶(hù)請求的 Headers,用戶(hù)行為,網(wǎng)站和數據加載的方式。從用戶(hù)請求的 Headers 反爬蟲(chóng)是最常見(jiàn)的策略,很多網(wǎng)站都會(huì )對 Headers 的 User-Agent 進(jìn)行檢測,還有一部分網(wǎng)站會(huì )對 Referer 進(jìn)行檢測(一些資源網(wǎng)站的防盜鏈就是檢測 Referer)。
  如果遇到了這類(lèi)反爬蟲(chóng)機制,可以直接在爬蟲(chóng)中添加 Headers,將瀏覽器的 User-Agent 復制到爬蟲(chóng)的 Headers 中;或者將 Referer 值修改為目標網(wǎng)站域名。對于檢測 Headers 的反爬蟲(chóng),在爬蟲(chóng)中修改或者添加 Headers 就能很好的繞過(guò)。
  <p>cookies = {
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"login": "NzM5ZDc2M2JkYzYwNDZlOGJlYWQ1YmI4OTg5NDhmMTY=|1480901173|9c296f424b32f241d1471203244eaf30729420f0",
   ? ?"n_c": "1",
   ? ?"q_c1": "395b12e529e541cbb400e9718395e346|1479808003000|1468847182000",
   ? ?"l_cap_id": "NzI0MTQwZGY2NjQyNDQ1NThmYTY0MjJhYmU2NmExMGY=|1480901160|2e7a7faee3b3e8d0afb550e8e7b38d86c15a31bc",
   ? ?"d_c0": "AECA7v-aPwqPTiIbemmIQ8abhJy7bdD2VgE=|1468847182",
   ? ?"cap_id": "N2U1NmQwODQ1NjFiNGI2Yzg2YTE2NzJkOTU5N2E0NjI=|1480901160|fd59e2ed79faacc2be1010687d27dd559ec1552a"
  }
  headers = {
   ? ?"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.3",
   ? ?"Referer": "https://www.zhihu.com/"
  }
  r = requests.get(url, cookies = cookies, headers = headers)</p>
  反爬蟲(chóng)策略應對-代理 IP 池
  還有一部分網(wǎng)站是通過(guò)檢測用戶(hù)行為,例如同一 IP 短時(shí)間內多次訪(fǎng)問(wèn)同一頁(yè)面,或者同一賬戶(hù)短時(shí)間內多次進(jìn)行相同操作。
  大多數網(wǎng)站都是前一種情況,對于這種情況,使用 IP 代理就可以解決。這樣的代理 ip 爬蟲(chóng)經(jīng)常會(huì )用到,最好自己準備一個(gè)。有了大量代理 ip 后可以每請求幾次更換一個(gè) ip,這在 requests 或者 urllib2 中很容易做到,這樣就能很容易的繞過(guò)第一種反爬蟲(chóng)。目前知乎已經(jīng)對爬蟲(chóng)做了限制,如果是單個(gè) IP 的話(huà),一段時(shí)間系統便會(huì )提示異常流量,無(wú)法繼續爬取了。因此代理 IP 池非常關(guān)鍵。網(wǎng)上有個(gè)免費的代理 IP API:
  <p>import requests
  import random
  class Proxy:
   ? ?def __init__(self):
   ? ? ? ?self.cache_ip_list = []
   ? ?# Get random ip from free proxy api url.
   ? ?def get_random_ip(self):
   ? ? ? ?if not len(self.cache_ip_list):
   ? ? ? ? ? ?api_url = 'http://api.xicidaili.com/free2016.txt'
   ? ? ? ? ? ?try:
   ? ? ? ? ? ? ? ?r = requests.get(api_url)
   ? ? ? ? ? ? ? ?ip_list = r.text.split('rn')
   ? ? ? ? ? ? ? ?self.cache_ip_list = ip_list
   ? ? ? ? ? ?except Exception as e:
   ? ? ? ? ? ? ? ?# Return null list when caught exception.
   ? ? ? ? ? ? ? ?# In this case, crawler will not use proxy ip.
   ? ? ? ? ? ? ? ?print e
   ? ? ? ? ? ? ? ?return {}
   ? ? ? ?proxy_ip = random.choice(self.cache_ip_list)
   ? ? ? ?proxies = {'http': 'http://' ? proxy_ip}
   ? ? ? ?return proxies</p>
  后續
  爬蟲(chóng)源代碼:zhihu-crawler下載之后通過(guò) pip 安裝相關(guān)三方包后,運行$ python crawler.py 即可(喜歡的幫忙點(diǎn)個(gè) star 哈,同時(shí)也方便看到后續功能的更新)
  運行截圖:
  
  

多種爬蟲(chóng)方式對比

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-05-01 06:11 ? 來(lái)自相關(guān)話(huà)題

  多種爬蟲(chóng)方式對比
  Python爬蟲(chóng)的方式有多種,從爬蟲(chóng)框架到解析提取,再到數據存儲,各階段都有不同的手段和類(lèi)庫支持。雖然不能一概而論哪種方式一定更好,畢竟不同案例需求和不同應用場(chǎng)景會(huì )綜合決定采取哪種方式,但對比之下還是會(huì )有很大差距。
  00 概況
  以安居客杭州二手房信息為爬蟲(chóng)需求,分別對比實(shí)驗了三種爬蟲(chóng)框架、三種字段解析方式和三種數據存儲方式,旨在全方面對比各種爬蟲(chóng)方式的效率高低。
  安居客平臺沒(méi)有太強的反爬措施,只要添加headers模擬頭即可完美爬取,而且不用考慮爬蟲(chóng)過(guò)快的問(wèn)題。選中杭州二手房之后,很容易發(fā)現url的變化規律。值得說(shuō)明的是平臺最大開(kāi)放50頁(yè)房源信息,每頁(yè)60條。為使爬蟲(chóng)簡(jiǎn)單便于對比,我們只爬取房源列表頁(yè)的概要信息,而不再進(jìn)入房源詳情頁(yè)進(jìn)行具體信息的爬取,共3000條記錄,每條記錄包括10個(gè)字段:標題,戶(hù)型,面積,樓層,建筑年份,小區/地址,售賣(mài)標簽,中介,單價(jià),總價(jià)。
  01 3種爬蟲(chóng)框架
  1.常規爬蟲(chóng)
  實(shí)現3個(gè)函數,分別用于解析網(wǎng)頁(yè)、存儲信息,以及二者的聯(lián)合調用。在主程序中,用一個(gè)常規的循環(huán)語(yǔ)句逐頁(yè)解析。
  import?requests<br />from?lxml?import?etree<br />import?pymysql<br />import?time<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????#常規單線(xiàn)程爬取<br />????for?url?in?urls:<br />????????getANDsave(url)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)64.9秒。
  2.Scrapy框架
  Scrapy框架是一個(gè)常用的爬蟲(chóng)框架,非常好用,只需要簡(jiǎn)單實(shí)現核心抓取和存儲功能即可,而無(wú)需關(guān)注內部信息流轉,而且框架自帶多線(xiàn)程和異常處理能力。
  class?anjukeSpider(scrapy.Spider):<br />????name?=?'anjuke'<br />????allowed_domains?=?['anjuke.com']<br />????start_urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,?51)]<br /><br />????def?parse(self,?response):<br />????????pass<br />????????yield?item<br />
  耗時(shí)14.4秒。
  3.多線(xiàn)程爬蟲(chóng)
  對于爬蟲(chóng)這種IO密集型任務(wù)來(lái)說(shuō),多線(xiàn)程可明顯提升效率。實(shí)現多線(xiàn)程python的方式有多種,這里我們應用concurrent的futures模塊,并設置最大線(xiàn)程數為8。
  from?concurrent.futures?import?ThreadPoolExecutor,?wait,?ALL_COMPLETED<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????executor?=?ThreadPoolExecutor(max_workers=8)<br />????future_tasks?=?[executor.submit(getANDsave,?url)?for?url?in?urls]<br />????wait(future_tasks,?return_when?=?ALL_COMPLETED)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)8.1秒。
  對比來(lái)看,多線(xiàn)程爬蟲(chóng)方案耗時(shí)最短,相比常規爬蟲(chóng)而言能帶來(lái)數倍的效率提升,Scrapy爬蟲(chóng)也取得了不俗的表現。需要指出的是,這里3種框架都采用了Xpath解析和MySQL存儲。
  02 3種解析方式
  在明確爬蟲(chóng)框架的基礎上,如何對字段進(jìn)行解析提取就是第二個(gè)需要考慮的問(wèn)題,常用的解析方式有3種,一般而言,論解析效率Re&gt;=Xpath&gt;Bs4;論難易程度,Bs4則最為簡(jiǎn)單易懂。
  因為前面已經(jīng)對比得知,多線(xiàn)程爬蟲(chóng)有著(zhù)最好的執行效率,我們以此為基礎,對比3種不同解析方式,解析函數分別為:
  1. Xpath
  from lxml import etreedef?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?etree.HTML(html)<br />????items?=?html.xpath("//li[@class?=?'list-item']")<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.xpath(".//div[@class='house-title']/a/text()")[0].strip()<br />????????????houseType?=?item.xpath(".//div[@class='house-details']/div[2]/span[1]/text()")[0]<br />????????????area?=?item.xpath(".//div[@class='house-details']/div[2]/span[2]/text()")[0]<br />????????????floor?=?item.xpath(".//div[@class='house-details']/div[2]/span[3]/text()")[0]<br />????????????buildYear?=?item.xpath(".//div[@class='house-details']/div[2]/span[4]/text()")[0]<br />????????????adrres?=?item.xpath(".//div[@class='house-details']/div[3]/span[1]/text()")[0]<br />????????????adrres?=?"|".join(adrres.split())<br />????????????tags?=?item.xpath(".//div[@class='tags-bottom']//text()")<br />????????????tags?=?'|'.join(tags).strip()<br />????????????broker?=?item.xpath(".//div[@class='broker-item']/span[2]/text()")[0]<br />????????????totalPrice?=?item.xpath(".//div[@class='pro-price']/span[1]//text()")<br />????????????totalPrice?=?"".join(totalPrice).strip()<br />????????????price?=?item.xpath(".//div[@class='pro-price']/span[2]/text()")[0]<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)8.1秒。
  2. Re
  import re<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?html.replace('\n','')<br />????pattern?=?r'.*?'<br />????results?=?re.compile(pattern).findall(html)##先編譯,再正則匹配<br />????infos?=?[]<br />????for?result?in?results:?<br />????????values?=?['']*10<br />????????titles?=?re.compile('title="(.*?)"').findall(result)<br />????????values[0]?=?titles[0]<br />????????values[5]?=?titles[1].replace('&nbsp;','')<br />????????spans?=?re.compile('(.*?)|(.*?)|(.*?)|(.*?)').findall(result)<br />????????values[1]?=''.join(spans[0])<br />????????values[2]?=?''.join(spans[1])<br />????????values[3]?=?''.join(spans[2])<br />????????values[4]?=?''.join(spans[3])<br />????????values[7]?=?re.compile('(.*?)').findall(result)[0]<br />????????tagRE?=?re.compile('(.*?)').findall(result)<br />????????if?tagRE:<br />????????????values[6]?=?'|'.join(tagRE)<br />????????values[8]?=?re.compile('(.*?)萬(wàn)').findall(result)[0]+'萬(wàn)'<br />????????values[9]?=?re.compile('(.*?)').findall(result)[0]<br />????????infos.append(tuple(values))<br /><br />????return?infos<br />
  耗時(shí)8.6秒。
  3. Bs4
  from?bs4?import?BeautifulSoup<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????soup?=?BeautifulSoup(html,?"html.parser")<br />????items?=?soup.find_all('li',?attrs={'class':?"list-item"})<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.find('a',?attrs={'class':?"houseListTitle"}).get_text().strip()<br />????????????details?=?item.find_all('div',attrs={'class':?"details-item"})[0]<br />????????????houseType?=?details.find_all('span')[0].get_text().strip()<br />????????????area?=?details.find_all('span')[1].get_text().strip()<br />????????????floor?=?details.find_all('span')[2].get_text().strip()<br />????????????buildYear?=?details.find_all('span')[3].get_text().strip()<br />????????????addres?=?item.find_all('div',attrs={'class':?"details-item"})[1].get_text().replace('?','').replace('\n','')<br />????????????tag_spans?=?item.find('div',?attrs={'class':'tags-bottom'}).find_all('span')<br />????????????tags?=?[span.get_text()?for?span?in?tag_spans]<br />????????????tags?=?'|'.join(tags)<br />????????????broker?=?item.find('span',attrs={'class':'broker-name?broker-text'}).get_text().strip()<br />????????????totalPrice?=?item.find('span',attrs={'class':'price-det'}).get_text()<br />????????????price?=?item.find('span',attrs={'class':'unit-price'}).get_text()<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?addres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)23.2秒。
  Xpath和Re執行效率相當,Xpath甚至要略勝一籌,Bs4效率要明顯低于前兩者(此案例中,相當遠前兩者效率的1/3),但寫(xiě)起來(lái)則最為容易。
  03 存儲方式
  在完成爬蟲(chóng)數據解析后,一般都要將數據進(jìn)行本地存儲,方便后續使用。小型數據量時(shí)可以選用本地文件存儲,例如CSV、txt或者json文件;當數據量較大時(shí),則一般需采用數據庫存儲,這里,我們分別選用關(guān)系型數據庫的代表MySQL和文本型數據庫的代表MongoDB加入對比。
  1. MySQL
  import?pymysql<br /><br />def?save_info(infos):<br />????#####infos為列表形式,其中列表中每個(gè)元素為一個(gè)元組,包含10個(gè)字段<br />????db=?pymysql.connect(host="localhost",user="root",password="123456",db="ajkhzesf")<br />????sql_insert?=?'insert?into?hzesfmulti8(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)?values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'<br />????cursor?=?db.cursor()<br />????cursor.executemany(sql_insert,?infos)<br />????db.commit()<br />
  耗時(shí)8.1秒。
  2. MongoDB
  import?pymongo<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)字典,包括10個(gè)字段<br />????client?=?pymongo.MongoClient()<br />????collection?=?client.anjuke.hzesfmulti<br />????collection.insert_many(infos)<br />????client.close()<br />
  耗時(shí)8.4秒。
  3. CSV文件
  import?csv<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)列表,包括10個(gè)字段<br />????with?open(r"D:\PyFile\HZhouse\anjuke.csv",?'a',?encoding='gb18030',?newline="")?as?f:<br />????????writer?=?csv.writer(f)<br />????????writer.writerows(infos)<br />
  耗時(shí)8.8秒。
  可見(jiàn),在爬蟲(chóng)框架和解析方式一致的前提下,不同存儲方式間并不會(huì )帶來(lái)太大效率上的差異。
  04 結論
  
  不同爬蟲(chóng)執行效率對比
  易見(jiàn),爬蟲(chóng)框架對耗時(shí)影響最大,甚至可帶來(lái)數倍的效率提升;解析數據方式也會(huì )帶來(lái)較大影響,而數據存儲方式則不存在太大差異。
  對此,個(gè)人認為可以這樣理解:類(lèi)似于把大象裝冰箱需要3步,爬蟲(chóng)也需要3步:
  其中,爬取網(wǎng)頁(yè)源碼最為耗時(shí),這不僅取決于你的爬蟲(chóng)框架和網(wǎng)絡(luò )負載,還受限于目標網(wǎng)站的響應速度和反爬措施;信息解析其次,而數據存儲則最為迅速,尤其是在磁盤(pán)讀取速度飛快的今天,無(wú)論是簡(jiǎn)單的文件寫(xiě)入還是數據庫存儲,都不會(huì )帶來(lái)太大的時(shí)間差異。 查看全部

  多種爬蟲(chóng)方式對比
  Python爬蟲(chóng)的方式有多種,從爬蟲(chóng)框架到解析提取,再到數據存儲,各階段都有不同的手段和類(lèi)庫支持。雖然不能一概而論哪種方式一定更好,畢竟不同案例需求和不同應用場(chǎng)景會(huì )綜合決定采取哪種方式,但對比之下還是會(huì )有很大差距。
  00 概況
  以安居客杭州二手房信息為爬蟲(chóng)需求,分別對比實(shí)驗了三種爬蟲(chóng)框架、三種字段解析方式和三種數據存儲方式,旨在全方面對比各種爬蟲(chóng)方式的效率高低。
  安居客平臺沒(méi)有太強的反爬措施,只要添加headers模擬頭即可完美爬取,而且不用考慮爬蟲(chóng)過(guò)快的問(wèn)題。選中杭州二手房之后,很容易發(fā)現url的變化規律。值得說(shuō)明的是平臺最大開(kāi)放50頁(yè)房源信息,每頁(yè)60條。為使爬蟲(chóng)簡(jiǎn)單便于對比,我們只爬取房源列表頁(yè)的概要信息,而不再進(jìn)入房源詳情頁(yè)進(jìn)行具體信息的爬取,共3000條記錄,每條記錄包括10個(gè)字段:標題,戶(hù)型,面積,樓層,建筑年份,小區/地址,售賣(mài)標簽,中介,單價(jià),總價(jià)。
  01 3種爬蟲(chóng)框架
  1.常規爬蟲(chóng)
  實(shí)現3個(gè)函數,分別用于解析網(wǎng)頁(yè)、存儲信息,以及二者的聯(lián)合調用。在主程序中,用一個(gè)常規的循環(huán)語(yǔ)句逐頁(yè)解析。
  import?requests<br />from?lxml?import?etree<br />import?pymysql<br />import?time<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????#常規單線(xiàn)程爬取<br />????for?url?in?urls:<br />????????getANDsave(url)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)64.9秒。
  2.Scrapy框架
  Scrapy框架是一個(gè)常用的爬蟲(chóng)框架,非常好用,只需要簡(jiǎn)單實(shí)現核心抓取和存儲功能即可,而無(wú)需關(guān)注內部信息流轉,而且框架自帶多線(xiàn)程和異常處理能力。
  class?anjukeSpider(scrapy.Spider):<br />????name?=?'anjuke'<br />????allowed_domains?=?['anjuke.com']<br />????start_urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,?51)]<br /><br />????def?parse(self,?response):<br />????????pass<br />????????yield?item<br />
  耗時(shí)14.4秒。
  3.多線(xiàn)程爬蟲(chóng)
  對于爬蟲(chóng)這種IO密集型任務(wù)來(lái)說(shuō),多線(xiàn)程可明顯提升效率。實(shí)現多線(xiàn)程python的方式有多種,這里我們應用concurrent的futures模塊,并設置最大線(xiàn)程數為8。
  from?concurrent.futures?import?ThreadPoolExecutor,?wait,?ALL_COMPLETED<br /><br />def?get_info(url):<br />????pass<br />????return?infos<br /><br />def?save_info(infos):<br />????pass<br /><br />def?getANDsave(url):<br />????pass<br /><br />if?__name__?==?'__main__':<br />????urls?=?[f'https://hangzhou.anjuke.com/sale/p{page}/'?for?page?in?range(1,51)]<br />????start?=?time.time()<br />????executor?=?ThreadPoolExecutor(max_workers=8)<br />????future_tasks?=?[executor.submit(getANDsave,?url)?for?url?in?urls]<br />????wait(future_tasks,?return_when?=?ALL_COMPLETED)<br />????tt?=?time.time()-start<br />????print("共用時(shí):",tt,?"秒。")<br />
  耗時(shí)8.1秒。
  對比來(lái)看,多線(xiàn)程爬蟲(chóng)方案耗時(shí)最短,相比常規爬蟲(chóng)而言能帶來(lái)數倍的效率提升,Scrapy爬蟲(chóng)也取得了不俗的表現。需要指出的是,這里3種框架都采用了Xpath解析和MySQL存儲。
  02 3種解析方式
  在明確爬蟲(chóng)框架的基礎上,如何對字段進(jìn)行解析提取就是第二個(gè)需要考慮的問(wèn)題,常用的解析方式有3種,一般而言,論解析效率Re&gt;=Xpath&gt;Bs4;論難易程度,Bs4則最為簡(jiǎn)單易懂。
  因為前面已經(jīng)對比得知,多線(xiàn)程爬蟲(chóng)有著(zhù)最好的執行效率,我們以此為基礎,對比3種不同解析方式,解析函數分別為:
  1. Xpath
  from lxml import etreedef?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?etree.HTML(html)<br />????items?=?html.xpath("//li[@class?=?'list-item']")<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.xpath(".//div[@class='house-title']/a/text()")[0].strip()<br />????????????houseType?=?item.xpath(".//div[@class='house-details']/div[2]/span[1]/text()")[0]<br />????????????area?=?item.xpath(".//div[@class='house-details']/div[2]/span[2]/text()")[0]<br />????????????floor?=?item.xpath(".//div[@class='house-details']/div[2]/span[3]/text()")[0]<br />????????????buildYear?=?item.xpath(".//div[@class='house-details']/div[2]/span[4]/text()")[0]<br />????????????adrres?=?item.xpath(".//div[@class='house-details']/div[3]/span[1]/text()")[0]<br />????????????adrres?=?"|".join(adrres.split())<br />????????????tags?=?item.xpath(".//div[@class='tags-bottom']//text()")<br />????????????tags?=?'|'.join(tags).strip()<br />????????????broker?=?item.xpath(".//div[@class='broker-item']/span[2]/text()")[0]<br />????????????totalPrice?=?item.xpath(".//div[@class='pro-price']/span[1]//text()")<br />????????????totalPrice?=?"".join(totalPrice).strip()<br />????????????price?=?item.xpath(".//div[@class='pro-price']/span[2]/text()")[0]<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)8.1秒。
  2. Re
  import re<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????html?=?html.replace('\n','')<br />????pattern?=?r'.*?'<br />????results?=?re.compile(pattern).findall(html)##先編譯,再正則匹配<br />????infos?=?[]<br />????for?result?in?results:?<br />????????values?=?['']*10<br />????????titles?=?re.compile('title="(.*?)"').findall(result)<br />????????values[0]?=?titles[0]<br />????????values[5]?=?titles[1].replace('&nbsp;','')<br />????????spans?=?re.compile('(.*?)|(.*?)|(.*?)|(.*?)').findall(result)<br />????????values[1]?=''.join(spans[0])<br />????????values[2]?=?''.join(spans[1])<br />????????values[3]?=?''.join(spans[2])<br />????????values[4]?=?''.join(spans[3])<br />????????values[7]?=?re.compile('(.*?)').findall(result)[0]<br />????????tagRE?=?re.compile('(.*?)').findall(result)<br />????????if?tagRE:<br />????????????values[6]?=?'|'.join(tagRE)<br />????????values[8]?=?re.compile('(.*?)萬(wàn)').findall(result)[0]+'萬(wàn)'<br />????????values[9]?=?re.compile('(.*?)').findall(result)[0]<br />????????infos.append(tuple(values))<br /><br />????return?infos<br />
  耗時(shí)8.6秒。
  3. Bs4
  from?bs4?import?BeautifulSoup<br />def?get_info(url):<br />????response?=?requests.get(url,?headers?=?headers)<br />????html?=?response.text<br />????soup?=?BeautifulSoup(html,?"html.parser")<br />????items?=?soup.find_all('li',?attrs={'class':?"list-item"})<br />????infos?=?[]<br />????for?item?in?items:<br />????????try:<br />????????????title?=?item.find('a',?attrs={'class':?"houseListTitle"}).get_text().strip()<br />????????????details?=?item.find_all('div',attrs={'class':?"details-item"})[0]<br />????????????houseType?=?details.find_all('span')[0].get_text().strip()<br />????????????area?=?details.find_all('span')[1].get_text().strip()<br />????????????floor?=?details.find_all('span')[2].get_text().strip()<br />????????????buildYear?=?details.find_all('span')[3].get_text().strip()<br />????????????addres?=?item.find_all('div',attrs={'class':?"details-item"})[1].get_text().replace('?','').replace('\n','')<br />????????????tag_spans?=?item.find('div',?attrs={'class':'tags-bottom'}).find_all('span')<br />????????????tags?=?[span.get_text()?for?span?in?tag_spans]<br />????????????tags?=?'|'.join(tags)<br />????????????broker?=?item.find('span',attrs={'class':'broker-name?broker-text'}).get_text().strip()<br />????????????totalPrice?=?item.find('span',attrs={'class':'price-det'}).get_text()<br />????????????price?=?item.find('span',attrs={'class':'unit-price'}).get_text()<br />????????????values?=?(title,?houseType,?area,?floor,?buildYear,?addres,?tags,?broker,?totalPrice,?price)<br />????????????infos.append(values)<br />????????except:<br />????????????print('1條信息解析失敗')<br />????return?infos<br />
  耗時(shí)23.2秒。
  Xpath和Re執行效率相當,Xpath甚至要略勝一籌,Bs4效率要明顯低于前兩者(此案例中,相當遠前兩者效率的1/3),但寫(xiě)起來(lái)則最為容易。
  03 存儲方式
  在完成爬蟲(chóng)數據解析后,一般都要將數據進(jìn)行本地存儲,方便后續使用。小型數據量時(shí)可以選用本地文件存儲,例如CSV、txt或者json文件;當數據量較大時(shí),則一般需采用數據庫存儲,這里,我們分別選用關(guān)系型數據庫的代表MySQL和文本型數據庫的代表MongoDB加入對比。
  1. MySQL
  import?pymysql<br /><br />def?save_info(infos):<br />????#####infos為列表形式,其中列表中每個(gè)元素為一個(gè)元組,包含10個(gè)字段<br />????db=?pymysql.connect(host="localhost",user="root",password="123456",db="ajkhzesf")<br />????sql_insert?=?'insert?into?hzesfmulti8(title,?houseType,?area,?floor,?buildYear,?adrres,?tags,?broker,?totalPrice,?price)?values(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)'<br />????cursor?=?db.cursor()<br />????cursor.executemany(sql_insert,?infos)<br />????db.commit()<br />
  耗時(shí)8.1秒。
  2. MongoDB
  import?pymongo<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)字典,包括10個(gè)字段<br />????client?=?pymongo.MongoClient()<br />????collection?=?client.anjuke.hzesfmulti<br />????collection.insert_many(infos)<br />????client.close()<br />
  耗時(shí)8.4秒。
  3. CSV文件
  import?csv<br /><br />def?save_info(infos):<br />????#?infos為列表形式,其中列表中的每個(gè)元素為一個(gè)列表,包括10個(gè)字段<br />????with?open(r"D:\PyFile\HZhouse\anjuke.csv",?'a',?encoding='gb18030',?newline="")?as?f:<br />????????writer?=?csv.writer(f)<br />????????writer.writerows(infos)<br />
  耗時(shí)8.8秒。
  可見(jiàn),在爬蟲(chóng)框架和解析方式一致的前提下,不同存儲方式間并不會(huì )帶來(lái)太大效率上的差異。
  04 結論
  
  不同爬蟲(chóng)執行效率對比
  易見(jiàn),爬蟲(chóng)框架對耗時(shí)影響最大,甚至可帶來(lái)數倍的效率提升;解析數據方式也會(huì )帶來(lái)較大影響,而數據存儲方式則不存在太大差異。
  對此,個(gè)人認為可以這樣理解:類(lèi)似于把大象裝冰箱需要3步,爬蟲(chóng)也需要3步:
  其中,爬取網(wǎng)頁(yè)源碼最為耗時(shí),這不僅取決于你的爬蟲(chóng)框架和網(wǎng)絡(luò )負載,還受限于目標網(wǎng)站的響應速度和反爬措施;信息解析其次,而數據存儲則最為迅速,尤其是在磁盤(pán)讀取速度飛快的今天,無(wú)論是簡(jiǎn)單的文件寫(xiě)入還是數據庫存儲,都不會(huì )帶來(lái)太大的時(shí)間差異。

爬蟲(chóng)實(shí)戰:Scrapy框架

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 100 次瀏覽 ? 2022-05-01 01:16 ? 來(lái)自相關(guān)話(huà)題

  爬蟲(chóng)實(shí)戰:Scrapy框架
  Scrapy是用Python語(yǔ)言編寫(xiě),通過(guò)Twisted異步網(wǎng)絡(luò )框架提升下載速度,是一個(gè)快速、高層次的屏幕抓取和Web抓取框架,常用于數據挖掘、監測和自動(dòng)化測試等。
  一、Scrapy框架介紹
  Scrapy內部實(shí)現了并發(fā)請求、免登錄、URL去重等操作,開(kāi)發(fā)者可根據自己的需求去編寫(xiě)部分代碼,就能抓取到所需要的數據。Scrapy框架包含的組件有調度器、下載器、Scrapy引擎、項目管道、爬蟲(chóng)以及各中間件等。
  Scrapy框架爬取流程:首先從初始URL開(kāi)始,調度器會(huì )將其交給下載器(Downloader),下載器向網(wǎng)絡(luò )服務(wù)器發(fā)送請求進(jìn)行下載,得到的響應后將下載數據交給爬蟲(chóng),爬蟲(chóng)會(huì )對網(wǎng)頁(yè)進(jìn)行分析,分析出來(lái)的結果有兩種:一種是需要進(jìn)一步抓取的鏈接,這些鏈接會(huì )被傳回調度器,另一種是需要保存的數據,它們會(huì )被傳送至項目管道,項目管道進(jìn)一步對數據進(jìn)行清洗、去重等處理,并存儲到文件或數據庫中。數據爬取過(guò)程中,Scrapy引擎用于控制整個(gè)系統的數據處理流程。
  
  Scrapy框架內包含的各組件功能如下:
  Scrapy引擎:用來(lái)控制整個(gè)系統的數據處理流程,并進(jìn)行事務(wù)處理的觸發(fā)。
  調度器中間件:位于Scrapy引擎和調度器之間,主要用于處理Scrapy引擎發(fā)送到調度器的請求和響應。
  調度器:用來(lái)接收引擎發(fā)送過(guò)來(lái)的請求,壓入隊列完成去重操作,并決定下一個(gè)要抓取的網(wǎng)站,在引擎再次請求的時(shí)候返回URL。
  下載器中間件:位于Scrapy引擎和下載器之間,主要用于處理Scrapy引擎與下載器之間的請求及響應,其中代理IP和用戶(hù)代理可以在這里設置。
  下載器:用于下載網(wǎng)頁(yè)內容,并將網(wǎng)頁(yè)響應結果返回給爬蟲(chóng)。
  爬蟲(chóng)中間件:位于Scrapy引擎和爬蟲(chóng)之間,主要用于處理爬蟲(chóng)的響應輸入和請求輸出。
  爬蟲(chóng):用于從特定網(wǎng)頁(yè)中提取需要的信息,也可以從中提取URL交給調度器,讓Scrapy繼續爬取下一個(gè)頁(yè)面。
  項目管道:負責處理爬蟲(chóng)從網(wǎng)頁(yè)中抓取的信息,主要的功能為持久化項目、驗證項目的有效性、清除不需要的信息,并完成數據存儲。
  二、爬蟲(chóng)實(shí)戰
  1.項目需求
  基于Scrapy框架爬取某網(wǎng)站的新聞標題和內容。
  2.分析頁(yè)面網(wǎng)站
  
  通過(guò)網(wǎng)頁(yè)解析,了解新聞網(wǎng)站不同模塊對應的詳情頁(yè)URL均為靜態(tài)數據。
  
  通過(guò)對不同板塊的網(wǎng)頁(yè)進(jìn)行解析,了解各模塊的新聞為動(dòng)態(tài)加載數據,且新聞標題位于“a”標簽下。
  
  進(jìn)一步,分析新聞網(wǎng)頁(yè),了解新聞內容位于“p”標簽下。
  3.項目搭建
  第一步:創(chuàng )建項目
  Pycharm終端輸入
  cd?框架 #進(jìn)入項目文件夾路徑scrapy?startproject?wangyi?#創(chuàng )建項目,wangyi為項目名cd?wangyi?#進(jìn)入項目路徑scrapy?genspider?spiderName?www.xxx.com?#在子目錄中創(chuàng )建爬蟲(chóng)文件
  
  項目結構如下:spiders用于存放爬蟲(chóng)程序(SpiderName.py)的文件夾;items用來(lái)定義數據結構,類(lèi)似于字典的功能;middlewares中間件,可設置ip代理等;pipelines用于對items中的數據進(jìn)行清洗、存儲等操作;settings是設置文件,包含爬蟲(chóng)項目的信息;scrapy.cfg是關(guān)于項目配置文件。
  第二步:編寫(xiě)爬蟲(chóng)代碼(spiderName.py)
  import scrapyfrom selenium import webdriverfrom wangyi.items import WangyiItem<br />class WangyiSpider(scrapy.Spider): name = 'wangyi' #allowed_domains = ['www.xxx.com'] start_urls = ['https://news.163.com/'] models_urls = [] #存儲五個(gè)板塊的詳情頁(yè)url #實(shí)例化瀏覽器對象 def __init__(self): self.bro = webdriver.Chrome(executable_path='D:/PyCharm/learnpython/框架/wangyi/chromedriver.exe') def parse(self, response): li_list = response.xpath('//*[@id="index2016_wrap"]/div[2]/div[2]/div[2]/div[2]/div/ul/li') alist = [2,3,5,6,7] for index in alist: model_url = li_list[index].xpath('./a/@href').extract_first() self.models_urls.append(model_url) #依次對每一個(gè)板塊對應的頁(yè)面發(fā)送請求 for url in self.models_urls: yield scrapy.Request(url,callback=self.parse_model)<br /> def parse_model(self,response): div_lists = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div') for div in div_lists: title = div.xpath('./div/div[1]/h3/a/text()').extract_first() new_detial_url = div.xpath('./div/div[1]/h3/a/@href').extract_first() item = WangyiItem()????????????item['title']?=?title yield scrapy.Request(url=new_detial_url , callback=self.parse_detial , meta={'item' : item}) def parse_detial(self,response): content = response.xpath('//*[@id="content"]/div[2]//text()').extract() content = ''.join(content) item = response.meta['item'] item['content'] = content yield item<br /> def closed(self,spider):????????self.bro.quit()
  注意不能使用return返回數據,應使用yield返回數據。使用return直接退出函數,而對于yield在調研for的時(shí)候,函數內部不會(huì )立即執行,只是返回一個(gè)生成器對象。
  第三步:設置中間件(middlewares.py)
  from scrapy import signalsfrom scrapy.http import HtmlResponsefrom time import sleep# useful for handling different item types with a single interfacefrom itemadapter import is_item, ItemAdapter<br />class?WangyiDownloaderMiddleware:????def?process_request(self,?request,?spider):????????return?None #通過(guò)該方法攔截五大板塊對應的響應對象,進(jìn)行纂改 def process_response(self, request, response, spider): #挑選出指定的響應對象精選纂改 bro = spider.bro #獲取在爬蟲(chóng)類(lèi)中定義的瀏覽器對象 if request.url in spider.models_urls: bro.get(request.url) #五個(gè)板塊url發(fā)送請求 sleep(2) page_text = bro.page_source #動(dòng)態(tài)加載的新聞數據 new_response = HtmlResponse(url=request.url,body= page_text,encoding='utf-8',request=request) return new_response else: return response<br />????def?process_exception(self,?request,?exception,?spider): pass
  第四步:數據存儲
  定義爬取數據結構(items.py)
  import scrapyclass?WangyiItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() content = scrapy.Field()????pass
  定義數據管道(pipelines.py)
  class WangyiPipeline:????fp?=?None # 重寫(xiě)父類(lèi)的一個(gè)方法,該方法只會(huì )在開(kāi)始爬蟲(chóng)的時(shí)候被調用一次 def open_spider(self, spider): print('開(kāi)始爬蟲(chóng)。。。。。。') self.fp = open('./wangyi.text', 'w', encoding='utf-8')<br /> # 用來(lái)專(zhuān)門(mén)處理item類(lèi)型對象 # 該方法每接收到一個(gè)item就會(huì )被調用一次 def process_item(self, item, spider): title = item['title'] content = item['content'] self.fp.write(title + ':' + content + '\n') print(item) return item<br /> def close_spider(self, spider): print('結束爬蟲(chóng)。。。。。。')????????self.fp.close()
  第五步:程序配置(settings.py)
  UA偽裝
  USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
  對robots協(xié)議的遵守進(jìn)行修改
  ROBOTSTXT_OBEY = False
  顯示指定類(lèi)型日志信息
  LOG_LEVEL ='ERROR'
  
  開(kāi)啟中間件
  DOWNLOADER_MIDDLEWARES = { 'wangyi.middlewares.WangyiDownloaderMiddleware': 543,}
  
  開(kāi)啟管道
  ITEM_PIPELINES = { 'wangyi.pipelines.WangyiPipeline': 300,}
  
  第六步:執行項目
  Pycharm終端輸入
  scrapy?crawl?wangyi #wangyi 為爬蟲(chóng)項目名
  4.爬蟲(chóng)結果
  
  參考資料:
  《Python網(wǎng)絡(luò )爬蟲(chóng)技術(shù)與實(shí)戰》,2021,趙國生、王健著(zhù)。 查看全部

  爬蟲(chóng)實(shí)戰:Scrapy框架
  Scrapy是用Python語(yǔ)言編寫(xiě),通過(guò)Twisted異步網(wǎng)絡(luò )框架提升下載速度,是一個(gè)快速、高層次的屏幕抓取和Web抓取框架,常用于數據挖掘、監測和自動(dòng)化測試等。
  一、Scrapy框架介紹
  Scrapy內部實(shí)現了并發(fā)請求、免登錄、URL去重等操作,開(kāi)發(fā)者可根據自己的需求去編寫(xiě)部分代碼,就能抓取到所需要的數據。Scrapy框架包含的組件有調度器、下載器、Scrapy引擎、項目管道、爬蟲(chóng)以及各中間件等。
  Scrapy框架爬取流程:首先從初始URL開(kāi)始,調度器會(huì )將其交給下載器(Downloader),下載器向網(wǎng)絡(luò )服務(wù)器發(fā)送請求進(jìn)行下載,得到的響應后將下載數據交給爬蟲(chóng),爬蟲(chóng)會(huì )對網(wǎng)頁(yè)進(jìn)行分析,分析出來(lái)的結果有兩種:一種是需要進(jìn)一步抓取的鏈接,這些鏈接會(huì )被傳回調度器,另一種是需要保存的數據,它們會(huì )被傳送至項目管道,項目管道進(jìn)一步對數據進(jìn)行清洗、去重等處理,并存儲到文件或數據庫中。數據爬取過(guò)程中,Scrapy引擎用于控制整個(gè)系統的數據處理流程。
  
  Scrapy框架內包含的各組件功能如下:
  Scrapy引擎:用來(lái)控制整個(gè)系統的數據處理流程,并進(jìn)行事務(wù)處理的觸發(fā)。
  調度器中間件:位于Scrapy引擎和調度器之間,主要用于處理Scrapy引擎發(fā)送到調度器的請求和響應。
  調度器:用來(lái)接收引擎發(fā)送過(guò)來(lái)的請求,壓入隊列完成去重操作,并決定下一個(gè)要抓取的網(wǎng)站,在引擎再次請求的時(shí)候返回URL。
  下載器中間件:位于Scrapy引擎和下載器之間,主要用于處理Scrapy引擎與下載器之間的請求及響應,其中代理IP和用戶(hù)代理可以在這里設置。
  下載器:用于下載網(wǎng)頁(yè)內容,并將網(wǎng)頁(yè)響應結果返回給爬蟲(chóng)。
  爬蟲(chóng)中間件:位于Scrapy引擎和爬蟲(chóng)之間,主要用于處理爬蟲(chóng)的響應輸入和請求輸出。
  爬蟲(chóng):用于從特定網(wǎng)頁(yè)中提取需要的信息,也可以從中提取URL交給調度器,讓Scrapy繼續爬取下一個(gè)頁(yè)面。
  項目管道:負責處理爬蟲(chóng)從網(wǎng)頁(yè)中抓取的信息,主要的功能為持久化項目、驗證項目的有效性、清除不需要的信息,并完成數據存儲。
  二、爬蟲(chóng)實(shí)戰
  1.項目需求
  基于Scrapy框架爬取某網(wǎng)站的新聞標題和內容。
  2.分析頁(yè)面網(wǎng)站
  
  通過(guò)網(wǎng)頁(yè)解析,了解新聞網(wǎng)站不同模塊對應的詳情頁(yè)URL均為靜態(tài)數據。
  
  通過(guò)對不同板塊的網(wǎng)頁(yè)進(jìn)行解析,了解各模塊的新聞為動(dòng)態(tài)加載數據,且新聞標題位于“a”標簽下。
  
  進(jìn)一步,分析新聞網(wǎng)頁(yè),了解新聞內容位于“p”標簽下。
  3.項目搭建
  第一步:創(chuàng )建項目
  Pycharm終端輸入
  cd?框架 #進(jìn)入項目文件夾路徑scrapy?startproject?wangyi?#創(chuàng )建項目,wangyi為項目名cd?wangyi?#進(jìn)入項目路徑scrapy?genspider?spiderName?www.xxx.com?#在子目錄中創(chuàng )建爬蟲(chóng)文件
  
  項目結構如下:spiders用于存放爬蟲(chóng)程序(SpiderName.py)的文件夾;items用來(lái)定義數據結構,類(lèi)似于字典的功能;middlewares中間件,可設置ip代理等;pipelines用于對items中的數據進(jìn)行清洗、存儲等操作;settings是設置文件,包含爬蟲(chóng)項目的信息;scrapy.cfg是關(guān)于項目配置文件。
  第二步:編寫(xiě)爬蟲(chóng)代碼(spiderName.py)
  import scrapyfrom selenium import webdriverfrom wangyi.items import WangyiItem<br />class WangyiSpider(scrapy.Spider): name = 'wangyi' #allowed_domains = ['www.xxx.com'] start_urls = ['https://news.163.com/'] models_urls = [] #存儲五個(gè)板塊的詳情頁(yè)url #實(shí)例化瀏覽器對象 def __init__(self): self.bro = webdriver.Chrome(executable_path='D:/PyCharm/learnpython/框架/wangyi/chromedriver.exe') def parse(self, response): li_list = response.xpath('//*[@id="index2016_wrap"]/div[2]/div[2]/div[2]/div[2]/div/ul/li') alist = [2,3,5,6,7] for index in alist: model_url = li_list[index].xpath('./a/@href').extract_first() self.models_urls.append(model_url) #依次對每一個(gè)板塊對應的頁(yè)面發(fā)送請求 for url in self.models_urls: yield scrapy.Request(url,callback=self.parse_model)<br /> def parse_model(self,response): div_lists = response.xpath('/html/body/div/div[3]/div[4]/div[1]/div[1]/div/ul/li/div/div') for div in div_lists: title = div.xpath('./div/div[1]/h3/a/text()').extract_first() new_detial_url = div.xpath('./div/div[1]/h3/a/@href').extract_first() item = WangyiItem()????????????item['title']?=?title yield scrapy.Request(url=new_detial_url , callback=self.parse_detial , meta={'item' : item}) def parse_detial(self,response): content = response.xpath('//*[@id="content"]/div[2]//text()').extract() content = ''.join(content) item = response.meta['item'] item['content'] = content yield item<br /> def closed(self,spider):????????self.bro.quit()
  注意不能使用return返回數據,應使用yield返回數據。使用return直接退出函數,而對于yield在調研for的時(shí)候,函數內部不會(huì )立即執行,只是返回一個(gè)生成器對象。
  第三步:設置中間件(middlewares.py)
  from scrapy import signalsfrom scrapy.http import HtmlResponsefrom time import sleep# useful for handling different item types with a single interfacefrom itemadapter import is_item, ItemAdapter<br />class?WangyiDownloaderMiddleware:????def?process_request(self,?request,?spider):????????return?None #通過(guò)該方法攔截五大板塊對應的響應對象,進(jìn)行纂改 def process_response(self, request, response, spider): #挑選出指定的響應對象精選纂改 bro = spider.bro #獲取在爬蟲(chóng)類(lèi)中定義的瀏覽器對象 if request.url in spider.models_urls: bro.get(request.url) #五個(gè)板塊url發(fā)送請求 sleep(2) page_text = bro.page_source #動(dòng)態(tài)加載的新聞數據 new_response = HtmlResponse(url=request.url,body= page_text,encoding='utf-8',request=request) return new_response else: return response<br />????def?process_exception(self,?request,?exception,?spider): pass
  第四步:數據存儲
  定義爬取數據結構(items.py)
  import scrapyclass?WangyiItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() title = scrapy.Field() content = scrapy.Field()????pass
  定義數據管道(pipelines.py)
  class WangyiPipeline:????fp?=?None # 重寫(xiě)父類(lèi)的一個(gè)方法,該方法只會(huì )在開(kāi)始爬蟲(chóng)的時(shí)候被調用一次 def open_spider(self, spider): print('開(kāi)始爬蟲(chóng)。。。。。。') self.fp = open('./wangyi.text', 'w', encoding='utf-8')<br /> # 用來(lái)專(zhuān)門(mén)處理item類(lèi)型對象 # 該方法每接收到一個(gè)item就會(huì )被調用一次 def process_item(self, item, spider): title = item['title'] content = item['content'] self.fp.write(title + ':' + content + '\n') print(item) return item<br /> def close_spider(self, spider): print('結束爬蟲(chóng)。。。。。。')????????self.fp.close()
  第五步:程序配置(settings.py)
  UA偽裝
  USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'
  對robots協(xié)議的遵守進(jìn)行修改
  ROBOTSTXT_OBEY = False
  顯示指定類(lèi)型日志信息
  LOG_LEVEL ='ERROR'
  
  開(kāi)啟中間件
  DOWNLOADER_MIDDLEWARES = { 'wangyi.middlewares.WangyiDownloaderMiddleware': 543,}
  
  開(kāi)啟管道
  ITEM_PIPELINES = { 'wangyi.pipelines.WangyiPipeline': 300,}
  
  第六步:執行項目
  Pycharm終端輸入
  scrapy?crawl?wangyi #wangyi 為爬蟲(chóng)項目名
  4.爬蟲(chóng)結果
  
  參考資料:
  《Python網(wǎng)絡(luò )爬蟲(chóng)技術(shù)與實(shí)戰》,2021,趙國生、王健著(zhù)。

手把手教你使用Python網(wǎng)絡(luò )爬蟲(chóng)獲取基金信息

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 70 次瀏覽 ? 2022-05-01 01:09 ? 來(lái)自相關(guān)話(huà)題

  手把手教你使用Python網(wǎng)絡(luò )爬蟲(chóng)獲取基金信息
  
  文章:Python爬蟲(chóng)與數據挖掘作者:Python進(jìn)階者01前言
  前幾天有個(gè)粉絲找我獲取基金信息,這里拿出來(lái)分享一下,感興趣的小伙伴們,也可以積極嘗試。
  
  02數據獲取
  這里我們的目標網(wǎng)站是某基金官網(wǎng),需要抓取的數據如下圖所示。
  
  可以看到上圖中基金代碼那一列,有不同的數字,隨機點(diǎn)擊一個(gè),可以進(jìn)入到基金詳情頁(yè),鏈接也非常有規律,以基金代碼作為標志的。
  其實(shí)這個(gè)網(wǎng)站倒是不難,數據什么的,都沒(méi)有加密,網(wǎng)頁(yè)上的信息,在源碼中都可以直接看到。
  
  這樣就降低了抓取難度了。通過(guò)瀏覽器抓包的方法,可以看到具體的請求參數,而且可以看到請求參數中只有pi在變化,而這個(gè)值恰好對應的是頁(yè)面,直接構造請求參數就可以了。
  
  代碼實(shí)現過(guò)程
  找到數據源之后,接下來(lái)就是代碼實(shí)現了,一起來(lái)看看吧,這里給出部分關(guān)鍵代碼。
  獲取股票id數據
  response = requests.get(url, headers=headers, params=params, verify=False) pattern = re.compile(r'.*?"(?P.*?)".*?', re.S) result = re.finditer(pattern, response.text) ids = [] for item in result: # print(item.group('items')) gp_id = item.group('items').split(',')[0]
  結果如下圖所示:
  
  之后構造詳情頁(yè)鏈接,獲取詳情頁(yè)的基金信息,關(guān)鍵代碼如下:
  response = requests.get(url, headers=headers)response.encoding = response.apparent_encodingselectors = etree.HTML(response.text)danweijingzhi1 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[1]/text()')[0]danweijingzhi2 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[2]/text()')[0]leijijingzhi = selectors.xpath('//dl[@class="dataItem03"]/dd[1]/span/text()')[0]lst = selectors.xpath('//div[@class="infoOfFund"]/table//text()')
  結果如下圖所示:
  
  將具體的信息做相應的字符串處理,然后保存到csv文件中,結果如下圖所示:
  
  有了這個(gè),你可以做進(jìn)一步的統計和數據分析了。
  - 合作、交流、轉載請添加微信 moonhmily1 -<p style="outline: 0px;white-space: normal;font-size: 16px;"></p> 查看全部

  手把手教你使用Python網(wǎng)絡(luò )爬蟲(chóng)獲取基金信息
  
  文章:Python爬蟲(chóng)與數據挖掘作者:Python進(jìn)階者01前言
  前幾天有個(gè)粉絲找我獲取基金信息,這里拿出來(lái)分享一下,感興趣的小伙伴們,也可以積極嘗試。
  
  02數據獲取
  這里我們的目標網(wǎng)站是某基金官網(wǎng),需要抓取的數據如下圖所示。
  
  可以看到上圖中基金代碼那一列,有不同的數字,隨機點(diǎn)擊一個(gè),可以進(jìn)入到基金詳情頁(yè),鏈接也非常有規律,以基金代碼作為標志的。
  其實(shí)這個(gè)網(wǎng)站倒是不難,數據什么的,都沒(méi)有加密,網(wǎng)頁(yè)上的信息,在源碼中都可以直接看到。
  
  這樣就降低了抓取難度了。通過(guò)瀏覽器抓包的方法,可以看到具體的請求參數,而且可以看到請求參數中只有pi在變化,而這個(gè)值恰好對應的是頁(yè)面,直接構造請求參數就可以了。
  
  代碼實(shí)現過(guò)程
  找到數據源之后,接下來(lái)就是代碼實(shí)現了,一起來(lái)看看吧,這里給出部分關(guān)鍵代碼。
  獲取股票id數據
  response = requests.get(url, headers=headers, params=params, verify=False) pattern = re.compile(r'.*?"(?P.*?)".*?', re.S) result = re.finditer(pattern, response.text) ids = [] for item in result: # print(item.group('items')) gp_id = item.group('items').split(',')[0]
  結果如下圖所示:
  
  之后構造詳情頁(yè)鏈接,獲取詳情頁(yè)的基金信息,關(guān)鍵代碼如下:
  response = requests.get(url, headers=headers)response.encoding = response.apparent_encodingselectors = etree.HTML(response.text)danweijingzhi1 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[1]/text()')[0]danweijingzhi2 = selectors.xpath('//dl[@class="dataItem02"]/dd[1]/span[2]/text()')[0]leijijingzhi = selectors.xpath('//dl[@class="dataItem03"]/dd[1]/span/text()')[0]lst = selectors.xpath('//div[@class="infoOfFund"]/table//text()')
  結果如下圖所示:
  
  將具體的信息做相應的字符串處理,然后保存到csv文件中,結果如下圖所示:
  
  有了這個(gè),你可以做進(jìn)一步的統計和數據分析了。
  - 合作、交流、轉載請添加微信 moonhmily1 -<p style="outline: 0px;white-space: normal;font-size: 16px;"></p>

Python架構高薪就業(yè)班/爬蟲(chóng)/數據分析/web開(kāi)發(fā)/AI人工智能(百度云 百

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 65 次瀏覽 ? 2022-04-29 23:25 ? 來(lái)自相關(guān)話(huà)題

  Python架構高薪就業(yè)班/爬蟲(chóng)/數據分析/web開(kāi)發(fā)/AI人工智能(百度云 百
  含大數據、前沿技術(shù)、前端開(kāi)發(fā)、后端開(kāi)發(fā)、移動(dòng)開(kāi)發(fā)、數據分析、架構、人工智能、Python、Java、Android、前端、IOS、C++、大數據、、GO、音視頻軟件測試、產(chǎn)品經(jīng)理、運維、股票基金、人工智能AI
  
  
  
  以下內容為填充,無(wú)視即可
  報表樣式的餅圖如圖13-15所示??梢詥螕羧鐖D13-16所示的鏈接單獨引用此報表。圖13-15 報表樣式的餅圖圖13-16 鏈接報表單獨的頁(yè)面能根據查詢(xún)的修改而實(shí)時(shí)變化,比如將查詢(xún)修改為:select date_format(create_time,'%Y-%m-%d') d, count(*) cfrom information_schema.tableswhere create_time &gt; '2016-06-07'group by date_format(create_time,'%Y-%m-%d')order by d;增加了where子句,再運行此查詢(xún),結果如圖13-17所示。圖13-17 圖形顯示隨查詢(xún)變化單獨鏈接的頁(yè)面也隨之自動(dòng)發(fā)生變化,如圖13-18所示。圖13-18 單獨鏈接的頁(yè)面自動(dòng)變化13.4 Hue、Zeppelin比較1.功能Zeppelin和Hue都具有一定的數據可視化功能,都提供了多種圖形化數據表示形式。單從這點(diǎn)來(lái)說(shuō),它們的功能類(lèi)似,大同小異。Hue可以通過(guò)經(jīng)緯度進(jìn)行地圖定位,這個(gè)功能在Zeppelin 0.6.0上沒(méi)有。Zeppelin支持的后端數據查詢(xún)程序較多,0.6.0版本默認有18種,原生支持Spark。
  而Hue的3.9.0版本默認只支持Hive、Impala、Pig和數據庫查詢(xún)。Zeppelin只提供了單一的數據處理功能,它將數據攝取、數據發(fā)現、數據分析、數據可視化都歸為數據處理的范疇。而Hue的功能則豐富得多,除了類(lèi)似的數據處理,還有元數據管理、Oozie工作流管理、作業(yè)管理、用戶(hù)管理、Sqoop集成等很多管理功能。從這點(diǎn)看,Zeppelin只是一個(gè)數據處理工具,而Hue更像是一個(gè)綜合管理工具。2.架構Zeppelin采用插件式的翻譯器,通過(guò)插件開(kāi)發(fā),可以添加任何后端語(yǔ)言及其數據處理程序,相對來(lái)說(shuō)更加獨立和開(kāi)放。Hue與Hadoop生態(tài)圈的其他組件密切相關(guān),一般都與CDH一同部署。3.使用場(chǎng)景Zeppelin適合單一數據處理,但后端處理語(yǔ)言繁多的場(chǎng)景,尤其適合Spark。Hue適合與Hadoop集群的多個(gè)組件交互,如Oozie工作流、Sqoop等聯(lián)合處理數據的場(chǎng)景,尤其適合與Impala協(xié)同工作。13.5 數據可視化實(shí)例本節先用Impala、DB查詢(xún)示例說(shuō)明Hue的數據查詢(xún)和可視化功能,然后交互式地建立定期執行銷(xiāo)售訂單示例ETL任務(wù)的工作流,說(shuō)明在Hue里是如何操作Oozie工作流引擎的。
  1.Impala查詢(xún)在12.4節中執行了一些聯(lián)機分析處理的查詢(xún),現在在Hue里執行查詢(xún),直觀(guān)看一下結果的圖形化表示效果。登錄Hue,單擊 圖標進(jìn)入“我的文檔”頁(yè)面。單擊 創(chuàng )建一個(gè)名為“銷(xiāo)售訂單”的新項目。單擊“新文檔”→“Impala”進(jìn)入查詢(xún)編輯頁(yè)面,創(chuàng )建一個(gè)新的Impala文檔。在Impala查詢(xún)編輯頁(yè)面,選擇olap庫,然后在編輯窗口輸入下面的查詢(xún)語(yǔ)句。-- 按產(chǎn)品分類(lèi)查詢(xún)銷(xiāo)售量和銷(xiāo)售額selectt2.product_category pro_category,sum(order_quantity) sum_quantity,sum(order_amount) sum_amountfromsales_order_fact t1, product_dim t2wheret1.product_sk = t2.product_skgroup bypro_categoryorder bypro_category;-- 按產(chǎn)品查詢(xún)銷(xiāo)售量和銷(xiāo)售額 查看全部

  Python架構高薪就業(yè)班/爬蟲(chóng)/數據分析/web開(kāi)發(fā)/AI人工智能(百度云 百
  含大數據、前沿技術(shù)、前端開(kāi)發(fā)、后端開(kāi)發(fā)、移動(dòng)開(kāi)發(fā)、數據分析、架構、人工智能、Python、Java、Android、前端、IOS、C++、大數據、、GO、音視頻軟件測試、產(chǎn)品經(jīng)理、運維、股票基金、人工智能AI
  
  
  
  以下內容為填充,無(wú)視即可
  報表樣式的餅圖如圖13-15所示??梢詥螕羧鐖D13-16所示的鏈接單獨引用此報表。圖13-15 報表樣式的餅圖圖13-16 鏈接報表單獨的頁(yè)面能根據查詢(xún)的修改而實(shí)時(shí)變化,比如將查詢(xún)修改為:select date_format(create_time,'%Y-%m-%d') d, count(*) cfrom information_schema.tableswhere create_time &gt; '2016-06-07'group by date_format(create_time,'%Y-%m-%d')order by d;增加了where子句,再運行此查詢(xún),結果如圖13-17所示。圖13-17 圖形顯示隨查詢(xún)變化單獨鏈接的頁(yè)面也隨之自動(dòng)發(fā)生變化,如圖13-18所示。圖13-18 單獨鏈接的頁(yè)面自動(dòng)變化13.4 Hue、Zeppelin比較1.功能Zeppelin和Hue都具有一定的數據可視化功能,都提供了多種圖形化數據表示形式。單從這點(diǎn)來(lái)說(shuō),它們的功能類(lèi)似,大同小異。Hue可以通過(guò)經(jīng)緯度進(jìn)行地圖定位,這個(gè)功能在Zeppelin 0.6.0上沒(méi)有。Zeppelin支持的后端數據查詢(xún)程序較多,0.6.0版本默認有18種,原生支持Spark。
  而Hue的3.9.0版本默認只支持Hive、Impala、Pig和數據庫查詢(xún)。Zeppelin只提供了單一的數據處理功能,它將數據攝取、數據發(fā)現、數據分析、數據可視化都歸為數據處理的范疇。而Hue的功能則豐富得多,除了類(lèi)似的數據處理,還有元數據管理、Oozie工作流管理、作業(yè)管理、用戶(hù)管理、Sqoop集成等很多管理功能。從這點(diǎn)看,Zeppelin只是一個(gè)數據處理工具,而Hue更像是一個(gè)綜合管理工具。2.架構Zeppelin采用插件式的翻譯器,通過(guò)插件開(kāi)發(fā),可以添加任何后端語(yǔ)言及其數據處理程序,相對來(lái)說(shuō)更加獨立和開(kāi)放。Hue與Hadoop生態(tài)圈的其他組件密切相關(guān),一般都與CDH一同部署。3.使用場(chǎng)景Zeppelin適合單一數據處理,但后端處理語(yǔ)言繁多的場(chǎng)景,尤其適合Spark。Hue適合與Hadoop集群的多個(gè)組件交互,如Oozie工作流、Sqoop等聯(lián)合處理數據的場(chǎng)景,尤其適合與Impala協(xié)同工作。13.5 數據可視化實(shí)例本節先用Impala、DB查詢(xún)示例說(shuō)明Hue的數據查詢(xún)和可視化功能,然后交互式地建立定期執行銷(xiāo)售訂單示例ETL任務(wù)的工作流,說(shuō)明在Hue里是如何操作Oozie工作流引擎的。
  1.Impala查詢(xún)在12.4節中執行了一些聯(lián)機分析處理的查詢(xún),現在在Hue里執行查詢(xún),直觀(guān)看一下結果的圖形化表示效果。登錄Hue,單擊 圖標進(jìn)入“我的文檔”頁(yè)面。單擊 創(chuàng )建一個(gè)名為“銷(xiāo)售訂單”的新項目。單擊“新文檔”→“Impala”進(jìn)入查詢(xún)編輯頁(yè)面,創(chuàng )建一個(gè)新的Impala文檔。在Impala查詢(xún)編輯頁(yè)面,選擇olap庫,然后在編輯窗口輸入下面的查詢(xún)語(yǔ)句。-- 按產(chǎn)品分類(lèi)查詢(xún)銷(xiāo)售量和銷(xiāo)售額selectt2.product_category pro_category,sum(order_quantity) sum_quantity,sum(order_amount) sum_amountfromsales_order_fact t1, product_dim t2wheret1.product_sk = t2.product_skgroup bypro_categoryorder bypro_category;-- 按產(chǎn)品查詢(xún)銷(xiāo)售量和銷(xiāo)售額

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(本節書(shū)摘來(lái)自異步社區《用Python寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)》第2章)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 76 次瀏覽 ? 2022-04-19 15:08 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(本節書(shū)摘來(lái)自異步社區《用Python寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)》第2章)
  本節節選自異步社區作者【澳大利亞】理查德·勞森(Richard Lawson)所著(zhù)的《用Python編寫(xiě)Web爬蟲(chóng)》一書(shū)第2章第2.2節,李斌翻譯,更多章節可訪(fǎng)問(wèn)云棲社區“異步社區”公眾號查看。
  2.2 三種網(wǎng)頁(yè)抓取方法
  現在我們已經(jīng)了解了這個(gè)網(wǎng)頁(yè)的結構,有三種方法可以從中獲取數據。首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  2.2.1 正則表達式
  如果您不熟悉正則表達式,或者需要一些提示,請查看完整介紹。
  當我們使用正則表達式抓取區域數據時(shí),首先需要嘗試匹配
  里面的內容
  元素,如下圖。
   >>> import re
>>> url = 'http://example.webscraping.com/view/United
-Kingdom-239'
>>> html = download(url)
>>> re.findall('(.*?)', html)
['/places/static/images/flags/gb.png',
'244,820 square kilometres',
'62,348,447',
'GB',
'United Kingdom',
'London',
'EU',
'.uk',
'GBP',
'Pound',
'44',
'@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}
[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})
|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$',
'en-GB,cy-GB,gd',
'IE ']
  從上面的結果可以看出,標簽被用于幾個(gè)國家屬性。為了隔離area屬性,我們可以只選擇其中的第二個(gè)元素,如下圖。
   >>> re.findall('(.*?)', html)[1]
'244,820 square kilometres'
  雖然此方案目前可用,但如果頁(yè)面更改,它可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使這個(gè)正則表達式更健壯,我們可以將它作為父對象
   >>> re.findall('Area: (.*?)', html)
['244,820 square kilometres']
  這個(gè)迭代版本看起來(lái)更好,但是網(wǎng)頁(yè)更新還有很多其他方式也可以使這個(gè)正則表達式不滿(mǎn)足。例如,要將雙引號改為單引號,
  在之間添加額外的空格
  標簽,或更改 area_label 等。下面是嘗試支持這些可能性的改進(jìn)版本。
   >>> re.findall('.*?>> from bs4 import BeautifulSoup
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, 'html.parser')
>>> fixed_html = soup.prettify()
>>> print fixed_html



Area
Population



  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽,除了添加和
  標記使它成為一個(gè)完整的 HTML 文檔?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
   >>> ul = soup.find('ul', attrs={'class':'country'})
>>> ul.find('li') # returns just the first match
Area
>>> ul.find_all('li') # returns all matches
[Area, Population]
  要了解所有的方法和參數,可以參考 BeautifulSoup 的官方文檔:.
  以下是使用該方法提取樣本國家地區數據的完整代碼。
   >>> from bs4 import BeautifulSoup
>>> url = 'http://example.webscraping.com/places/view/
United-Kingdom-239'
>>> html = download(url)
>>> soup = BeautifulSoup(html)
>>> # locate the area row
>>> tr = soup.find(attrs={'id':'places_area__row'})
>>> td = tr.find(attrs={'class':'w2p_fw'}) # locate the area tag
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的小變化,例如額外的空白和選項卡屬性,我們不必再擔心了。
  2.2.3 Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。這個(gè)模塊是用C語(yǔ)言編寫(xiě)的,解析速度比Beautiful Soup快,但是安裝過(guò)程比較復雜。最新的安裝說(shuō)明可供參考。
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析相同的不完整 HTML 的示例。
   >>> import lxml.html
>>> broken_html = 'AreaPopulation'
>>> tree = lxml.html.fromstring(broken_html) # parse the HTML
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html

Area
Population

  同樣,lxml可以正確解析屬性和關(guān)閉標簽周?chē)鄙俚囊?,但是模塊不加和
  標簽。
  解析輸入內容后,進(jìn)入選擇元素的步驟。此時(shí),lxml 有幾種不同的方法,例如類(lèi)似于 Beautiful Soup 的 XPath 選擇器和 find() 方法。但是,在本例和后續示例中,我們將使用 CSS 選擇器,因為它們更簡(jiǎn)潔,可以在第 5 章解析動(dòng)態(tài)內容時(shí)重復使用。另外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼。
   >>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  CSS 選擇器的關(guān)鍵行已加粗。這行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇w2p_fw類(lèi)的表格數據子標簽。
  CSS 選擇器
  CSS 選擇器表示用于選擇元素的模式。下面是一些常用選擇器的示例。
   選擇所有標簽:*
選擇<a>標簽:a
選擇所有class="link"的元素:.link
選擇class="link"的<a>標簽:a.link
選擇id="home"的<a>標簽:a#home
選擇父元素為<a>標簽的所有子標簽:a > span
選擇<a>標簽內部的所有標簽:a span
選擇title屬性為"Home"的所有<a>標簽:a[title=Home]
  CSS3 規范已由 W3C 在 `/2011/REC-css3-selectors-20110929/ 提出。
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,不支持的功能可以在這里找到。
  需要注意的是,lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  2.2.4 性能對比
  為了更好地評估本章描述的三種抓取方法之間的權衡,我們需要比較它們的相對效率。通常,爬蟲(chóng)從網(wǎng)頁(yè)中提取多個(gè)字段。因此,為了使比較更加真實(shí),我們將在本章中實(shí)現每個(gè)爬蟲(chóng)的擴展版本,從國家頁(yè)面中提取每個(gè)可用數據。首先,我們需要回到Firebug,檢查國家頁(yè)面其他功能的格式,如圖2.4.
  
  您可以從 Firebug 的顯示中看到,表格中的每一行都有一個(gè)以 places_ 開(kāi)頭并以 __row 結尾的 ID。這些行中收錄的國家/地區數據的格式與上面示例中的格式相同。下面是使用上述信息提取所有可用國家/地區數據的實(shí)現代碼。
   FIELDS = ('area', 'population', 'iso', 'country', 'capital',
'continent', 'tld', 'currency_code', 'currency_name', 'phone',
'postal_code_format', 'postal_code_regex', 'languages',
'neighbours')
import re
def re_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search('.*?(.*?)' % field, html).groups()[0]
return results
from bs4 import BeautifulSoup
def bs_scraper(html):
soup = BeautifulSoup(html, 'html.parser')
results = {}
for field in FIELDS:
results[field] = soup.find('table').find('tr',
id='places_%s__row' % field).find('td',
class_='w2p_fw').text
return results
import lxml.html
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect('table > tr#places_%s__row
> td.w2p_fw' % field)[0].text_content()
return results
  獲取結果
  現在我們已經(jīng)完成了所有爬蟲(chóng)的代碼實(shí)現,接下來(lái)通過(guò)下面的代碼片段來(lái)測試這三種方法的相對性能。
   import time
NUM_ITERATIONS = 1000 # number of times to test each scraper
html = download('http://example.webscraping.com/places/view/
United-Kingdom-239')
for name, scraper in [('Regular expressions', re_scraper),
('BeautifulSoup', bs_scraper),
('Lxml', lxml_scraper)]:
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == re_scraper:
re.purge()
result = scraper(html)
# check scraped result is as expected
assert(result['area'] == '244,820 square kilometres')
# record end time of scrape and output the total
end = time.time()
print '%s: %.2f seconds' % (name, end – start)
  在這段代碼中,每個(gè)爬蟲(chóng)會(huì )被執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。這里使用的下載函數還是上一章定義的。請注意,我們在粗體代碼行中調用了 re.purge() 方法。默認情況下,正則表達式模塊會(huì )緩存搜索結果,為了與其他爬蟲(chóng)比較公平,我們需要使用這種方法來(lái)清除緩存。
  下面是在我的電腦上運行腳本的結果。
  $ python performance.py
Regular expressions: 5.50 seconds
BeautifulSoup: 42.84 seconds
Lxml: 7.06 seconds
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 6 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和 regex 模塊是用 C 編寫(xiě)的,而 BeautifulSoup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的行為與正則表達式一樣。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這種初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力。多么神奇的模塊!
  2.2.5 個(gè)結論
  表2.1總結了每種爬取方式的優(yōu)缺點(diǎn)。
  
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。如果你只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更合適。通常,lxml 是抓取數據的最佳選擇,因為它快速且健壯,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下有用。
  2.2.6 添加鏈接爬蟲(chóng)的爬取回調
  我們已經(jīng)看到了如何抓取國家數據,我們需要將其集成到上一章的鏈接爬蟲(chóng)中。為了重用這個(gè)爬蟲(chóng)代碼去抓取其他網(wǎng)站,我們需要添加一個(gè)回調參數來(lái)處理抓取行為?;卣{是在某個(gè)事件發(fā)生后調用的函數(在這種情況下,在網(wǎng)頁(yè)下載完成后)。爬取回調函數收錄url和html兩個(gè)參數,可以返回要爬取的url列表。下面是它的實(shí)現代碼??梢?jiàn),用Python實(shí)現這個(gè)功能非常簡(jiǎn)單。
   def link_crawler(..., scrape_callback=None):
...
links = []
if scrape_callback:
links.extend(scrape_callback(url, html) or [])
...
  在上面的代碼片段中,我們將新添加的抓取回調函數代碼加粗。如果想獲取該版本鏈接爬蟲(chóng)的完整代碼,可以訪(fǎng)問(wèn)org/wswp/code/src/tip/chapter02/link_crawler.py。
  現在,我們只需要自定義傳入的scrape_callback函數,就可以使用爬蟲(chóng)抓取其他網(wǎng)站了。下面修改lxml抓取示例的代碼,以便在回調函數中使用。
   def scrape_callback(url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = [tree.cssselect('table > tr#places_%s__row >
td.w2p_fw' % field)[0].text_content() for field in
FIELDS]
print url, row
  上面的回調函數會(huì )抓取國家數據并顯示出來(lái)。不過(guò)一般情況下,在爬取網(wǎng)站的時(shí)候,我們更希望能夠重用這些數據,所以讓我們擴展一下它的功能,把得到的數據保存在一個(gè)CSV表中。代碼如下。
   import csv
class ScrapeCallback:
def __init__(self):
self.writer = csv.writer(open('countries.csv', 'w'))
self.fields = ('area', 'population', 'iso', 'country',
'capital', 'continent', 'tld', 'currency_code',
'currency_name', 'phone', 'postal_code_format',
'postal_code_regex', 'languages',
'neighbours')
self.writer.writerow(self.fields)
def __call__(self, url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = []
for field in self.fields:
row.append(tree.cssselect('table >
tr#places_{}__row >
td.w2p_fw'.format(field))
[0].text_content())
self.writer.writerow(row)
  為了實(shí)現這個(gè)回調,我們使用回調類(lèi)而不是回調函數,以維護 csv 中 writer 屬性的狀態(tài)。在構造函數中實(shí)例化csv的writer屬性,然后在__call__方法中進(jìn)行多次寫(xiě)入。注意__call__是一個(gè)特殊的方法,當一個(gè)對象作為函數調用時(shí)會(huì )調用,這也是鏈接爬蟲(chóng)中cache_callback的調用方式。也就是說(shuō),scrape_callback(url, html) 等價(jià)于調用 scrape_callback.__call__(url, html)。如果想詳細了解Python的特殊類(lèi)方法,可以參考一下。
  以下是將回調傳遞給鏈接爬蟲(chóng)的代碼。
   link_crawler('http://example.webscraping.com/', '/(index|view)',
max_depth=-1, scrape_callback=ScrapeCallback())
  現在,當我們使用回調運行這個(gè)爬蟲(chóng)時(shí),程序會(huì )將結果寫(xiě)入 CSV 文件,我們可以使用 Excel 或 LibreOffice 等應用程序查看該文件,如圖 2.5 所示。
  
  成功!我們完成了我們的第一個(gè)工作數據抓取爬蟲(chóng)。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(本節書(shū)摘來(lái)自異步社區《用Python寫(xiě)網(wǎng)絡(luò )爬蟲(chóng)》第2章)
  本節節選自異步社區作者【澳大利亞】理查德·勞森(Richard Lawson)所著(zhù)的《用Python編寫(xiě)Web爬蟲(chóng)》一書(shū)第2章第2.2節,李斌翻譯,更多章節可訪(fǎng)問(wèn)云棲社區“異步社區”公眾號查看。
  2.2 三種網(wǎng)頁(yè)抓取方法
  現在我們已經(jīng)了解了這個(gè)網(wǎng)頁(yè)的結構,有三種方法可以從中獲取數據。首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  2.2.1 正則表達式
  如果您不熟悉正則表達式,或者需要一些提示,請查看完整介紹。
  當我們使用正則表達式抓取區域數據時(shí),首先需要嘗試匹配
  里面的內容
  元素,如下圖。
   >>> import re
>>> url = 'http://example.webscraping.com/view/United
-Kingdom-239'
>>> html = download(url)
>>> re.findall('(.*?)', html)
['/places/static/images/flags/gb.png',
'244,820 square kilometres',
'62,348,447',
'GB',
'United Kingdom',
'London',
'EU',
'.uk',
'GBP',
'Pound',
'44',
'@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA',
'^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}
[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})
|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$',
'en-GB,cy-GB,gd',
'IE ']
  從上面的結果可以看出,標簽被用于幾個(gè)國家屬性。為了隔離area屬性,我們可以只選擇其中的第二個(gè)元素,如下圖。
   >>> re.findall('(.*?)', html)[1]
'244,820 square kilometres'
  雖然此方案目前可用,但如果頁(yè)面更改,它可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使這個(gè)正則表達式更健壯,我們可以將它作為父對象
   >>> re.findall('Area: (.*?)', html)
['244,820 square kilometres']
  這個(gè)迭代版本看起來(lái)更好,但是網(wǎng)頁(yè)更新還有很多其他方式也可以使這個(gè)正則表達式不滿(mǎn)足。例如,要將雙引號改為單引號,
  在之間添加額外的空格
  標簽,或更改 area_label 等。下面是嘗試支持這些可能性的改進(jìn)版本。
   >>> re.findall('.*?>> from bs4 import BeautifulSoup
>>> broken_html = 'AreaPopulation'
>>> # parse the HTML
>>> soup = BeautifulSoup(broken_html, 'html.parser')
>>> fixed_html = soup.prettify()
>>> print fixed_html



Area
Population



  從上面的執行結果可以看出,Beautiful Soup 能夠正確解析缺失的引號并關(guān)閉標簽,除了添加和
  標記使它成為一個(gè)完整的 HTML 文檔?,F在我們可以使用 find() 和 find_all() 方法來(lái)定位我們需要的元素。
   >>> ul = soup.find('ul', attrs={'class':'country'})
>>> ul.find('li') # returns just the first match
Area
>>> ul.find_all('li') # returns all matches
[Area, Population]
  要了解所有的方法和參數,可以參考 BeautifulSoup 的官方文檔:.
  以下是使用該方法提取樣本國家地區數據的完整代碼。
   >>> from bs4 import BeautifulSoup
>>> url = 'http://example.webscraping.com/places/view/
United-Kingdom-239'
>>> html = download(url)
>>> soup = BeautifulSoup(html)
>>> # locate the area row
>>> tr = soup.find(attrs={'id':'places_area__row'})
>>> td = tr.find(attrs={'class':'w2p_fw'}) # locate the area tag
>>> area = td.text # extract the text from this tag
>>> print area
244,820 square kilometres
  此代碼雖然比正則表達式代碼更復雜,但更易于構建和理解。此外,布局中的小變化,例如額外的空白和選項卡屬性,我們不必再擔心了。
  2.2.3 Lxml
  Lxml 是基于 XML 解析庫 libxml2 的 Python 包裝器。這個(gè)模塊是用C語(yǔ)言編寫(xiě)的,解析速度比Beautiful Soup快,但是安裝過(guò)程比較復雜。最新的安裝說(shuō)明可供參考。
  與 Beautiful Soup 一樣,使用 lxml 模塊的第一步是將可能無(wú)效的 HTML 解析為統一格式。以下是使用此模塊解析相同的不完整 HTML 的示例。
   >>> import lxml.html
>>> broken_html = 'AreaPopulation'
>>> tree = lxml.html.fromstring(broken_html) # parse the HTML
>>> fixed_html = lxml.html.tostring(tree, pretty_print=True)
>>> print fixed_html

Area
Population

  同樣,lxml可以正確解析屬性和關(guān)閉標簽周?chē)鄙俚囊?,但是模塊不加和
  標簽。
  解析輸入內容后,進(jìn)入選擇元素的步驟。此時(shí),lxml 有幾種不同的方法,例如類(lèi)似于 Beautiful Soup 的 XPath 選擇器和 find() 方法。但是,在本例和后續示例中,我們將使用 CSS 選擇器,因為它們更簡(jiǎn)潔,可以在第 5 章解析動(dòng)態(tài)內容時(shí)重復使用。另外,一些有 jQuery 選擇器經(jīng)驗的讀者會(huì )更熟悉它。
  以下是使用 lxml 的 CSS 選擇器提取區域數據的示例代碼。
   >>> tree = lxml.html.fromstring(html)
>>> td = tree.cssselect('tr#places_area__row > td.w2p_fw')[0]
>>> area = td.text_content()
>>> print area
244,820 square kilometres
  CSS 選擇器的關(guān)鍵行已加粗。這行代碼會(huì )先找到ID為places_area__row的表格行元素,然后選擇w2p_fw類(lèi)的表格數據子標簽。
  CSS 選擇器
  CSS 選擇器表示用于選擇元素的模式。下面是一些常用選擇器的示例。
   選擇所有標簽:*
選擇<a>標簽:a
選擇所有class="link"的元素:.link
選擇class="link"的<a>標簽:a.link
選擇id="home"的<a>標簽:a#home
選擇父元素為<a>標簽的所有子標簽:a > span
選擇<a>標簽內部的所有標簽:a span
選擇title屬性為"Home"的所有<a>標簽:a[title=Home]
  CSS3 規范已由 W3C 在 `/2011/REC-css3-selectors-20110929/ 提出。
  Lxml 已經(jīng)實(shí)現了大部分 CSS3 屬性,不支持的功能可以在這里找到。
  需要注意的是,lxml 的內部實(shí)現實(shí)際上將 CSS 選擇器轉換為等效的 XPath 選擇器。
  2.2.4 性能對比
  為了更好地評估本章描述的三種抓取方法之間的權衡,我們需要比較它們的相對效率。通常,爬蟲(chóng)從網(wǎng)頁(yè)中提取多個(gè)字段。因此,為了使比較更加真實(shí),我們將在本章中實(shí)現每個(gè)爬蟲(chóng)的擴展版本,從國家頁(yè)面中提取每個(gè)可用數據。首先,我們需要回到Firebug,檢查國家頁(yè)面其他功能的格式,如圖2.4.
  
  您可以從 Firebug 的顯示中看到,表格中的每一行都有一個(gè)以 places_ 開(kāi)頭并以 __row 結尾的 ID。這些行中收錄的國家/地區數據的格式與上面示例中的格式相同。下面是使用上述信息提取所有可用國家/地區數據的實(shí)現代碼。
   FIELDS = ('area', 'population', 'iso', 'country', 'capital',
'continent', 'tld', 'currency_code', 'currency_name', 'phone',
'postal_code_format', 'postal_code_regex', 'languages',
'neighbours')
import re
def re_scraper(html):
results = {}
for field in FIELDS:
results[field] = re.search('.*?(.*?)' % field, html).groups()[0]
return results
from bs4 import BeautifulSoup
def bs_scraper(html):
soup = BeautifulSoup(html, 'html.parser')
results = {}
for field in FIELDS:
results[field] = soup.find('table').find('tr',
id='places_%s__row' % field).find('td',
class_='w2p_fw').text
return results
import lxml.html
def lxml_scraper(html):
tree = lxml.html.fromstring(html)
results = {}
for field in FIELDS:
results[field] = tree.cssselect('table > tr#places_%s__row
> td.w2p_fw' % field)[0].text_content()
return results
  獲取結果
  現在我們已經(jīng)完成了所有爬蟲(chóng)的代碼實(shí)現,接下來(lái)通過(guò)下面的代碼片段來(lái)測試這三種方法的相對性能。
   import time
NUM_ITERATIONS = 1000 # number of times to test each scraper
html = download('http://example.webscraping.com/places/view/
United-Kingdom-239')
for name, scraper in [('Regular expressions', re_scraper),
('BeautifulSoup', bs_scraper),
('Lxml', lxml_scraper)]:
# record start time of scrape
start = time.time()
for i in range(NUM_ITERATIONS):
if scraper == re_scraper:
re.purge()
result = scraper(html)
# check scraped result is as expected
assert(result['area'] == '244,820 square kilometres')
# record end time of scrape and output the total
end = time.time()
print '%s: %.2f seconds' % (name, end – start)
  在這段代碼中,每個(gè)爬蟲(chóng)會(huì )被執行1000次,每次執行都會(huì )檢查爬取結果是否正確,然后打印總時(shí)間。這里使用的下載函數還是上一章定義的。請注意,我們在粗體代碼行中調用了 re.purge() 方法。默認情況下,正則表達式模塊會(huì )緩存搜索結果,為了與其他爬蟲(chóng)比較公平,我們需要使用這種方法來(lái)清除緩存。
  下面是在我的電腦上運行腳本的結果。
  $ python performance.py
Regular expressions: 5.50 seconds
BeautifulSoup: 42.84 seconds
Lxml: 7.06 seconds
  由于硬件條件的不同,不同計算機的執行結果也會(huì )有一定差異。但是,每種方法之間的相對差異應該具有可比性。從結果可以看出,Beautiful Soup 在爬取我們的示例網(wǎng)頁(yè)時(shí)比其他兩種方法慢 6 倍以上。事實(shí)上,這個(gè)結果是意料之中的,因為 lxml 和 regex 模塊是用 C 編寫(xiě)的,而 BeautifulSoup 是用純 Python 編寫(xiě)的。一個(gè)有趣的事實(shí)是 lxml 的行為與正則表達式一樣。由于 lxml 必須在搜索元素之前將輸入解析為內部格式,因此會(huì )產(chǎn)生額外的開(kāi)銷(xiāo)。當爬取同一個(gè)網(wǎng)頁(yè)的多個(gè)特征時(shí),這種初始解析的開(kāi)銷(xiāo)會(huì )減少,lxml會(huì )更有競爭力。多么神奇的模塊!
  2.2.5 個(gè)結論
  表2.1總結了每種爬取方式的優(yōu)缺點(diǎn)。
  
  如果您的爬蟲(chóng)的瓶頸是下載頁(yè)面,而不是提取數據,那么使用較慢的方法(如 Beautiful Soup)不是問(wèn)題。如果你只需要抓取少量數據并想避免額外的依賴(lài),那么正則表達式可能更合適。通常,lxml 是抓取數據的最佳選擇,因為它快速且健壯,而正則表達式和 Beautiful Soup 僅在某些場(chǎng)景下有用。
  2.2.6 添加鏈接爬蟲(chóng)的爬取回調
  我們已經(jīng)看到了如何抓取國家數據,我們需要將其集成到上一章的鏈接爬蟲(chóng)中。為了重用這個(gè)爬蟲(chóng)代碼去抓取其他網(wǎng)站,我們需要添加一個(gè)回調參數來(lái)處理抓取行為?;卣{是在某個(gè)事件發(fā)生后調用的函數(在這種情況下,在網(wǎng)頁(yè)下載完成后)。爬取回調函數收錄url和html兩個(gè)參數,可以返回要爬取的url列表。下面是它的實(shí)現代碼??梢?jiàn),用Python實(shí)現這個(gè)功能非常簡(jiǎn)單。
   def link_crawler(..., scrape_callback=None):
...
links = []
if scrape_callback:
links.extend(scrape_callback(url, html) or [])
...
  在上面的代碼片段中,我們將新添加的抓取回調函數代碼加粗。如果想獲取該版本鏈接爬蟲(chóng)的完整代碼,可以訪(fǎng)問(wèn)org/wswp/code/src/tip/chapter02/link_crawler.py。
  現在,我們只需要自定義傳入的scrape_callback函數,就可以使用爬蟲(chóng)抓取其他網(wǎng)站了。下面修改lxml抓取示例的代碼,以便在回調函數中使用。
   def scrape_callback(url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = [tree.cssselect('table > tr#places_%s__row >
td.w2p_fw' % field)[0].text_content() for field in
FIELDS]
print url, row
  上面的回調函數會(huì )抓取國家數據并顯示出來(lái)。不過(guò)一般情況下,在爬取網(wǎng)站的時(shí)候,我們更希望能夠重用這些數據,所以讓我們擴展一下它的功能,把得到的數據保存在一個(gè)CSV表中。代碼如下。
   import csv
class ScrapeCallback:
def __init__(self):
self.writer = csv.writer(open('countries.csv', 'w'))
self.fields = ('area', 'population', 'iso', 'country',
'capital', 'continent', 'tld', 'currency_code',
'currency_name', 'phone', 'postal_code_format',
'postal_code_regex', 'languages',
'neighbours')
self.writer.writerow(self.fields)
def __call__(self, url, html):
if re.search('/view/', url):
tree = lxml.html.fromstring(html)
row = []
for field in self.fields:
row.append(tree.cssselect('table >
tr#places_{}__row >
td.w2p_fw'.format(field))
[0].text_content())
self.writer.writerow(row)
  為了實(shí)現這個(gè)回調,我們使用回調類(lèi)而不是回調函數,以維護 csv 中 writer 屬性的狀態(tài)。在構造函數中實(shí)例化csv的writer屬性,然后在__call__方法中進(jìn)行多次寫(xiě)入。注意__call__是一個(gè)特殊的方法,當一個(gè)對象作為函數調用時(shí)會(huì )調用,這也是鏈接爬蟲(chóng)中cache_callback的調用方式。也就是說(shuō),scrape_callback(url, html) 等價(jià)于調用 scrape_callback.__call__(url, html)。如果想詳細了解Python的特殊類(lèi)方法,可以參考一下。
  以下是將回調傳遞給鏈接爬蟲(chóng)的代碼。
   link_crawler('http://example.webscraping.com/', '/(index|view)',
max_depth=-1, scrape_callback=ScrapeCallback())
  現在,當我們使用回調運行這個(gè)爬蟲(chóng)時(shí),程序會(huì )將結果寫(xiě)入 CSV 文件,我們可以使用 Excel 或 LibreOffice 等應用程序查看該文件,如圖 2.5 所示。
  
  成功!我們完成了我們的第一個(gè)工作數據抓取爬蟲(chóng)。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)4.2—ajax[動(dòng)態(tài)網(wǎng)頁(yè)數據]用法教程綜述)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 73 次瀏覽 ? 2022-04-19 15:05 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)4.2—ajax[動(dòng)態(tài)網(wǎng)頁(yè)數據]用法教程綜述)
  Python爬蟲(chóng)4.2——ajax【動(dòng)態(tài)網(wǎng)頁(yè)數據】使用教程
  概覽
  本系列文檔用于提供Python爬蟲(chóng)技術(shù)學(xué)習的簡(jiǎn)單教程。在鞏固你的技術(shù)知識的同時(shí),如果它恰好對你有用,那就更好了。
  Python 版本是 3.7.4
  有時(shí)當我們抓取帶有請求的頁(yè)面時(shí),結果可能與我們在瀏覽器中看到的不同。正常顯示的頁(yè)面數據在瀏覽器中是可以看到的,但是使用requests得到的結果卻不是。這是因為請求獲取的是原創(chuàng )的 HTML 文檔,而瀏覽器中的頁(yè)面是通過(guò) JavaScript 處理數據的結果。這些數據有多種來(lái)源,可以通過(guò) Ajax 加載或收錄在 HTML 中。在文檔中,也可能是通過(guò)JavaScript和特定算法計算后生成的。
  所以遇到這樣的頁(yè)面,直接使用requests等庫獲取原創(chuàng )頁(yè)面是無(wú)法獲取有效數據的。這時(shí)候就需要分析網(wǎng)頁(yè)后端向接口發(fā)送的Ajax請求了。如果可以使用requests來(lái)模擬ajax請求,那么就可以成功爬取了。
  所以,在這篇文章中,我們主要了解Ajax是什么以及如何分析和抓取Ajax請求。
  AJAX簡(jiǎn)介什么是AJAX
  AJAX(異步 JavaScript 和 XML)異步 JavaScript 和 XML。通過(guò)在后臺交換與服務(wù)器協(xié)商的數據,Ajax 實(shí)現了網(wǎng)頁(yè)的異步更新,這意味著(zhù)可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下更新網(wǎng)頁(yè)的某些部分。傳統網(wǎng)頁(yè)(沒(méi)有Ajax)如果內容需要更新,需要重新加載整個(gè)網(wǎng)頁(yè),因為傳統的數據傳輸格式使用XML語(yǔ)法,所以稱(chēng)為Ajax。其實(shí)數據交互的限制基本上就是使用JSON,Ajax加載的數據,即使是用JS渲染數據到瀏覽器,查看網(wǎng)頁(yè)源碼的時(shí)候還是看不到加載的數據通過(guò) Ajax,您只能看到 Ajax 加載的數據。由 url 加載的 HTML 代碼。
  示例說(shuō)明
  在瀏覽網(wǎng)頁(yè)時(shí),我們會(huì )發(fā)現很多頁(yè)面已經(jīng)向下滾動(dòng)以查看更多選項。比如微博、今日頭條等,有的是根據鼠標下拉自動(dòng)加載的。這些其實(shí)就是Ajax加載的過(guò)程。我們可以看到頁(yè)面并沒(méi)有完全刷新,也就是說(shuō)頁(yè)面的鏈接沒(méi)有變化,但是網(wǎng)頁(yè)中有新的內容,也就是通過(guò)Ajax獲取新數據并渲染的過(guò)程。
  請求分析
  使用Chrome開(kāi)發(fā)者工具的過(guò)濾功能,過(guò)濾掉所有的Ajax請求,這里不再詳述。
  Fiddler 抓包工具也可以用于抓包分析。 Fiddler工具的使用方法這里不做說(shuō)明。您可以在線(xiàn)搜索和查看。
  Ajax 響應結果一般為 json 數據格式。
  獲取方式直接分析Ajax使用的接口,然后通過(guò)代碼請求這個(gè)接口獲取數據(下面的例子就是這樣一個(gè)通用的)。使用 Selenium + Chromedriver 模擬瀏覽器行為獲取數據(繼續關(guān)注文章)。該方法的優(yōu)缺點(diǎn)
  分析界面
  可以直接請求數據,不需要做一些解析工作,代碼少,性能高。
  分析界面比較復雜,尤其是一些被js混淆的界面,你必須對js有一定的了解,很容易被爬蟲(chóng)發(fā)現。
  硒
  直接模擬瀏覽器的行為。瀏覽器能請求的也可以用selenium來(lái)請求,爬蟲(chóng)更穩定。
  大量代碼和低性能。
  示例說(shuō)明
  讓我們舉個(gè)例子,爬取“成為一個(gè)長(cháng)得好看的程序員是什么感覺(jué)?”這個(gè)問(wèn)題的所有答案。在問(wèn)題 知乎 下。示例代碼如下:
<p># 引入所需庫
import json
import requests
# 聲明定義請求頭
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, '
'like Gecko) Chrome/67.0.3396.99 '
'Safari/537.36',
'Host': "www.zhihu.com",
'Referer': "https://www.zhihu.com/question/37787176"
}
def answer(url_):
"""
獲取問(wèn)題答案
:param url_:
:return:
"""
r = requests.get(url_, headers=header)
data = r.text
jsonobj = json.loads(data)
return jsonobj
# 問(wèn)題答案接口地址
url = "https://www.zhihu.com/api/v4/q ... ot%3B
# 獲取回答總數
answer_total = int(answer(url)['paging']['totals'])
offset = 0
while offset 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)4.2—ajax[動(dòng)態(tài)網(wǎng)頁(yè)數據]用法教程綜述)
  Python爬蟲(chóng)4.2——ajax【動(dòng)態(tài)網(wǎng)頁(yè)數據】使用教程
  概覽
  本系列文檔用于提供Python爬蟲(chóng)技術(shù)學(xué)習的簡(jiǎn)單教程。在鞏固你的技術(shù)知識的同時(shí),如果它恰好對你有用,那就更好了。
  Python 版本是 3.7.4
  有時(shí)當我們抓取帶有請求的頁(yè)面時(shí),結果可能與我們在瀏覽器中看到的不同。正常顯示的頁(yè)面數據在瀏覽器中是可以看到的,但是使用requests得到的結果卻不是。這是因為請求獲取的是原創(chuàng )的 HTML 文檔,而瀏覽器中的頁(yè)面是通過(guò) JavaScript 處理數據的結果。這些數據有多種來(lái)源,可以通過(guò) Ajax 加載或收錄在 HTML 中。在文檔中,也可能是通過(guò)JavaScript和特定算法計算后生成的。
  所以遇到這樣的頁(yè)面,直接使用requests等庫獲取原創(chuàng )頁(yè)面是無(wú)法獲取有效數據的。這時(shí)候就需要分析網(wǎng)頁(yè)后端向接口發(fā)送的Ajax請求了。如果可以使用requests來(lái)模擬ajax請求,那么就可以成功爬取了。
  所以,在這篇文章中,我們主要了解Ajax是什么以及如何分析和抓取Ajax請求。
  AJAX簡(jiǎn)介什么是AJAX
  AJAX(異步 JavaScript 和 XML)異步 JavaScript 和 XML。通過(guò)在后臺交換與服務(wù)器協(xié)商的數據,Ajax 實(shí)現了網(wǎng)頁(yè)的異步更新,這意味著(zhù)可以在不重新加載整個(gè)網(wǎng)頁(yè)的情況下更新網(wǎng)頁(yè)的某些部分。傳統網(wǎng)頁(yè)(沒(méi)有Ajax)如果內容需要更新,需要重新加載整個(gè)網(wǎng)頁(yè),因為傳統的數據傳輸格式使用XML語(yǔ)法,所以稱(chēng)為Ajax。其實(shí)數據交互的限制基本上就是使用JSON,Ajax加載的數據,即使是用JS渲染數據到瀏覽器,查看網(wǎng)頁(yè)源碼的時(shí)候還是看不到加載的數據通過(guò) Ajax,您只能看到 Ajax 加載的數據。由 url 加載的 HTML 代碼。
  示例說(shuō)明
  在瀏覽網(wǎng)頁(yè)時(shí),我們會(huì )發(fā)現很多頁(yè)面已經(jīng)向下滾動(dòng)以查看更多選項。比如微博、今日頭條等,有的是根據鼠標下拉自動(dòng)加載的。這些其實(shí)就是Ajax加載的過(guò)程。我們可以看到頁(yè)面并沒(méi)有完全刷新,也就是說(shuō)頁(yè)面的鏈接沒(méi)有變化,但是網(wǎng)頁(yè)中有新的內容,也就是通過(guò)Ajax獲取新數據并渲染的過(guò)程。
  請求分析
  使用Chrome開(kāi)發(fā)者工具的過(guò)濾功能,過(guò)濾掉所有的Ajax請求,這里不再詳述。
  Fiddler 抓包工具也可以用于抓包分析。 Fiddler工具的使用方法這里不做說(shuō)明。您可以在線(xiàn)搜索和查看。
  Ajax 響應結果一般為 json 數據格式。
  獲取方式直接分析Ajax使用的接口,然后通過(guò)代碼請求這個(gè)接口獲取數據(下面的例子就是這樣一個(gè)通用的)。使用 Selenium + Chromedriver 模擬瀏覽器行為獲取數據(繼續關(guān)注文章)。該方法的優(yōu)缺點(diǎn)
  分析界面
  可以直接請求數據,不需要做一些解析工作,代碼少,性能高。
  分析界面比較復雜,尤其是一些被js混淆的界面,你必須對js有一定的了解,很容易被爬蟲(chóng)發(fā)現。
  硒
  直接模擬瀏覽器的行為。瀏覽器能請求的也可以用selenium來(lái)請求,爬蟲(chóng)更穩定。
  大量代碼和低性能。
  示例說(shuō)明
  讓我們舉個(gè)例子,爬取“成為一個(gè)長(cháng)得好看的程序員是什么感覺(jué)?”這個(gè)問(wèn)題的所有答案。在問(wèn)題 知乎 下。示例代碼如下:
<p># 引入所需庫
import json
import requests
# 聲明定義請求頭
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) '
'AppleWebKit/537.36 (KHTML, '
'like Gecko) Chrome/67.0.3396.99 '
'Safari/537.36',
'Host': "www.zhihu.com",
'Referer': "https://www.zhihu.com/question/37787176"
}
def answer(url_):
"""
獲取問(wèn)題答案
:param url_:
:return:
"""
r = requests.get(url_, headers=header)
data = r.text
jsonobj = json.loads(data)
return jsonobj
# 問(wèn)題答案接口地址
url = "https://www.zhihu.com/api/v4/q ... ot%3B
# 獲取回答總數
answer_total = int(answer(url)['paging']['totals'])
offset = 0
while offset

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 二級建造師考試每日一練免費在線(xiàn)測試())

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 50 次瀏覽 ? 2022-04-19 01:12 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
二級建造師考試每日一練免費在線(xiàn)測試())
  
  更多《搜索引擎利用網(wǎng)絡(luò )爬蟲(chóng)不斷從網(wǎng)上爬取網(wǎng)站數據,并在本地存儲網(wǎng)站圖片。()》相關(guān)問(wèn)題
  問(wèn)題 1
  以下關(guān)于蜘蛛的說(shuō)法錯誤的是( )。
  A. 蜘蛛是搜索引擎的網(wǎng)絡(luò )爬蟲(chóng)
  灣。每個(gè)搜索引擎蜘蛛都有不同的名稱(chēng)
  C。網(wǎng)站被搜索引擎降級后蜘蛛再也不會(huì )來(lái)這里了網(wǎng)站
  D.站長(cháng)可以通過(guò)技術(shù)等優(yōu)化吸引蜘蛛爬行
  點(diǎn)擊查看答案
  問(wèn)題2
  動(dòng)態(tài) URL 幫助搜索引擎抓取網(wǎng)頁(yè)并提高 網(wǎng)站 排名。()
  點(diǎn)擊查看答案
  問(wèn)題 3
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  A. 小網(wǎng)站
  B. 中小型網(wǎng)站
  C. 大 網(wǎng)站
  D. 中型和大型 網(wǎng)站
  點(diǎn)擊查看答案
  問(wèn)題 4
  HTML版本的網(wǎng)站map只適合搜索引擎蜘蛛抓取,不利于用戶(hù)體驗。()
  點(diǎn)擊查看答案
  問(wèn)題 5
  以下關(guān)于網(wǎng)絡(luò )爬蟲(chóng)的描述是錯誤的()。
  A. 網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)提取網(wǎng)頁(yè)的程序
  B. 為搜索引擎從萬(wàn)維網(wǎng)上下載網(wǎng)頁(yè)是搜索引擎的重要組成部分
  C、爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。
  D.網(wǎng)絡(luò )爬蟲(chóng)的行為與訪(fǎng)問(wèn)網(wǎng)站的人的行為完全不同
  點(diǎn)擊查看答案
  問(wèn)題 6
  如果通過(guò)爬蟲(chóng)抓取某公司網(wǎng)站的公開(kāi)數據,分析后發(fā)現該公司的業(yè)績(jì)非常好。然后將數據或分析結果出售給基金公司,獲得銷(xiāo)售收入。這是合法的。()
  點(diǎn)擊查看答案
  問(wèn)題 7
  網(wǎng)絡(luò )數據采集常用來(lái)通過(guò)()或()的方式從網(wǎng)站獲取數據信息。
  A. 網(wǎng)絡(luò )爬蟲(chóng)
  灣。網(wǎng)站公共 API
  C。手動(dòng)獲取
  點(diǎn)擊查看答案
  問(wèn)題 8
  爬蟲(chóng)是手動(dòng)請求萬(wàn)維網(wǎng)網(wǎng)站并提取網(wǎng)頁(yè)數據的程序()
  點(diǎn)擊查看答案
  問(wèn)題 9
  網(wǎng)絡(luò )數據采集是利用互聯(lián)網(wǎng)搜索引擎技術(shù),有針對性、行業(yè)針對性、準確地抓取數據,并按照一定的規則和篩選標準對數據進(jìn)行分類(lèi),形成數據庫文件的過(guò)程。()
  點(diǎn)擊查看答案
  問(wèn)題 10
  搜索引擎營(yíng)銷(xiāo)主要用于網(wǎng)站推廣,不起到建立網(wǎng)絡(luò )品牌的作用。()
  點(diǎn)擊查看答案 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
二級建造師考試每日一練免費在線(xiàn)測試())
  
  更多《搜索引擎利用網(wǎng)絡(luò )爬蟲(chóng)不斷從網(wǎng)上爬取網(wǎng)站數據,并在本地存儲網(wǎng)站圖片。()》相關(guān)問(wèn)題
  問(wèn)題 1
  以下關(guān)于蜘蛛的說(shuō)法錯誤的是( )。
  A. 蜘蛛是搜索引擎的網(wǎng)絡(luò )爬蟲(chóng)
  灣。每個(gè)搜索引擎蜘蛛都有不同的名稱(chēng)
  C。網(wǎng)站被搜索引擎降級后蜘蛛再也不會(huì )來(lái)這里了網(wǎng)站
  D.站長(cháng)可以通過(guò)技術(shù)等優(yōu)化吸引蜘蛛爬行
  點(diǎn)擊查看答案
  問(wèn)題2
  動(dòng)態(tài) URL 幫助搜索引擎抓取網(wǎng)頁(yè)并提高 網(wǎng)站 排名。()
  點(diǎn)擊查看答案
  問(wèn)題 3
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  大站點(diǎn)優(yōu)先,顧名思義,就是在互聯(lián)網(wǎng)上優(yōu)先抓取()頁(yè)面,是搜索引擎中的一種信息抓取策略。
  A. 小網(wǎng)站
  B. 中小型網(wǎng)站
  C. 大 網(wǎng)站
  D. 中型和大型 網(wǎng)站
  點(diǎn)擊查看答案
  問(wèn)題 4
  HTML版本的網(wǎng)站map只適合搜索引擎蜘蛛抓取,不利于用戶(hù)體驗。()
  點(diǎn)擊查看答案
  問(wèn)題 5
  以下關(guān)于網(wǎng)絡(luò )爬蟲(chóng)的描述是錯誤的()。
  A. 網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)提取網(wǎng)頁(yè)的程序
  B. 為搜索引擎從萬(wàn)維網(wǎng)上下載網(wǎng)頁(yè)是搜索引擎的重要組成部分
  C、爬蟲(chóng)從一個(gè)或多個(gè)初始網(wǎng)頁(yè)的URL開(kāi)始,獲取初始網(wǎng)頁(yè)上的URL。在爬取網(wǎng)頁(yè)的過(guò)程中,不斷地從當前頁(yè)面中提取新的 URL 并放入隊列中,直到滿(mǎn)足系統的某個(gè)停止條件。
  D.網(wǎng)絡(luò )爬蟲(chóng)的行為與訪(fǎng)問(wèn)網(wǎng)站的人的行為完全不同
  點(diǎn)擊查看答案
  問(wèn)題 6
  如果通過(guò)爬蟲(chóng)抓取某公司網(wǎng)站的公開(kāi)數據,分析后發(fā)現該公司的業(yè)績(jì)非常好。然后將數據或分析結果出售給基金公司,獲得銷(xiāo)售收入。這是合法的。()
  點(diǎn)擊查看答案
  問(wèn)題 7
  網(wǎng)絡(luò )數據采集常用來(lái)通過(guò)()或()的方式從網(wǎng)站獲取數據信息。
  A. 網(wǎng)絡(luò )爬蟲(chóng)
  灣。網(wǎng)站公共 API
  C。手動(dòng)獲取
  點(diǎn)擊查看答案
  問(wèn)題 8
  爬蟲(chóng)是手動(dòng)請求萬(wàn)維網(wǎng)網(wǎng)站并提取網(wǎng)頁(yè)數據的程序()
  點(diǎn)擊查看答案
  問(wèn)題 9
  網(wǎng)絡(luò )數據采集是利用互聯(lián)網(wǎng)搜索引擎技術(shù),有針對性、行業(yè)針對性、準確地抓取數據,并按照一定的規則和篩選標準對數據進(jìn)行分類(lèi),形成數據庫文件的過(guò)程。()
  點(diǎn)擊查看答案
  問(wèn)題 10
  搜索引擎營(yíng)銷(xiāo)主要用于網(wǎng)站推廣,不起到建立網(wǎng)絡(luò )品牌的作用。()
  點(diǎn)擊查看答案

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 在爬蟲(chóng)系統中,等待抓取URL隊列是很重要的)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 60 次瀏覽 ? 2022-04-17 16:29 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在爬蟲(chóng)系統中,等待抓取URL隊列是很重要的)
  
  在爬蟲(chóng)系統中,等待爬取的URL隊列是一個(gè)非常重要的部分,而等待爬取的URL隊列中URL的順序也是一個(gè)非常重要的問(wèn)題,因為它會(huì )決定先爬到哪個(gè)頁(yè)面之后再爬取哪個(gè)頁(yè)面。而確定這些URL順序的方法稱(chēng)為爬取策略。下面主要介紹幾種常見(jiàn)的爬取策略:
  1 深度優(yōu)先遍歷策略:深度優(yōu)先遍歷策略是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,每一個(gè)鏈接一次一個(gè)鏈接,直到處理完該行才會(huì )轉到下一個(gè)起始頁(yè),并且繼續關(guān)注鏈接。遍歷路徑為:AFG ,EHI ,B ,C,D
  2 廣度優(yōu)先遍歷策略:廣度優(yōu)先遍歷策略的基本思想是將新下載的網(wǎng)頁(yè)中找到的鏈接直接放在待爬取的URL隊列的末尾。也就是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)會(huì )優(yōu)先抓取起始網(wǎng)頁(yè)中的所有鏈接。爬取完所有網(wǎng)頁(yè)后,選擇其中一個(gè)鏈接的網(wǎng)頁(yè),繼續爬取該網(wǎng)頁(yè)鏈接的所有網(wǎng)頁(yè)。它的路徑可以這樣寫(xiě):ABCDEF ,G ,H,I
  3 外鏈數策略:外鏈數是指一個(gè)網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的鏈接數,外鏈數也表示一個(gè)網(wǎng)頁(yè)的內容被他人推薦的程度. 抓取系統會(huì )使用這個(gè)指標來(lái)評估網(wǎng)頁(yè)的重要性,從而確定不同網(wǎng)頁(yè)的抓取順序。
  但是,在真實(shí)的網(wǎng)絡(luò )環(huán)境中,由于存在很多廣告鏈接、作弊鏈接等,反向鏈接的數量并不能完全等同于重要性。因此,很多搜索引擎經(jīng)常會(huì )考慮一些可靠的反向鏈接。
  4.OPIC策略策略:這個(gè)算法其實(shí)是給網(wǎng)頁(yè)的重要性打分的。在算法開(kāi)始之前,所有頁(yè)面都會(huì )被賦予相同的初始現金(cash)。當一個(gè)頁(yè)面 P 被下載后,將 P 的現金分配給從 P 分析的所有鏈接,并清除 P 的現金。URL隊列中所有待爬取的頁(yè)面,按照現金數量排序。
  5.大站點(diǎn)優(yōu)先策略:對URL隊列中所有待爬取的網(wǎng)頁(yè),按照所屬的網(wǎng)站進(jìn)行分類(lèi)。對于需要下載的頁(yè)面較多的網(wǎng)站,請先下載。這種策略也被稱(chēng)為大站優(yōu)先策略。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在爬蟲(chóng)系統中,等待抓取URL隊列是很重要的)
  
  在爬蟲(chóng)系統中,等待爬取的URL隊列是一個(gè)非常重要的部分,而等待爬取的URL隊列中URL的順序也是一個(gè)非常重要的問(wèn)題,因為它會(huì )決定先爬到哪個(gè)頁(yè)面之后再爬取哪個(gè)頁(yè)面。而確定這些URL順序的方法稱(chēng)為爬取策略。下面主要介紹幾種常見(jiàn)的爬取策略:
  1 深度優(yōu)先遍歷策略:深度優(yōu)先遍歷策略是指網(wǎng)絡(luò )爬蟲(chóng)會(huì )從起始頁(yè)開(kāi)始,每一個(gè)鏈接一次一個(gè)鏈接,直到處理完該行才會(huì )轉到下一個(gè)起始頁(yè),并且繼續關(guān)注鏈接。遍歷路徑為:AFG ,EHI ,B ,C,D
  2 廣度優(yōu)先遍歷策略:廣度優(yōu)先遍歷策略的基本思想是將新下載的網(wǎng)頁(yè)中找到的鏈接直接放在待爬取的URL隊列的末尾。也就是說(shuō),網(wǎng)絡(luò )爬蟲(chóng)會(huì )優(yōu)先抓取起始網(wǎng)頁(yè)中的所有鏈接。爬取完所有網(wǎng)頁(yè)后,選擇其中一個(gè)鏈接的網(wǎng)頁(yè),繼續爬取該網(wǎng)頁(yè)鏈接的所有網(wǎng)頁(yè)。它的路徑可以這樣寫(xiě):ABCDEF ,G ,H,I
  3 外鏈數策略:外鏈數是指一個(gè)網(wǎng)頁(yè)被其他網(wǎng)頁(yè)指向的鏈接數,外鏈數也表示一個(gè)網(wǎng)頁(yè)的內容被他人推薦的程度. 抓取系統會(huì )使用這個(gè)指標來(lái)評估網(wǎng)頁(yè)的重要性,從而確定不同網(wǎng)頁(yè)的抓取順序。
  但是,在真實(shí)的網(wǎng)絡(luò )環(huán)境中,由于存在很多廣告鏈接、作弊鏈接等,反向鏈接的數量并不能完全等同于重要性。因此,很多搜索引擎經(jīng)常會(huì )考慮一些可靠的反向鏈接。
  4.OPIC策略策略:這個(gè)算法其實(shí)是給網(wǎng)頁(yè)的重要性打分的。在算法開(kāi)始之前,所有頁(yè)面都會(huì )被賦予相同的初始現金(cash)。當一個(gè)頁(yè)面 P 被下載后,將 P 的現金分配給從 P 分析的所有鏈接,并清除 P 的現金。URL隊列中所有待爬取的頁(yè)面,按照現金數量排序。
  5.大站點(diǎn)優(yōu)先策略:對URL隊列中所有待爬取的網(wǎng)頁(yè),按照所屬的網(wǎng)站進(jìn)行分類(lèi)。對于需要下載的頁(yè)面較多的網(wǎng)站,請先下載。這種策略也被稱(chēng)為大站優(yōu)先策略。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(農村最恐怖的還是螞蝗,它無(wú)處不在吸你多少血了)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 46 次瀏覽 ? 2022-04-15 06:33 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(農村最恐怖的還是螞蝗,它無(wú)處不在吸你多少血了)
  農村最可怕的就是水蛭,到處都是。當它無(wú)意識地咬你,當你感覺(jué)到它。我不知道我從你身上吸了多少血,也吸不出來(lái)。你要拍它才肯下來(lái),這東西更可怕。只是不容易死。你把它分成幾段。
  它也不會(huì )死,記得我小時(shí)候。我們的幾個(gè)朋友去堰和池塘洗澡。沒(méi)學(xué)過(guò)游泳,只是邊玩邊玩。洗漱完畢,上岸。他的屁股上有一只巨大的水蛭,嚇得他哭了。這東西吸血,太可怕了,惡心。農村的大人小孩都害怕。
  尤其是女孩子,她們的父母讓她幫忙種水稻。先問(wèn)有沒(méi)有螞蟥,殺了就不去了。大人就好了,習慣就好。如果你看到幾個(gè)耳光,就一拍即合。我們小時(shí)候被咬過(guò)很多次,很多次。我倒不是太害怕,我只是看到自己吸了那么多血。
  有點(diǎn)疼,現在稻田里沒(méi)有那么多水蛭了。稻谷是用收割機收割的,是時(shí)候收割了。在收割機下田收割之前,必須排干稻田中的所有水。沒(méi)有水,水蛭就會(huì )減少。動(dòng)物只有在有水的情況下才能吸血。我希望這東西可以滅絕。
  python爬蟲(chóng)是怎么做的?
  從各種搜索引擎到日常小數據采集,都離不開(kāi)網(wǎng)絡(luò )爬蟲(chóng)。爬蟲(chóng)的基本原理很簡(jiǎn)單。它遍歷網(wǎng)絡(luò )中的網(wǎng)頁(yè)并抓取感興趣的數據內容。本篇文章將介紹如何編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)從零開(kāi)始爬取數據,進(jìn)而逐步完善爬蟲(chóng)的爬取功能。
  工具安裝
  我們需要安裝python、python的requests和BeautifulSoup庫。我們使用 Requests 庫來(lái)抓取網(wǎng)頁(yè)內容,并使用 BeautifulSoup 庫從網(wǎng)頁(yè)中提取數據。
  安裝蟒蛇
  運行 pip 安裝請求
  運行 pip install BeautifulSoup
  爬網(wǎng)
  完成必要工具的安裝后,我們就正式開(kāi)始編寫(xiě)我們的爬蟲(chóng)了。我們的首要任務(wù)是抓取豆瓣上的所有圖書(shū)信息。我們以它為例,首先看一下如何爬取網(wǎng)頁(yè)的內容。
  使用python的requests提供的get()方法,我們可以很方便的獲取到指定網(wǎng)頁(yè)的內容。代碼如下:
  提取內容
  爬取網(wǎng)頁(yè)內容后,我們要做的就是提取我們想要的內容。在我們的第一個(gè)示例中,我們只需要提取書(shū)名。首先,我們導入 BeautifulSoup 庫。使用 BeautifulSoup,我們可以輕松提取網(wǎng)頁(yè)的具體內容。
  連續爬網(wǎng)
  至此,我們已經(jīng)可以爬取單個(gè)頁(yè)面的內容了,下面我們來(lái)看看如何爬取整個(gè)網(wǎng)站的內容。我們知道網(wǎng)頁(yè)是通過(guò)超鏈接相互連接的,通過(guò)超鏈接我們可以訪(fǎng)問(wèn)整個(gè)網(wǎng)絡(luò )。所以我們可以從每個(gè)頁(yè)面中提取到其他頁(yè)面的鏈接,然后反復爬取新的鏈接。
  通過(guò)以上步驟,我們就可以寫(xiě)出一個(gè)最原創(chuàng )的爬蟲(chóng)了。在了解爬蟲(chóng)原理的基礎上,我們可以進(jìn)一步完善爬蟲(chóng)。
  寫(xiě)了一個(gè)關(guān)于爬蟲(chóng)的系列文章:。如果你有興趣,你可以去看看。
  Python基礎環(huán)境搭建、爬蟲(chóng)基本原理及爬蟲(chóng)原型
  Python 爬蟲(chóng)入門(mén)(第 1 部分)
  如何使用 BeautifulSoup 提取網(wǎng)頁(yè)內容
  Python 爬蟲(chóng)入門(mén)(第 2 部分)
  爬蟲(chóng)運行時(shí)數據的存儲數據,以 SQLite 和 MySQL 為例
  Python 爬蟲(chóng)入門(mén)(第 3 部分)
  使用 selenium webdriver 抓取動(dòng)態(tài)網(wǎng)頁(yè)
  Python 爬蟲(chóng)入門(mén)(第 4 部分)
  討論了如何處理網(wǎng)站的反爬策略
  Python 爬蟲(chóng)入門(mén)(第 5 部分)
  介紹了Python的Scrapy爬蟲(chóng)框架,并簡(jiǎn)要演示了如何在Scrapy下開(kāi)發(fā)
  Python 爬蟲(chóng)入門(mén)(第 6 部分) 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(農村最恐怖的還是螞蝗,它無(wú)處不在吸你多少血了)
  農村最可怕的就是水蛭,到處都是。當它無(wú)意識地咬你,當你感覺(jué)到它。我不知道我從你身上吸了多少血,也吸不出來(lái)。你要拍它才肯下來(lái),這東西更可怕。只是不容易死。你把它分成幾段。
  它也不會(huì )死,記得我小時(shí)候。我們的幾個(gè)朋友去堰和池塘洗澡。沒(méi)學(xué)過(guò)游泳,只是邊玩邊玩。洗漱完畢,上岸。他的屁股上有一只巨大的水蛭,嚇得他哭了。這東西吸血,太可怕了,惡心。農村的大人小孩都害怕。
  尤其是女孩子,她們的父母讓她幫忙種水稻。先問(wèn)有沒(méi)有螞蟥,殺了就不去了。大人就好了,習慣就好。如果你看到幾個(gè)耳光,就一拍即合。我們小時(shí)候被咬過(guò)很多次,很多次。我倒不是太害怕,我只是看到自己吸了那么多血。
  有點(diǎn)疼,現在稻田里沒(méi)有那么多水蛭了。稻谷是用收割機收割的,是時(shí)候收割了。在收割機下田收割之前,必須排干稻田中的所有水。沒(méi)有水,水蛭就會(huì )減少。動(dòng)物只有在有水的情況下才能吸血。我希望這東西可以滅絕。
  python爬蟲(chóng)是怎么做的?
  從各種搜索引擎到日常小數據采集,都離不開(kāi)網(wǎng)絡(luò )爬蟲(chóng)。爬蟲(chóng)的基本原理很簡(jiǎn)單。它遍歷網(wǎng)絡(luò )中的網(wǎng)頁(yè)并抓取感興趣的數據內容。本篇文章將介紹如何編寫(xiě)一個(gè)網(wǎng)絡(luò )爬蟲(chóng)從零開(kāi)始爬取數據,進(jìn)而逐步完善爬蟲(chóng)的爬取功能。
  工具安裝
  我們需要安裝python、python的requests和BeautifulSoup庫。我們使用 Requests 庫來(lái)抓取網(wǎng)頁(yè)內容,并使用 BeautifulSoup 庫從網(wǎng)頁(yè)中提取數據。
  安裝蟒蛇
  運行 pip 安裝請求
  運行 pip install BeautifulSoup
  爬網(wǎng)
  完成必要工具的安裝后,我們就正式開(kāi)始編寫(xiě)我們的爬蟲(chóng)了。我們的首要任務(wù)是抓取豆瓣上的所有圖書(shū)信息。我們以它為例,首先看一下如何爬取網(wǎng)頁(yè)的內容。
  使用python的requests提供的get()方法,我們可以很方便的獲取到指定網(wǎng)頁(yè)的內容。代碼如下:
  提取內容
  爬取網(wǎng)頁(yè)內容后,我們要做的就是提取我們想要的內容。在我們的第一個(gè)示例中,我們只需要提取書(shū)名。首先,我們導入 BeautifulSoup 庫。使用 BeautifulSoup,我們可以輕松提取網(wǎng)頁(yè)的具體內容。
  連續爬網(wǎng)
  至此,我們已經(jīng)可以爬取單個(gè)頁(yè)面的內容了,下面我們來(lái)看看如何爬取整個(gè)網(wǎng)站的內容。我們知道網(wǎng)頁(yè)是通過(guò)超鏈接相互連接的,通過(guò)超鏈接我們可以訪(fǎng)問(wèn)整個(gè)網(wǎng)絡(luò )。所以我們可以從每個(gè)頁(yè)面中提取到其他頁(yè)面的鏈接,然后反復爬取新的鏈接。
  通過(guò)以上步驟,我們就可以寫(xiě)出一個(gè)最原創(chuàng )的爬蟲(chóng)了。在了解爬蟲(chóng)原理的基礎上,我們可以進(jìn)一步完善爬蟲(chóng)。
  寫(xiě)了一個(gè)關(guān)于爬蟲(chóng)的系列文章:。如果你有興趣,你可以去看看。
  Python基礎環(huán)境搭建、爬蟲(chóng)基本原理及爬蟲(chóng)原型
  Python 爬蟲(chóng)入門(mén)(第 1 部分)
  如何使用 BeautifulSoup 提取網(wǎng)頁(yè)內容
  Python 爬蟲(chóng)入門(mén)(第 2 部分)
  爬蟲(chóng)運行時(shí)數據的存儲數據,以 SQLite 和 MySQL 為例
  Python 爬蟲(chóng)入門(mén)(第 3 部分)
  使用 selenium webdriver 抓取動(dòng)態(tài)網(wǎng)頁(yè)
  Python 爬蟲(chóng)入門(mén)(第 4 部分)
  討論了如何處理網(wǎng)站的反爬策略
  Python 爬蟲(chóng)入門(mén)(第 5 部分)
  介紹了Python的Scrapy爬蟲(chóng)框架,并簡(jiǎn)要演示了如何在Scrapy下開(kāi)發(fā)
  Python 爬蟲(chóng)入門(mén)(第 6 部分)

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(imarowadtencc語(yǔ)言treefindall抓取國家面積數據的方法-蘇州安嘉)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-04-15 06:09 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(imarowadtencc語(yǔ)言treefindall抓取國家面積數據的方法-蘇州安嘉)
  標簽: imarowadtencc 語(yǔ)言 treefindall 將是新版本
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  ? 如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  ?當我們使用正則表達式抓取國家地區數據時(shí),我們首先嘗試匹配元素中的內容,像這樣:
  >>> import re
>>> import urllib2
>>> url = ‘http://example.webscraping.com ... m-239‘
>>> html = urllib2.urlopen(url).read()
>>> re.findall(‘(.*?)‘, html)
[‘‘, ‘244,820 square kilometres‘, ‘62,348,447‘, ‘GB‘, ‘United Kingdom‘, ‘London‘, ‘EU‘, ‘.uk‘, ‘GBP‘, ‘Pound‘, ‘44‘, ‘@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA‘, ‘^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$‘, ‘en-GB,cy-GB,gd‘, ‘IE ‘]
>>>
  ? 從以上結果可以看出,&lt;td class=”w2p_fw” &gt; 標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall(‘(.*?)‘, html)[1]
‘244,820 square kilometres‘
  ? 雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素 &lt;tr&gt;。由于元素具有 ID 屬性,因此它應該是唯一的。
  &gt;&gt;&gt; re.findall('Area: (.*?)', html)['244820平方公里'] Python爬蟲(chóng)三種網(wǎng)絡(luò )爬取方式的性能對比 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(imarowadtencc語(yǔ)言treefindall抓取國家面積數據的方法-蘇州安嘉)
  標簽: imarowadtencc 語(yǔ)言 treefindall 將是新版本
  下面我們將介紹三種抓取網(wǎng)頁(yè)數據的方法,首先是正則表達式,然后是流行的 BeautifulSoup 模塊,最后是強大的 lxml 模塊。
  1. 正則表達式
  ? 如果您是正則表達式的新手,或者需要一些提示,請查看正則表達式 HOWTO 以獲得完整的介紹。
  ?當我們使用正則表達式抓取國家地區數據時(shí),我們首先嘗試匹配元素中的內容,像這樣:
  >>> import re
>>> import urllib2
>>> url = ‘http://example.webscraping.com ... m-239
>>> html = urllib2.urlopen(url).read()
>>> re.findall(‘(.*?)‘, html)
[‘‘, ‘244,820 square kilometres‘, ‘62,348,447‘, ‘GB‘, ‘United Kingdom‘, ‘London‘, ‘EU‘, ‘.uk‘, ‘GBP‘, ‘Pound‘, ‘44‘, ‘@# #@@|@## #@@|@@# #@@|@@## #@@|@#@ #@@|@@#@ #@@|GIR0AA‘, ‘^(([A-Z]\\d{2}[A-Z]{2})|([A-Z]\\d{3}[A-Z]{2})|([A-Z]{2}\\d{2}[A-Z]{2})|([A-Z]{2}\\d{3}[A-Z]{2})|([A-Z]\\d[A-Z]\\d[A-Z]{2})|([A-Z]{2}\\d[A-Z]\\d[A-Z]{2})|(GIR0AA))$‘, ‘en-GB,cy-GB,gd‘, ‘IE ‘]
>>>
  ? 從以上結果可以看出,&lt;td class=”w2p_fw” &gt; 標簽用于多個(gè)國家屬性。要隔離 area 屬性,我們只需選擇其中的第二個(gè)元素,如下所示:
  >>> re.findall(‘(.*?)‘, html)[1]
‘244,820 square kilometres‘
  ? 雖然這個(gè)方案現在可用,但如果頁(yè)面發(fā)生變化,它很可能會(huì )失敗。例如,該表已更改為刪除第二行中的土地面積數據。如果我們現在只抓取數據,我們可以忽略這種未來(lái)可能發(fā)生的變化。但是,如果我們以后想再次獲取這些數據,我們需要一個(gè)更健壯的解決方案,盡可能避免這種布局更改的影響。為了使正則表達式更加健壯,我們也可以添加它的父元素 &lt;tr&gt;。由于元素具有 ID 屬性,因此它應該是唯一的。
  &gt;&gt;&gt; re.findall('Area: (.*?)', html)['244820平方公里'] Python爬蟲(chóng)三種網(wǎng)絡(luò )爬取方式的性能對比

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(我組開(kāi)發(fā)遺留下來(lái)的分類(lèi)保存到的文件和扒取)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-04-14 14:01 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(我組開(kāi)發(fā)遺留下來(lái)的分類(lèi)保存到的文件和扒取)
  2021-09-27
  需要:
  我們組的研究課題是編寫(xiě)一個(gè)更實(shí)用的爬蟲(chóng)軟件,將其應用到一些前輩的代碼中,并在此基礎上進(jìn)行完善和創(chuàng )新。
  鑒于高級代碼已經(jīng)實(shí)現了基本功能,即從網(wǎng)站中爬取相關(guān)Word文檔和其他計算機相關(guān)文件資料,過(guò)濾掉無(wú)關(guān)信息。我組將從以下幾個(gè)方面著(zhù)手改進(jìn)和完善:
  1.增強的去廣告功能:
  如今的網(wǎng)頁(yè)情況,很多網(wǎng)頁(yè),包括貼吧、微博都充斥著(zhù)廣告,其中一些不可避免地與電腦有關(guān),但這些廣告的作用并沒(méi)有實(shí)際意義。高級代碼中確實(shí)有相應的刪除廣告的功能,但效果并不明顯。在很多情況下,無(wú)法識別網(wǎng)絡(luò )廣告和實(shí)際有用的信息,因此會(huì )出現一些數據浪費或數據丟失。. 針對這種情況,我們小組決定對其廣告過(guò)濾功能進(jìn)行改進(jìn)和修改。
  2.按類(lèi)別保存提取的文件:
  對爬蟲(chóng)抓取的數據進(jìn)行分類(lèi)非常重要。學(xué)長(cháng)的代碼中,獲取的數據沒(méi)有入庫分類(lèi)存儲,給下一組的開(kāi)發(fā)留下了一些問(wèn)題。,我組研究后認為應該增加保存黨的分類(lèi)的功能。
  3.添加視頻采集功能:
  前輩的代碼只實(shí)現了部分文本文件的提取,并沒(méi)有進(jìn)行視頻數據的提取。但是由于網(wǎng)上很多視頻都有相應的版權問(wèn)題,而且大部分視頻占用了很大的硬盤(pán)容量,所以我們會(huì )抓取視頻的地址并存入數據庫。
  4.CSS 和 Javascript網(wǎng)站:
  在原創(chuàng )代碼中,只能抓取 HTTP6 網(wǎng)頁(yè)。我們認為數據采集將過(guò)于有限。因此,我們想在這個(gè)問(wèn)題中加入 CSS 和 Javascript 網(wǎng)站 的抓取功能。生成大量的代碼工作量,只是一個(gè)初步的想法。
  5.網(wǎng)頁(yè)質(zhì)量判斷:
  有些網(wǎng)站由于缺乏相關(guān)的和計算機知識的內容,重復搜索只會(huì )造成時(shí)間和資源的浪費。針對這種情況,我們認為應該增加一個(gè)判斷網(wǎng)頁(yè)質(zhì)量的功能,把不合適的網(wǎng)站去掉,提高軟件運行效率。
  方法(實(shí)踐):
  1.對于抓取到的網(wǎng)站,獲取URL,查看下一級網(wǎng)站的AD字段以及下一級網(wǎng)站與關(guān)鍵字的關(guān)聯(lián)度
  上學(xué)年對這個(gè)項目的評測中,去廣告的功能并不完善,還夾雜了很多廣告。他們在博客上寫(xiě)道,說(shuō)是根據AD領(lǐng)域來(lái)判斷這是否網(wǎng)站 是一個(gè)廣告網(wǎng)站。我們覺(jué)得如果只根據AD字段來(lái)判斷,有可能在網(wǎng)站中間的網(wǎng)站中抓取一些無(wú)用的廣告。因此,我們覺(jué)得應該再往下檢查一級。如果下一級網(wǎng)站中有??很多廣告網(wǎng)站,則排除這個(gè)網(wǎng)站。因為我們考慮到如果投放了一個(gè)廣告,最多會(huì )經(jīng)過(guò)一次網(wǎng)站傳輸,否則廣告投放是不會(huì )生效的。因此,我們考慮多一個(gè)檢測級別的方法,這應該可以在很大程度上解決問(wèn)題。得到的網(wǎng)站中的廣告有很多問(wèn)題。
  2.抓取的不同文件會(huì )根據文件格式的不同分別保存(先按文件夾分開(kāi))
  捕獲的 網(wǎng)站 根據它們與關(guān)鍵字的相關(guān)性進(jìn)行分級和排序。上學(xué)年項目負責組評價(jià)寫(xiě)道,該組抓到的文件沒(méi)有分類(lèi),所有文件都混在一起,給用戶(hù)使用帶來(lái)不便。我們想在這個(gè)軟件中添加一個(gè)對捕獲的文件進(jìn)行分類(lèi)和存儲的功能。當某個(gè)文件被抓取時(shí),會(huì )根據文件的類(lèi)型,將其放置在該文件所在的存儲區域中,從而完成軟件運行。之后得到分類(lèi)文件,方便用戶(hù)使用。
  3.提供視頻鏈接,以便用戶(hù)觀(guān)看源視頻
  上一組沒(méi)有完成相關(guān)視頻的爬取功能。我們認為,如果它是一個(gè)網(wǎng)絡(luò )爬蟲(chóng),它的初衷是為互聯(lián)網(wǎng)上的用戶(hù)爬取有用的資源,而現在視頻資源也很重要。因此,我們要增加視頻捕捉功能。與內容和關(guān)鍵詞相關(guān)的視頻也會(huì )反饋給用戶(hù),以便用戶(hù)觀(guān)看相關(guān)視頻。
  4.CSS 和 Javascript網(wǎng)站
  暫定。
  5.檢查關(guān)鍵詞是否出現在被捕獲的網(wǎng)站或者文件的標題中,如果在被捕獲的網(wǎng)站或者文件的文本中頻繁出現,用這個(gè)來(lái)判斷此 網(wǎng)站 或文件的值給用戶(hù)
  我們認為,如果我們抓取其中出現關(guān)鍵詞的所有資源,我們可能會(huì )抓取一些網(wǎng)站或不相關(guān)但出現關(guān)鍵詞的文件,但在排除網(wǎng)站@之后&gt; 以及對用戶(hù)來(lái)說(shuō)價(jià)值不大的文件,通過(guò)以上方法,我們抓取的東西質(zhì)量會(huì )大大提高。
  好處(好處):
  1.能夠更好地從結果中去除廣告網(wǎng)站,優(yōu)化用戶(hù)體驗
  去除廣告是我們爬蟲(chóng)非常重要的功能。爬蟲(chóng)的初衷是為用戶(hù)高效地爬取互聯(lián)網(wǎng)上有用的相關(guān)資源。如果可爬取資源中有大量的廣告,會(huì )讓用戶(hù)的瀏覽很不方便,也就失去了爬蟲(chóng)的意義。. 我們將檢查到下一個(gè)級別網(wǎng)站,并使用此方法排除廣告網(wǎng)站。這樣可以提高抓取資源的質(zhì)量,用戶(hù)可以更方便的使用爬蟲(chóng)的功能。
  2.讓用戶(hù)更容易找到資源
  如果爬蟲(chóng)把所有抓取到的資源放在一起,當用戶(hù)需要一個(gè)格式單一的文件時(shí)會(huì )很麻煩。我們將采集到的資源按照類(lèi)型分別保存,讓用戶(hù)可以更方便的使用軟件,獲得更好的用戶(hù)體驗。
  3.讓用戶(hù)可以觀(guān)看相關(guān)視頻
  這是一個(gè)全新的功能。之前的版本無(wú)法采集視頻資源。雖然由于版權原因我們無(wú)法完全下載視頻,但我們可以為用戶(hù)提供源視頻的鏈接,以便用戶(hù)觀(guān)看?,F在互聯(lián)網(wǎng)上有很多資源以視頻的形式存在。我們加入這個(gè)功能是為了讓這個(gè)軟件更實(shí)用,更能滿(mǎn)足用戶(hù)不斷增長(cháng)的需求。
  4.不限于HTML5網(wǎng)站,可以獲得更多資源(暫定)
  目前的版本只能爬取HTML5的網(wǎng)站,但是網(wǎng)站里面也有很多有用的資源是用javascript或者css的。我們更新了這個(gè)軟件,支持javascript和css,可以讓爬蟲(chóng)抓取更多的資源,為用戶(hù)提供更多的服務(wù)。
  5.提高采集結果的質(zhì)量,增加剔除低質(zhì)量資源的功能(暫定)
  如果只關(guān)注捕獲文件的數量和網(wǎng)站,可能會(huì )導致捕獲文件和網(wǎng)站的質(zhì)量很差,但是會(huì )減少結果中有用的文件和網(wǎng)站里面的成分讓用戶(hù)體驗更差。我們將通過(guò)檢測關(guān)鍵詞是否出現在其標題及其出現頻率等方法來(lái)確定該文件或網(wǎng)站對用戶(hù)的價(jià)值。如果值不高,那么這個(gè)文件或 網(wǎng)站 @> 被排除。這將使我們能夠抓取更高質(zhì)量的文件和 網(wǎng)站。
  競爭對手:
  網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)獲取網(wǎng)頁(yè)內容的程序,是搜索引擎的重要組成部分?,F在的搜索引擎基本上都涉及到爬蟲(chóng)的設計和優(yōu)化。搜索引擎的速度也與爬蟲(chóng)的優(yōu)化程度密切相關(guān)。從另一個(gè)角度來(lái)看,不僅僅是搜索引擎,所有的數據挖掘軟件都會(huì )涉及到爬蟲(chóng)。因此,爬蟲(chóng)在整個(gè)軟件行業(yè)的地位很高,應用范圍非常廣泛。這里我們主要通過(guò)搜索引擎中的爬蟲(chóng)來(lái)分析競爭。
  首先,拿兩個(gè)最常用的搜索引擎:百度和谷歌。從爬取信息來(lái)看,兩者都是行業(yè)的佼佼者,爬取算法也很不錯,可以按類(lèi)型分類(lèi)。,以方便用戶(hù)操作。它爬取整個(gè)萬(wàn)維網(wǎng)的速度非???。雖然我們的軟件在速度和爬取算法方面還不是很成熟,但是我們的軟件會(huì )為了方便用戶(hù)而設計。我們會(huì )檢查爬取文件的匹配度,對它們的優(yōu)先級進(jìn)行排序。這也將大大提高用戶(hù)體驗的質(zhì)量。我將從以下幾個(gè)方面來(lái)討論我們軟件的競爭力。
  1.爬行速度和爬行負載,這也是衡量爬蟲(chóng)的標準
  與其他軟件相比,我們的軟件在速度上還不錯。我們通過(guò)廣度優(yōu)先的搜索順序進(jìn)行搜索,可以提高爬蟲(chóng)的爬取速度。同時(shí),我們使用多個(gè)隊列進(jìn)行數據處理,這也使得爬蟲(chóng)可以同時(shí)處理多個(gè)數據。分組數據,承載能力更強。
  2.爬取質(zhì)量和特異性
  很多網(wǎng)站爬蟲(chóng)爬取給定URL中的所有內容,不僅影響爬取內容的質(zhì)量,還拖慢了預算。我們的爬蟲(chóng)會(huì )專(zhuān)門(mén)爬取電腦相關(guān)的數據,讓爬取的內容更符合用戶(hù)的需求。同時(shí)我們會(huì )對廣告進(jìn)行處理,也可以讓爬蟲(chóng)的爬取質(zhì)量更高。同時(shí),我們會(huì )在爬取時(shí)與關(guān)鍵詞進(jìn)行匹配比較,可以大大減少廣告和無(wú)關(guān)信息。
  3.分類(lèi)存儲
  用戶(hù)的下一步操作可能會(huì )使用不同類(lèi)型的數據。爬蟲(chóng)會(huì )在爬取過(guò)程中輕松對數據進(jìn)行分類(lèi)。分類(lèi)可以讓用戶(hù)獲得更好的用戶(hù)體驗,讓用戶(hù)在搜索的過(guò)程中可以更快的找到自己需要的信息。這應該更受程序員的歡迎。
  4.接口與實(shí)現
  用戶(hù)在獲取爬蟲(chóng)時(shí),需要知道爬蟲(chóng)的輸出形式和爬取速度,這就需要我們設計一個(gè)簡(jiǎn)單的接口來(lái)實(shí)現。我們的界面將以最簡(jiǎn)單的方式將輸出呈現給用戶(hù),這將非常直觀(guān)。
  5.創(chuàng )新功能
  我們將為原創(chuàng )爬蟲(chóng)添加新功能。比如抓取視頻文件時(shí),我們會(huì )將視頻地址反饋給用戶(hù)。這允許用戶(hù)直接通過(guò)地址觀(guān)看視頻。此外,我們還計劃實(shí)現不限于 html5 網(wǎng)頁(yè)的爬取,甚至嘗試爬取 CSS 或 javascript。這樣可以更方便用戶(hù)操作。
  分類(lèi):
  技術(shù)要點(diǎn):
  相關(guān)文章: 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(我組開(kāi)發(fā)遺留下來(lái)的分類(lèi)保存到的文件和扒取)
  2021-09-27
  需要:
  我們組的研究課題是編寫(xiě)一個(gè)更實(shí)用的爬蟲(chóng)軟件,將其應用到一些前輩的代碼中,并在此基礎上進(jìn)行完善和創(chuàng )新。
  鑒于高級代碼已經(jīng)實(shí)現了基本功能,即從網(wǎng)站中爬取相關(guān)Word文檔和其他計算機相關(guān)文件資料,過(guò)濾掉無(wú)關(guān)信息。我組將從以下幾個(gè)方面著(zhù)手改進(jìn)和完善:
  1.增強的去廣告功能:
  如今的網(wǎng)頁(yè)情況,很多網(wǎng)頁(yè),包括貼吧、微博都充斥著(zhù)廣告,其中一些不可避免地與電腦有關(guān),但這些廣告的作用并沒(méi)有實(shí)際意義。高級代碼中確實(shí)有相應的刪除廣告的功能,但效果并不明顯。在很多情況下,無(wú)法識別網(wǎng)絡(luò )廣告和實(shí)際有用的信息,因此會(huì )出現一些數據浪費或數據丟失。. 針對這種情況,我們小組決定對其廣告過(guò)濾功能進(jìn)行改進(jìn)和修改。
  2.按類(lèi)別保存提取的文件:
  對爬蟲(chóng)抓取的數據進(jìn)行分類(lèi)非常重要。學(xué)長(cháng)的代碼中,獲取的數據沒(méi)有入庫分類(lèi)存儲,給下一組的開(kāi)發(fā)留下了一些問(wèn)題。,我組研究后認為應該增加保存黨的分類(lèi)的功能。
  3.添加視頻采集功能:
  前輩的代碼只實(shí)現了部分文本文件的提取,并沒(méi)有進(jìn)行視頻數據的提取。但是由于網(wǎng)上很多視頻都有相應的版權問(wèn)題,而且大部分視頻占用了很大的硬盤(pán)容量,所以我們會(huì )抓取視頻的地址并存入數據庫。
  4.CSS 和 Javascript網(wǎng)站:
  在原創(chuàng )代碼中,只能抓取 HTTP6 網(wǎng)頁(yè)。我們認為數據采集將過(guò)于有限。因此,我們想在這個(gè)問(wèn)題中加入 CSS 和 Javascript 網(wǎng)站 的抓取功能。生成大量的代碼工作量,只是一個(gè)初步的想法。
  5.網(wǎng)頁(yè)質(zhì)量判斷:
  有些網(wǎng)站由于缺乏相關(guān)的和計算機知識的內容,重復搜索只會(huì )造成時(shí)間和資源的浪費。針對這種情況,我們認為應該增加一個(gè)判斷網(wǎng)頁(yè)質(zhì)量的功能,把不合適的網(wǎng)站去掉,提高軟件運行效率。
  方法(實(shí)踐):
  1.對于抓取到的網(wǎng)站,獲取URL,查看下一級網(wǎng)站的AD字段以及下一級網(wǎng)站與關(guān)鍵字的關(guān)聯(lián)度
  上學(xué)年對這個(gè)項目的評測中,去廣告的功能并不完善,還夾雜了很多廣告。他們在博客上寫(xiě)道,說(shuō)是根據AD領(lǐng)域來(lái)判斷這是否網(wǎng)站 是一個(gè)廣告網(wǎng)站。我們覺(jué)得如果只根據AD字段來(lái)判斷,有可能在網(wǎng)站中間的網(wǎng)站中抓取一些無(wú)用的廣告。因此,我們覺(jué)得應該再往下檢查一級。如果下一級網(wǎng)站中有??很多廣告網(wǎng)站,則排除這個(gè)網(wǎng)站。因為我們考慮到如果投放了一個(gè)廣告,最多會(huì )經(jīng)過(guò)一次網(wǎng)站傳輸,否則廣告投放是不會(huì )生效的。因此,我們考慮多一個(gè)檢測級別的方法,這應該可以在很大程度上解決問(wèn)題。得到的網(wǎng)站中的廣告有很多問(wèn)題。
  2.抓取的不同文件會(huì )根據文件格式的不同分別保存(先按文件夾分開(kāi))
  捕獲的 網(wǎng)站 根據它們與關(guān)鍵字的相關(guān)性進(jìn)行分級和排序。上學(xué)年項目負責組評價(jià)寫(xiě)道,該組抓到的文件沒(méi)有分類(lèi),所有文件都混在一起,給用戶(hù)使用帶來(lái)不便。我們想在這個(gè)軟件中添加一個(gè)對捕獲的文件進(jìn)行分類(lèi)和存儲的功能。當某個(gè)文件被抓取時(shí),會(huì )根據文件的類(lèi)型,將其放置在該文件所在的存儲區域中,從而完成軟件運行。之后得到分類(lèi)文件,方便用戶(hù)使用。
  3.提供視頻鏈接,以便用戶(hù)觀(guān)看源視頻
  上一組沒(méi)有完成相關(guān)視頻的爬取功能。我們認為,如果它是一個(gè)網(wǎng)絡(luò )爬蟲(chóng),它的初衷是為互聯(lián)網(wǎng)上的用戶(hù)爬取有用的資源,而現在視頻資源也很重要。因此,我們要增加視頻捕捉功能。與內容和關(guān)鍵詞相關(guān)的視頻也會(huì )反饋給用戶(hù),以便用戶(hù)觀(guān)看相關(guān)視頻。
  4.CSS 和 Javascript網(wǎng)站
  暫定。
  5.檢查關(guān)鍵詞是否出現在被捕獲的網(wǎng)站或者文件的標題中,如果在被捕獲的網(wǎng)站或者文件的文本中頻繁出現,用這個(gè)來(lái)判斷此 網(wǎng)站 或文件的值給用戶(hù)
  我們認為,如果我們抓取其中出現關(guān)鍵詞的所有資源,我們可能會(huì )抓取一些網(wǎng)站或不相關(guān)但出現關(guān)鍵詞的文件,但在排除網(wǎng)站@之后&gt; 以及對用戶(hù)來(lái)說(shuō)價(jià)值不大的文件,通過(guò)以上方法,我們抓取的東西質(zhì)量會(huì )大大提高。
  好處(好處):
  1.能夠更好地從結果中去除廣告網(wǎng)站,優(yōu)化用戶(hù)體驗
  去除廣告是我們爬蟲(chóng)非常重要的功能。爬蟲(chóng)的初衷是為用戶(hù)高效地爬取互聯(lián)網(wǎng)上有用的相關(guān)資源。如果可爬取資源中有大量的廣告,會(huì )讓用戶(hù)的瀏覽很不方便,也就失去了爬蟲(chóng)的意義。. 我們將檢查到下一個(gè)級別網(wǎng)站,并使用此方法排除廣告網(wǎng)站。這樣可以提高抓取資源的質(zhì)量,用戶(hù)可以更方便的使用爬蟲(chóng)的功能。
  2.讓用戶(hù)更容易找到資源
  如果爬蟲(chóng)把所有抓取到的資源放在一起,當用戶(hù)需要一個(gè)格式單一的文件時(shí)會(huì )很麻煩。我們將采集到的資源按照類(lèi)型分別保存,讓用戶(hù)可以更方便的使用軟件,獲得更好的用戶(hù)體驗。
  3.讓用戶(hù)可以觀(guān)看相關(guān)視頻
  這是一個(gè)全新的功能。之前的版本無(wú)法采集視頻資源。雖然由于版權原因我們無(wú)法完全下載視頻,但我們可以為用戶(hù)提供源視頻的鏈接,以便用戶(hù)觀(guān)看?,F在互聯(lián)網(wǎng)上有很多資源以視頻的形式存在。我們加入這個(gè)功能是為了讓這個(gè)軟件更實(shí)用,更能滿(mǎn)足用戶(hù)不斷增長(cháng)的需求。
  4.不限于HTML5網(wǎng)站,可以獲得更多資源(暫定)
  目前的版本只能爬取HTML5的網(wǎng)站,但是網(wǎng)站里面也有很多有用的資源是用javascript或者css的。我們更新了這個(gè)軟件,支持javascript和css,可以讓爬蟲(chóng)抓取更多的資源,為用戶(hù)提供更多的服務(wù)。
  5.提高采集結果的質(zhì)量,增加剔除低質(zhì)量資源的功能(暫定)
  如果只關(guān)注捕獲文件的數量和網(wǎng)站,可能會(huì )導致捕獲文件和網(wǎng)站的質(zhì)量很差,但是會(huì )減少結果中有用的文件和網(wǎng)站里面的成分讓用戶(hù)體驗更差。我們將通過(guò)檢測關(guān)鍵詞是否出現在其標題及其出現頻率等方法來(lái)確定該文件或網(wǎng)站對用戶(hù)的價(jià)值。如果值不高,那么這個(gè)文件或 網(wǎng)站 @> 被排除。這將使我們能夠抓取更高質(zhì)量的文件和 網(wǎng)站。
  競爭對手:
  網(wǎng)絡(luò )爬蟲(chóng)是一種自動(dòng)獲取網(wǎng)頁(yè)內容的程序,是搜索引擎的重要組成部分?,F在的搜索引擎基本上都涉及到爬蟲(chóng)的設計和優(yōu)化。搜索引擎的速度也與爬蟲(chóng)的優(yōu)化程度密切相關(guān)。從另一個(gè)角度來(lái)看,不僅僅是搜索引擎,所有的數據挖掘軟件都會(huì )涉及到爬蟲(chóng)。因此,爬蟲(chóng)在整個(gè)軟件行業(yè)的地位很高,應用范圍非常廣泛。這里我們主要通過(guò)搜索引擎中的爬蟲(chóng)來(lái)分析競爭。
  首先,拿兩個(gè)最常用的搜索引擎:百度和谷歌。從爬取信息來(lái)看,兩者都是行業(yè)的佼佼者,爬取算法也很不錯,可以按類(lèi)型分類(lèi)。,以方便用戶(hù)操作。它爬取整個(gè)萬(wàn)維網(wǎng)的速度非???。雖然我們的軟件在速度和爬取算法方面還不是很成熟,但是我們的軟件會(huì )為了方便用戶(hù)而設計。我們會(huì )檢查爬取文件的匹配度,對它們的優(yōu)先級進(jìn)行排序。這也將大大提高用戶(hù)體驗的質(zhì)量。我將從以下幾個(gè)方面來(lái)討論我們軟件的競爭力。
  1.爬行速度和爬行負載,這也是衡量爬蟲(chóng)的標準
  與其他軟件相比,我們的軟件在速度上還不錯。我們通過(guò)廣度優(yōu)先的搜索順序進(jìn)行搜索,可以提高爬蟲(chóng)的爬取速度。同時(shí),我們使用多個(gè)隊列進(jìn)行數據處理,這也使得爬蟲(chóng)可以同時(shí)處理多個(gè)數據。分組數據,承載能力更強。
  2.爬取質(zhì)量和特異性
  很多網(wǎng)站爬蟲(chóng)爬取給定URL中的所有內容,不僅影響爬取內容的質(zhì)量,還拖慢了預算。我們的爬蟲(chóng)會(huì )專(zhuān)門(mén)爬取電腦相關(guān)的數據,讓爬取的內容更符合用戶(hù)的需求。同時(shí)我們會(huì )對廣告進(jìn)行處理,也可以讓爬蟲(chóng)的爬取質(zhì)量更高。同時(shí),我們會(huì )在爬取時(shí)與關(guān)鍵詞進(jìn)行匹配比較,可以大大減少廣告和無(wú)關(guān)信息。
  3.分類(lèi)存儲
  用戶(hù)的下一步操作可能會(huì )使用不同類(lèi)型的數據。爬蟲(chóng)會(huì )在爬取過(guò)程中輕松對數據進(jìn)行分類(lèi)。分類(lèi)可以讓用戶(hù)獲得更好的用戶(hù)體驗,讓用戶(hù)在搜索的過(guò)程中可以更快的找到自己需要的信息。這應該更受程序員的歡迎。
  4.接口與實(shí)現
  用戶(hù)在獲取爬蟲(chóng)時(shí),需要知道爬蟲(chóng)的輸出形式和爬取速度,這就需要我們設計一個(gè)簡(jiǎn)單的接口來(lái)實(shí)現。我們的界面將以最簡(jiǎn)單的方式將輸出呈現給用戶(hù),這將非常直觀(guān)。
  5.創(chuàng )新功能
  我們將為原創(chuàng )爬蟲(chóng)添加新功能。比如抓取視頻文件時(shí),我們會(huì )將視頻地址反饋給用戶(hù)。這允許用戶(hù)直接通過(guò)地址觀(guān)看視頻。此外,我們還計劃實(shí)現不限于 html5 網(wǎng)頁(yè)的爬取,甚至嘗試爬取 CSS 或 javascript。這樣可以更方便用戶(hù)操作。
  分類(lèi):
  技術(shù)要點(diǎn):
  相關(guān)文章:

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python對象的bs4解析方式和屬性的方法和方法)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 58 次瀏覽 ? 2022-04-13 09:39 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python對象的bs4解析方式和屬性的方法和方法)
  bs4,全稱(chēng)BeautifulSoup 4,是Python獨有的解析方式。也就是說(shuō),只有 Python 語(yǔ)言可以這樣解析數據。
  BeautifulSoup 3 只支持 Python 2,所以它已經(jīng)過(guò)時(shí)了。
  官網(wǎng)的介紹是這樣的
  Beautiful Soup 提供了簡(jiǎn)單的類(lèi)似 python 的函數來(lái)處理導航、搜索、修改解析樹(shù)等。它是一個(gè)工具箱,通過(guò)解析文檔為用戶(hù)提供他們需要抓取的數據。由于其簡(jiǎn)單性,編寫(xiě)完整的應用程序不需要太多代碼。Beautiful Soup 自動(dòng)將輸入文檔轉換為 Unicode 編碼,將輸出文檔自動(dòng)轉換為 utf-8 編碼。不需要考慮編碼方式,除非文檔沒(méi)有指定編碼方式,否則Beautiful Soup無(wú)法自動(dòng)識別編碼方式。然后,您只需要指定原創(chuàng )編碼。Beautiful Soup 已經(jīng)成為與 lxml 和 html6lib 一樣優(yōu)秀的 python 解釋器,為用戶(hù)提供不同解析策略的靈活性或強大的速度。
  看起來(lái)很復雜,我用自己的理解簡(jiǎn)單解釋一下
  我們知道一個(gè)網(wǎng)頁(yè)的源代碼是由多個(gè)標簽組成的,比如,
  ,,,等等,而bs4是用來(lái)幫助我們準確定位標簽位置的工具,從而獲取標簽的內容或標簽屬性。bs4默認自帶的解析器,但官方推薦的是更強大更快的lxml解析器
  其他解析器的優(yōu)缺點(diǎn)
  
  一、bs4的安裝
  pip install bs4
pip install lxml
  用bs4解析時(shí),推薦使用lxml解析器。使用 xpath 解析時(shí)也會(huì )用到
  二、bs4解析原理1、如何實(shí)例化BeautySoup對象 導入bs4包
  from bs4 import BeautifulSoup
  灣。實(shí)例化對象
  網(wǎng)頁(yè)源代碼進(jìn)一步分為本地已經(jīng)持久化的HTML文件和網(wǎng)絡(luò )上直接獲取的源代碼。
  如果是本地持久化文件,可以通過(guò)如下方式將源碼加載到bs4對象中
  fp = open('xxx.html', 'r', encoding='utf-8')
# lxml:解析器
soup = BeautifulSoup(fp, 'lxml')
  如果是通過(guò)requests庫獲取的網(wǎng)頁(yè)源代碼,按如下方式加載
  response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
  C。數據解析的方法和屬性
  bs4 能夠將復雜的 HTML 轉換為樹(shù)結構,其中每個(gè)節點(diǎn)都是一個(gè) Python 對象。
  soup.tagName(標簽名):返回文檔中第一次出現tagName對應的標簽及其對應的內容
  soup.tageName1.tageName2:返回tag1中tag1的標簽和內容
  soup.find:等價(jià)于soup.tagName,返回第一個(gè)匹配的對象
  soup.find_all:返回所有匹配的對象。
  通過(guò)查看源碼你會(huì )發(fā)現find的本質(zhì)就是調用find_all然后返回第一個(gè)元素
  參數說(shuō)明:
   def find(self, name=None, attrs={}, recursive=True, text=None,
**kwargs):
"""Return only the first child of this Tag matching the given
criteria."""
r = None
l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
if l:
r = l[0]
return r
  【外鏈圖片傳輸失敗,源站可能有防盜鏈機制,建議保存圖片直接上傳(img-iXUox6yw-53)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-23454&lt; @0.png )]
  上圖是我從某網(wǎng)站中截取的部分畫(huà)面,翻譯成HTML如下(只保留對本次分析有用的部分,刪除地址的域名信息為閱讀方便)
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  看下面的例子
  # 獲取第一個(gè)li標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)<p>鄭爽
print(soup.li)
# # 獲取第一個(gè)li標簽中a標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)
  鄭爽
print(soup.li.a)
#獲取第一個(gè)li標簽中a標簽
print(soup.find('li').a)
# 獲取所有li標簽
print(soup.find_all('li'))
# 獲取title標簽
print(soup.title)
# 獲取a標簽的父級標簽
print(soup.a.parent)
# 獲取a標簽的父級標簽的名字
print(soup.a.parent.name)</p>
  如何在 HTML 中獲取href?
  分析:href是a標簽中的一個(gè)屬性,a標簽在li標簽中
  提取bs4中tags中的屬性可以通過(guò)attrs獲取
  其他補充劑
  # 返回子孫節點(diǎn)
# children返回迭代器
result = soup.a.children
for i in result:
print(i)
# 返回子孫節點(diǎn), contents返回列表
r = soup.a.contents
print(r)
# 可以通過(guò)正則對某個(gè)屬性進(jìn)行匹配
# 比如返回href中以zh開(kāi)頭的標簽
import re
reg = re.compile('^zh')
result = soup.find_all(href=reg)
print(result)
  選擇器
  bs4 非常強大,也支持 css 選擇器。通過(guò)選擇完成
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  from bs4 import BeautifulSoup
fp = open('baidu.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
# 返回一個(gè)所有a標簽的列表
result = soup.select('a')
# 返回第一個(gè)
result1 = soup.select('a')[0]
"""
class選擇器 : .className
"""
# 一層一層的進(jìn)行選擇,用 > 連接 即 > : 表示一個(gè)層級
# 輸出 class = nr_zt 下ul下的li下的a標簽集合
a = soup.select('.nr_zt > ul > li > a')
# 多個(gè)層級關(guān)聯(lián),使用 空格。
# 輸出 class= 'nr_zt' 下的a標簽集合
b = soup.select('.nr_zt a')
"""
id選擇器: # idName
"""
result = soup.select('#star')
# 通過(guò)href屬性查找,返回列表
soup.select('a[href="zhengshuang.html"]')
# 獲取對應標簽中img標簽的src值
a = soup.select('a[href="zhengshuang.html"]')[0]
print(a.img['src']) # 5940f2cd6b759.jpg
  以上是bs4的常用操作代碼。其實(shí)在具體的爬取過(guò)程中,匹配的方式比較靈活,大家不用死記硬背,記住原理即可。
  
  網(wǎng)絡(luò )爬蟲(chóng)
  
  Python 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python對象的bs4解析方式和屬性的方法和方法)
  bs4,全稱(chēng)BeautifulSoup 4,是Python獨有的解析方式。也就是說(shuō),只有 Python 語(yǔ)言可以這樣解析數據。
  BeautifulSoup 3 只支持 Python 2,所以它已經(jīng)過(guò)時(shí)了。
  官網(wǎng)的介紹是這樣的
  Beautiful Soup 提供了簡(jiǎn)單的類(lèi)似 python 的函數來(lái)處理導航、搜索、修改解析樹(shù)等。它是一個(gè)工具箱,通過(guò)解析文檔為用戶(hù)提供他們需要抓取的數據。由于其簡(jiǎn)單性,編寫(xiě)完整的應用程序不需要太多代碼。Beautiful Soup 自動(dòng)將輸入文檔轉換為 Unicode 編碼,將輸出文檔自動(dòng)轉換為 utf-8 編碼。不需要考慮編碼方式,除非文檔沒(méi)有指定編碼方式,否則Beautiful Soup無(wú)法自動(dòng)識別編碼方式。然后,您只需要指定原創(chuàng )編碼。Beautiful Soup 已經(jīng)成為與 lxml 和 html6lib 一樣優(yōu)秀的 python 解釋器,為用戶(hù)提供不同解析策略的靈活性或強大的速度。
  看起來(lái)很復雜,我用自己的理解簡(jiǎn)單解釋一下
  我們知道一個(gè)網(wǎng)頁(yè)的源代碼是由多個(gè)標簽組成的,比如,
  ,,,等等,而bs4是用來(lái)幫助我們準確定位標簽位置的工具,從而獲取標簽的內容或標簽屬性。bs4默認自帶的解析器,但官方推薦的是更強大更快的lxml解析器
  其他解析器的優(yōu)缺點(diǎn)
  
  一、bs4的安裝
  pip install bs4
pip install lxml
  用bs4解析時(shí),推薦使用lxml解析器。使用 xpath 解析時(shí)也會(huì )用到
  二、bs4解析原理1、如何實(shí)例化BeautySoup對象 導入bs4包
  from bs4 import BeautifulSoup
  灣。實(shí)例化對象
  網(wǎng)頁(yè)源代碼進(jìn)一步分為本地已經(jīng)持久化的HTML文件和網(wǎng)絡(luò )上直接獲取的源代碼。
  如果是本地持久化文件,可以通過(guò)如下方式將源碼加載到bs4對象中
  fp = open('xxx.html', 'r', encoding='utf-8')
# lxml:解析器
soup = BeautifulSoup(fp, 'lxml')
  如果是通過(guò)requests庫獲取的網(wǎng)頁(yè)源代碼,按如下方式加載
  response = requests.get(url)
html = response.text
soup = BeautifulSoup(html, 'lxml')
  C。數據解析的方法和屬性
  bs4 能夠將復雜的 HTML 轉換為樹(shù)結構,其中每個(gè)節點(diǎn)都是一個(gè) Python 對象。
  soup.tagName(標簽名):返回文檔中第一次出現tagName對應的標簽及其對應的內容
  soup.tageName1.tageName2:返回tag1中tag1的標簽和內容
  soup.find:等價(jià)于soup.tagName,返回第一個(gè)匹配的對象
  soup.find_all:返回所有匹配的對象。
  通過(guò)查看源碼你會(huì )發(fā)現find的本質(zhì)就是調用find_all然后返回第一個(gè)元素
  參數說(shuō)明:
   def find(self, name=None, attrs={}, recursive=True, text=None,
**kwargs):
"""Return only the first child of this Tag matching the given
criteria."""
r = None
l = self.find_all(name, attrs, recursive, text, 1, **kwargs)
if l:
r = l[0]
return r
  【外鏈圖片傳輸失敗,源站可能有防盜鏈機制,建議保存圖片直接上傳(img-iXUox6yw-53)(C:UsersAdministratorAppDataRoamingTyporatypora-user-imagesimage-23454&lt; @0.png )]
  上圖是我從某網(wǎng)站中截取的部分畫(huà)面,翻譯成HTML如下(只保留對本次分析有用的部分,刪除地址的域名信息為閱讀方便)
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  看下面的例子
  # 獲取第一個(gè)li標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)<p>鄭爽
print(soup.li)
# # 獲取第一個(gè)li標簽中a標簽
# ![](http://pic1.win4000.com/tj/201 ... 59.jpg)
  鄭爽
print(soup.li.a)
#獲取第一個(gè)li標簽中a標簽
print(soup.find('li').a)
# 獲取所有li標簽
print(soup.find_all('li'))
# 獲取title標簽
print(soup.title)
# 獲取a標簽的父級標簽
print(soup.a.parent)
# 獲取a標簽的父級標簽的名字
print(soup.a.parent.name)</p>
  如何在 HTML 中獲取href?
  分析:href是a標簽中的一個(gè)屬性,a標簽在li標簽中
  提取bs4中tags中的屬性可以通過(guò)attrs獲取
  其他補充劑
  # 返回子孫節點(diǎn)
# children返回迭代器
result = soup.a.children
for i in result:
print(i)
# 返回子孫節點(diǎn), contents返回列表
r = soup.a.contents
print(r)
# 可以通過(guò)正則對某個(gè)屬性進(jìn)行匹配
# 比如返回href中以zh開(kāi)頭的標簽
import re
reg = re.compile('^zh')
result = soup.find_all(href=reg)
print(result)
  選擇器
  bs4 非常強大,也支持 css 選擇器。通過(guò)選擇完成
  
測試Title



![](123456789.jpg)<p>尼古拉斯趙四




![](5940f2cd6b759.jpg)
  鄭爽
![](5b56e0fabf5bf.jpg)
  朱一龍
![](5a28b93be8155.jpg)
  周冬雨
![](5aa36dfbe5f61.jpg)
  胡一天
![](5a28d243b0382.jpg)
  易烊千璽
![](5a28b69334087.jpg)
  迪麗熱巴



</p>
  from bs4 import BeautifulSoup
fp = open('baidu.html', 'r', encoding='utf-8')
soup = BeautifulSoup(fp, 'lxml')
# 返回一個(gè)所有a標簽的列表
result = soup.select('a')
# 返回第一個(gè)
result1 = soup.select('a')[0]
"""
class選擇器 : .className
"""
# 一層一層的進(jìn)行選擇,用 > 連接 即 > : 表示一個(gè)層級
# 輸出 class = nr_zt 下ul下的li下的a標簽集合
a = soup.select('.nr_zt > ul > li > a')
# 多個(gè)層級關(guān)聯(lián),使用 空格。
# 輸出 class= 'nr_zt' 下的a標簽集合
b = soup.select('.nr_zt a')
"""
id選擇器: # idName
"""
result = soup.select('#star')
# 通過(guò)href屬性查找,返回列表
soup.select('a[href="zhengshuang.html"]')
# 獲取對應標簽中img標簽的src值
a = soup.select('a[href="zhengshuang.html"]')[0]
print(a.img['src']) # 5940f2cd6b759.jpg
  以上是bs4的常用操作代碼。其實(shí)在具體的爬取過(guò)程中,匹配的方式比較靈活,大家不用死記硬背,記住原理即可。
  
  網(wǎng)絡(luò )爬蟲(chóng)
  
  Python

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據( 在學(xué)習Python之前,我們要知道,,Python的用途)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 56 次瀏覽 ? 2022-04-13 09:37 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在學(xué)習Python之前,我們要知道,,Python的用途)
  
  在學(xué)習 Python 之前,我們需要了解 Python 的用途以及學(xué)習它能給我們帶來(lái)什么?
  Python主要包括網(wǎng)絡(luò )爬蟲(chóng)、網(wǎng)站開(kāi)發(fā)、人工智能、自動(dòng)化運維
  這里我們主要看一下網(wǎng)絡(luò )爬蟲(chóng),什么是網(wǎng)絡(luò )爬蟲(chóng)?
  網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛,是指一種腳本程序,它按照一定的規則在網(wǎng)絡(luò )上爬取想要的內容。眾所周知,每個(gè)網(wǎng)頁(yè)通常都收錄其他網(wǎng)頁(yè)的入口,網(wǎng)絡(luò )爬蟲(chóng)通過(guò)一個(gè)URL依次進(jìn)入其他網(wǎng)址,獲取想要的內容。
  
  爬行動(dòng)物有什么用?
  做垂直搜索引擎(google、baidu等)。
  科學(xué)研究:在線(xiàn)人類(lèi)行為、在線(xiàn)社區進(jìn)化、人類(lèi)動(dòng)力學(xué)研究、定量社會(huì )學(xué)、復雜網(wǎng)絡(luò )、數據挖掘等實(shí)證研究領(lǐng)域需要大量數據,而網(wǎng)絡(luò )爬蟲(chóng)是采集相關(guān)數據的有力工具。
  偷窺、黑客攻擊、垃圾郵件……
  爬行是搜索引擎的第一步,也是最簡(jiǎn)單的一步。
  用什么語(yǔ)言編寫(xiě)爬蟲(chóng)?
  C、C++。高效、快速,適合一般搜索引擎爬取全網(wǎng)。缺點(diǎn),開(kāi)發(fā)慢,寫(xiě)起來(lái)又臭又長(cháng),例如:天網(wǎng)搜索源碼。
  腳本語(yǔ)言:Perl、Python、Java、Ruby。簡(jiǎn)單易學(xué),良好的文本處理可以方便網(wǎng)頁(yè)內容的詳細提取,但效率往往不高,適合少量網(wǎng)站的集中抓取
  C#?
  為什么 Python 現在最流行?
  
  就個(gè)人而言,我用 c# 和 java 編寫(xiě)了爬蟲(chóng)。差別不大,原則是用好正則表達式。只是平臺問(wèn)題。后來(lái)才知道很多爬蟲(chóng)都是用python寫(xiě)的,所以一發(fā)不可收拾。Python有很多優(yōu)點(diǎn),總結兩個(gè)要點(diǎn):
  1)抓取網(wǎng)頁(yè)本身的接口
  相比其他靜態(tài)編程語(yǔ)言,如java、c#、C++、python,爬取網(wǎng)頁(yè)文檔的界面更加簡(jiǎn)潔;與 perl、shell 等其他動(dòng)態(tài)腳本語(yǔ)言相比,python 的 urllib2 包提供了對 web 文檔更完整的訪(fǎng)問(wèn)。API。(當然紅寶石也是不錯的選擇)
  另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這就是我們需要模擬用戶(hù)代理的行為來(lái)構造適當的請求的地方,例如模擬用戶(hù)登錄,模擬會(huì )話(huà)/cookie存儲和設置。python中有非常好的第三方包可以幫助你,比如Requests,mechanize
  2)網(wǎng)頁(yè)抓取后的處理
  抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,比如過(guò)濾html標簽、提取文本等。Python的beautifulsoap提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
  其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是python可以做到最快最干凈。人生苦短,你需要蟒蛇。 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(
在學(xué)習Python之前,我們要知道,,Python的用途)
  
  在學(xué)習 Python 之前,我們需要了解 Python 的用途以及學(xué)習它能給我們帶來(lái)什么?
  Python主要包括網(wǎng)絡(luò )爬蟲(chóng)、網(wǎng)站開(kāi)發(fā)、人工智能、自動(dòng)化運維
  這里我們主要看一下網(wǎng)絡(luò )爬蟲(chóng),什么是網(wǎng)絡(luò )爬蟲(chóng)?
  網(wǎng)絡(luò )爬蟲(chóng),又稱(chēng)網(wǎng)絡(luò )蜘蛛,是指一種腳本程序,它按照一定的規則在網(wǎng)絡(luò )上爬取想要的內容。眾所周知,每個(gè)網(wǎng)頁(yè)通常都收錄其他網(wǎng)頁(yè)的入口,網(wǎng)絡(luò )爬蟲(chóng)通過(guò)一個(gè)URL依次進(jìn)入其他網(wǎng)址,獲取想要的內容。
  
  爬行動(dòng)物有什么用?
  做垂直搜索引擎(google、baidu等)。
  科學(xué)研究:在線(xiàn)人類(lèi)行為、在線(xiàn)社區進(jìn)化、人類(lèi)動(dòng)力學(xué)研究、定量社會(huì )學(xué)、復雜網(wǎng)絡(luò )、數據挖掘等實(shí)證研究領(lǐng)域需要大量數據,而網(wǎng)絡(luò )爬蟲(chóng)是采集相關(guān)數據的有力工具。
  偷窺、黑客攻擊、垃圾郵件……
  爬行是搜索引擎的第一步,也是最簡(jiǎn)單的一步。
  用什么語(yǔ)言編寫(xiě)爬蟲(chóng)?
  C、C++。高效、快速,適合一般搜索引擎爬取全網(wǎng)。缺點(diǎn),開(kāi)發(fā)慢,寫(xiě)起來(lái)又臭又長(cháng),例如:天網(wǎng)搜索源碼。
  腳本語(yǔ)言:Perl、Python、Java、Ruby。簡(jiǎn)單易學(xué),良好的文本處理可以方便網(wǎng)頁(yè)內容的詳細提取,但效率往往不高,適合少量網(wǎng)站的集中抓取
  C#?
  為什么 Python 現在最流行?
  
  就個(gè)人而言,我用 c# 和 java 編寫(xiě)了爬蟲(chóng)。差別不大,原則是用好正則表達式。只是平臺問(wèn)題。后來(lái)才知道很多爬蟲(chóng)都是用python寫(xiě)的,所以一發(fā)不可收拾。Python有很多優(yōu)點(diǎn),總結兩個(gè)要點(diǎn):
  1)抓取網(wǎng)頁(yè)本身的接口
  相比其他靜態(tài)編程語(yǔ)言,如java、c#、C++、python,爬取網(wǎng)頁(yè)文檔的界面更加簡(jiǎn)潔;與 perl、shell 等其他動(dòng)態(tài)腳本語(yǔ)言相比,python 的 urllib2 包提供了對 web 文檔更完整的訪(fǎng)問(wèn)。API。(當然紅寶石也是不錯的選擇)
  另外,爬取網(wǎng)頁(yè)有時(shí)需要模擬瀏覽器的行為,很多網(wǎng)站被屏蔽用于生硬的爬蟲(chóng)爬取。這就是我們需要模擬用戶(hù)代理的行為來(lái)構造適當的請求的地方,例如模擬用戶(hù)登錄,模擬會(huì )話(huà)/cookie存儲和設置。python中有非常好的第三方包可以幫助你,比如Requests,mechanize
  2)網(wǎng)頁(yè)抓取后的處理
  抓取的網(wǎng)頁(yè)通常需要進(jìn)行處理,比如過(guò)濾html標簽、提取文本等。Python的beautifulsoap提供了簡(jiǎn)潔的文檔處理功能,可以用極短的代碼完成大部分文檔處理。
  其實(shí)很多語(yǔ)言和工具都可以做到以上功能,但是python可以做到最快最干凈。人生苦短,你需要蟒蛇。

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求的三個(gè)步驟分析)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 68 次瀏覽 ? 2022-04-13 07:19 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求的三個(gè)步驟分析)
  爬蟲(chóng)的大致思路:抓取網(wǎng)頁(yè),分析請求
  解析網(wǎng)頁(yè)并查找數據
  存儲數據,多頁(yè)面處理
  本課主要講授如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求。
  三步找到真正的請求
  分析:使用 Google Chrome 開(kāi)發(fā)者工具分析網(wǎng)頁(yè)請求
  測試:測試URL請求中各個(gè)參數的作用,找出控制翻頁(yè)等功能的參數
  Repeat:反復尋找滿(mǎn)足爬蟲(chóng)需求的真實(shí)請求
  實(shí)用鏈接:爬取知乎
  通過(guò)爬取知乎“輪子哥”——vczh相關(guān)人士分析Ajax或JavaScript加載數據的真實(shí)請求,并展示該爬取方式的具體過(guò)程。
  1. 尋找真實(shí)請求的測試首先進(jìn)入“輪子哥-vczh”關(guān)注者的頁(yè)面(注意:需要登錄個(gè)人知乎帳戶(hù)優(yōu)先)
  通過(guò)禁用javascript加載發(fā)現頁(yè)面無(wú)法正常加載,確認頁(yè)面的翻頁(yè)是通過(guò)javascript加載數據實(shí)現的
  使用谷歌瀏覽器開(kāi)發(fā)者工具查找收錄關(guān)注者信息的真實(shí)請求??梢园l(fā)現,真正的請求是以“followees”開(kāi)頭的請求,返回的是一個(gè)JSON格式的數據,對應下一頁(yè)的“Followees”。人”:
  雙擊該請求返回JSON格式的數據,通過(guò)安裝JSONView插件可以更好的顯示在瀏覽器中
  然后您可以嘗試抓取請求的數據
  2. 嘗試爬取真實(shí)請求的數據 先嘗試使用前幾課學(xué)習的requests.get() 來(lái)爬取數據
  可以發(fā)現返回“500 Server Error”,即由于網(wǎng)站反爬蟲(chóng),服務(wù)器返回“500 Service Error”
  這個(gè)問(wèn)題可以通過(guò)添加headers請求頭信息來(lái)解決
  3. 添加headers請求頭信息,模擬瀏覽器訪(fǎng)問(wèn)。請求頭信息攜帶客戶(hù)端瀏覽器、請求頁(yè)面、服務(wù)器等信息,用于通知服務(wù)器發(fā)起請求的客戶(hù)端的具體信息
  p>
  知乎反爬機制是通過(guò)檢查請求頭信息實(shí)現的,所以在使用request請求數據的時(shí)候需要加上需要的請求頭
  對比知乎的請求頭信息和普通請求頭信息,發(fā)現知乎的請求頭有更多的授權和X-UDID信息
  向爬蟲(chóng)添加請求頭信息,即添加headers# -*- coding:utf-8 -*-
  導入請求
  標題 = {
  'authorization':' ',#括號內填寫(xiě)你的授權
  'User-Agent':' ',#括號里填你的User-Agent
  }
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset=20&limit=20'
  response=requests.get(url, headers = headers).json()
  打?。憫?br />   最終代碼:#!/usr/bin/env python3
  # -*- 編碼:utf-8 -*-
  """
  創(chuàng )建于 2018 年 3 月 20 日星期二 16:01:47
  @作者:杰基
  """
  導入請求
  將熊貓導入為 pd
  進(jìn)口時(shí)間
  標題 = {
  '授權': '承載 2 | 1:0 | 10:1519627538 | 4:z_c0 | 92: Mi4xYzBvWkFBQUFBQUFBSU1JaTVqRU1EQ1lBQUFCZ0FsVk5FdnVBV3dEdHdaRmtBR1lmZEpqT3VvdmtpSm5QMWtkZ1ZB | 787597598f41757929f46f687f78434dbc66d6abc980e40fb50b55cd09062b07',
  'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/6< @4.0.3282.186 Safari/537.36',
  'x-udid':'ACDCIuYxDAyPTg7eVnDe8ytVGX6ivGdKZ9E=',
  }
  user_data = []
  def get_user_data(page):
  for i in range(page):
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset={}&limit=20'.format(i*20)
  response = requests.get(url, headers = headers).json()['data']
  user_data.extend(響應)
  print('爬取頁(yè)面 %s' %str(i+1))
  時(shí)間.sleep(1)
  如果 __name__ == '__main__':
  get_user_data(3)
  df = pd.DataFrame(user_data)
  df.to_csv('users.csv')
  
  補充知識
  1. JSONJSON 是一種輕量級的數據交換格式。連接API爬取數據時(shí),一般數據返回格式為JSON。
  JSONView 插件:前往 Chrome JSONView 插件安裝,下載并安裝 JSONView 插件,以使 JSON 格式的數據在 Google Chrome 中更好地呈現 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求的三個(gè)步驟分析)
  爬蟲(chóng)的大致思路:抓取網(wǎng)頁(yè),分析請求
  解析網(wǎng)頁(yè)并查找數據
  存儲數據,多頁(yè)面處理
  本課主要講授如何通過(guò)谷歌瀏覽器開(kāi)發(fā)者工具分析真實(shí)請求。
  三步找到真正的請求
  分析:使用 Google Chrome 開(kāi)發(fā)者工具分析網(wǎng)頁(yè)請求
  測試:測試URL請求中各個(gè)參數的作用,找出控制翻頁(yè)等功能的參數
  Repeat:反復尋找滿(mǎn)足爬蟲(chóng)需求的真實(shí)請求
  實(shí)用鏈接:爬取知乎
  通過(guò)爬取知乎“輪子哥”——vczh相關(guān)人士分析Ajax或JavaScript加載數據的真實(shí)請求,并展示該爬取方式的具體過(guò)程。
  1. 尋找真實(shí)請求的測試首先進(jìn)入“輪子哥-vczh”關(guān)注者的頁(yè)面(注意:需要登錄個(gè)人知乎帳戶(hù)優(yōu)先)
  通過(guò)禁用javascript加載發(fā)現頁(yè)面無(wú)法正常加載,確認頁(yè)面的翻頁(yè)是通過(guò)javascript加載數據實(shí)現的
  使用谷歌瀏覽器開(kāi)發(fā)者工具查找收錄關(guān)注者信息的真實(shí)請求??梢园l(fā)現,真正的請求是以“followees”開(kāi)頭的請求,返回的是一個(gè)JSON格式的數據,對應下一頁(yè)的“Followees”。人”:
  雙擊該請求返回JSON格式的數據,通過(guò)安裝JSONView插件可以更好的顯示在瀏覽器中
  然后您可以嘗試抓取請求的數據
  2. 嘗試爬取真實(shí)請求的數據 先嘗試使用前幾課學(xué)習的requests.get() 來(lái)爬取數據
  可以發(fā)現返回“500 Server Error”,即由于網(wǎng)站反爬蟲(chóng),服務(wù)器返回“500 Service Error”
  這個(gè)問(wèn)題可以通過(guò)添加headers請求頭信息來(lái)解決
  3. 添加headers請求頭信息,模擬瀏覽器訪(fǎng)問(wèn)。請求頭信息攜帶客戶(hù)端瀏覽器、請求頁(yè)面、服務(wù)器等信息,用于通知服務(wù)器發(fā)起請求的客戶(hù)端的具體信息
  p>
  知乎反爬機制是通過(guò)檢查請求頭信息實(shí)現的,所以在使用request請求數據的時(shí)候需要加上需要的請求頭
  對比知乎的請求頭信息和普通請求頭信息,發(fā)現知乎的請求頭有更多的授權和X-UDID信息
  向爬蟲(chóng)添加請求頭信息,即添加headers# -*- coding:utf-8 -*-
  導入請求
  標題 = {
  'authorization':' ',#括號內填寫(xiě)你的授權
  'User-Agent':' ',#括號里填你的User-Agent
  }
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset=20&limit=20'
  response=requests.get(url, headers = headers).json()
  打?。憫?br />   最終代碼:#!/usr/bin/env python3
  # -*- 編碼:utf-8 -*-
  """
  創(chuàng )建于 2018 年 3 月 20 日星期二 16:01:47
  @作者:杰基
  """
  導入請求
  將熊貓導入為 pd
  進(jìn)口時(shí)間
  標題 = {
  '授權': '承載 2 | 1:0 | 10:1519627538 | 4:z_c0 | 92: Mi4xYzBvWkFBQUFBQUFBSU1JaTVqRU1EQ1lBQUFCZ0FsVk5FdnVBV3dEdHdaRmtBR1lmZEpqT3VvdmtpSm5QMWtkZ1ZB | 787597598f41757929f46f687f78434dbc66d6abc980e40fb50b55cd09062b07',
  'user-agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/6< @4.0.3282.186 Safari/537.36',
  'x-udid':'ACDCIuYxDAyPTg7eVnDe8ytVGX6ivGdKZ9E=',
  }
  user_data = []
  def get_user_data(page):
  for i in range(page):
  url = '*%5D.answer_count%2Carticles_count%2Cgender%2Cfollower_count%2Cis_followed%2Cis_following%2Cbadge%5B%3F(type%3Dbest_answerer)%ics&offset={}&limit=20'.format(i*20)
  response = requests.get(url, headers = headers).json()['data']
  user_data.extend(響應)
  print('爬取頁(yè)面 %s' %str(i+1))
  時(shí)間.sleep(1)
  如果 __name__ == '__main__':
  get_user_data(3)
  df = pd.DataFrame(user_data)
  df.to_csv('users.csv')
  
  補充知識
  1. JSONJSON 是一種輕量級的數據交換格式。連接API爬取數據時(shí),一般數據返回格式為JSON。
  JSONView 插件:前往 Chrome JSONView 插件安裝,下載并安裝 JSONView 插件,以使 JSON 格式的數據在 Google Chrome 中更好地呈現

c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何寫(xiě)爬蟲(chóng)“賊船”等上了賊船才發(fā)現)

網(wǎng)站優(yōu)化 ? 優(yōu)采云 發(fā)表了文章 ? 0 個(gè)評論 ? 48 次瀏覽 ? 2022-04-11 06:10 ? 來(lái)自相關(guān)話(huà)題

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何寫(xiě)爬蟲(chóng)“賊船”等上了賊船才發(fā)現)
  寫(xiě)爬蟲(chóng)是一項考驗綜合實(shí)力的工作。有時(shí),您可以輕松獲取所需的數據;有時(shí)候,你努力了,卻一無(wú)所獲。
  很多Python爬蟲(chóng)入門(mén)教程都是一行代碼騙你上“賊船”,上賊船才發(fā)現,水好深~
  例如,爬取一個(gè)網(wǎng)頁(yè)可以是非常簡(jiǎn)單的一行代碼:
  r = requests.get(&#39;http://news.baidu.com&#39;)
  
  很簡(jiǎn)單,但它的作用只是爬取一個(gè)網(wǎng)頁(yè),而一個(gè)有用的爬蟲(chóng)遠不止是爬取一個(gè)網(wǎng)頁(yè)。
  一個(gè)有用的爬蟲(chóng),只用兩個(gè)詞衡量:
  但是要實(shí)現這兩個(gè)字,還需要下一番功夫。自己努力是一方面,但同樣很重要的一點(diǎn)是你想要達到的網(wǎng)站的目標是它給你帶來(lái)了多少問(wèn)題。綜合來(lái)看,寫(xiě)爬蟲(chóng)有多難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)一:只爬 HTML 頁(yè)面但可擴展
  這里我們以新聞爬蟲(chóng)為例。大家都用過(guò)百度的新聞搜索,我就用它的爬蟲(chóng)說(shuō)說(shuō)實(shí)現的難點(diǎn)。
  新聞網(wǎng)站基本不設防,新聞內容全部在網(wǎng)頁(yè)的html代碼中,抓取整個(gè)網(wǎng)頁(yè)基本上就是一行。聽(tīng)起來(lái)很簡(jiǎn)單,但對于一個(gè)搜索引擎級別的爬蟲(chóng)來(lái)說(shuō),就不是那么簡(jiǎn)單了,要及時(shí)爬取上萬(wàn)條新聞網(wǎng)站的新聞也不是一件容易的事。
  我們先來(lái)看一下新聞爬蟲(chóng)的簡(jiǎn)單流程圖:
  
  從一些種子頁(yè)開(kāi)始,種子頁(yè)往往是一些新聞網(wǎng)站的首頁(yè),爬蟲(chóng)抓取該頁(yè)面,從中提取出網(wǎng)站的URL,放入URL池中進(jìn)行爬取。這從幾頁(yè)開(kāi)始,然后繼續擴展到其他頁(yè)面。爬蟲(chóng)爬取的網(wǎng)頁(yè)越來(lái)越多,提取的新網(wǎng)址也會(huì )成倍增加。
  如何在最短的時(shí)間內抓取更多的網(wǎng)址?
  這是難點(diǎn)之一,不是目的URL帶來(lái)的,而是對我們自身意愿的考驗:
  如何及時(shí)掌握最新消息?
  這是效率之外的另一個(gè)難點(diǎn)。如何保證時(shí)效?上千條新聞網(wǎng)站時(shí)刻都在發(fā)布最新消息。爬蟲(chóng)如何在織網(wǎng)抓取“舊”新聞的同時(shí)兼顧“新”新聞的獲???
  如何存儲大量捕獲的新聞?
  爬蟲(chóng)的抓取會(huì )翻出幾年前和幾十年前的每一個(gè)新聞頁(yè)面網(wǎng)站,從而獲取大量需要存儲的頁(yè)面。就是存儲的難點(diǎn)。
  如何清理提取的網(wǎng)頁(yè)內容?
  快速準確地從新聞網(wǎng)頁(yè)的html中提取想要的信息數據,如標題、發(fā)布時(shí)間、正文內容等,給內容提取帶來(lái)困難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)二:需要登錄才能抓取想要的數據
  人們很貪婪,想要無(wú)窮無(wú)盡的數據,但是很多數據并不容易提供給你。有一大類(lèi)數據,只有賬號登錄才能看到。也就是說(shuō),爬蟲(chóng)在請求的時(shí)候必須登錄才能抓取數據。
  如何獲取登錄狀態(tài)? 查看全部

  c爬蟲(chóng)抓取網(wǎng)頁(yè)數據(Python爬蟲(chóng)如何寫(xiě)爬蟲(chóng)“賊船”等上了賊船才發(fā)現)
  寫(xiě)爬蟲(chóng)是一項考驗綜合實(shí)力的工作。有時(shí),您可以輕松獲取所需的數據;有時(shí)候,你努力了,卻一無(wú)所獲。
  很多Python爬蟲(chóng)入門(mén)教程都是一行代碼騙你上“賊船”,上賊船才發(fā)現,水好深~
  例如,爬取一個(gè)網(wǎng)頁(yè)可以是非常簡(jiǎn)單的一行代碼:
  r = requests.get(&#39;http://news.baidu.com&#39;)
  
  很簡(jiǎn)單,但它的作用只是爬取一個(gè)網(wǎng)頁(yè),而一個(gè)有用的爬蟲(chóng)遠不止是爬取一個(gè)網(wǎng)頁(yè)。
  一個(gè)有用的爬蟲(chóng),只用兩個(gè)詞衡量:
  但是要實(shí)現這兩個(gè)字,還需要下一番功夫。自己努力是一方面,但同樣很重要的一點(diǎn)是你想要達到的網(wǎng)站的目標是它給你帶來(lái)了多少問(wèn)題。綜合來(lái)看,寫(xiě)爬蟲(chóng)有多難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)一:只爬 HTML 頁(yè)面但可擴展
  這里我們以新聞爬蟲(chóng)為例。大家都用過(guò)百度的新聞搜索,我就用它的爬蟲(chóng)說(shuō)說(shuō)實(shí)現的難點(diǎn)。
  新聞網(wǎng)站基本不設防,新聞內容全部在網(wǎng)頁(yè)的html代碼中,抓取整個(gè)網(wǎng)頁(yè)基本上就是一行。聽(tīng)起來(lái)很簡(jiǎn)單,但對于一個(gè)搜索引擎級別的爬蟲(chóng)來(lái)說(shuō),就不是那么簡(jiǎn)單了,要及時(shí)爬取上萬(wàn)條新聞網(wǎng)站的新聞也不是一件容易的事。
  我們先來(lái)看一下新聞爬蟲(chóng)的簡(jiǎn)單流程圖:
  
  從一些種子頁(yè)開(kāi)始,種子頁(yè)往往是一些新聞網(wǎng)站的首頁(yè),爬蟲(chóng)抓取該頁(yè)面,從中提取出網(wǎng)站的URL,放入URL池中進(jìn)行爬取。這從幾頁(yè)開(kāi)始,然后繼續擴展到其他頁(yè)面。爬蟲(chóng)爬取的網(wǎng)頁(yè)越來(lái)越多,提取的新網(wǎng)址也會(huì )成倍增加。
  如何在最短的時(shí)間內抓取更多的網(wǎng)址?
  這是難點(diǎn)之一,不是目的URL帶來(lái)的,而是對我們自身意愿的考驗:
  如何及時(shí)掌握最新消息?
  這是效率之外的另一個(gè)難點(diǎn)。如何保證時(shí)效?上千條新聞網(wǎng)站時(shí)刻都在發(fā)布最新消息。爬蟲(chóng)如何在織網(wǎng)抓取“舊”新聞的同時(shí)兼顧“新”新聞的獲???
  如何存儲大量捕獲的新聞?
  爬蟲(chóng)的抓取會(huì )翻出幾年前和幾十年前的每一個(gè)新聞頁(yè)面網(wǎng)站,從而獲取大量需要存儲的頁(yè)面。就是存儲的難點(diǎn)。
  如何清理提取的網(wǎng)頁(yè)內容?
  快速準確地從新聞網(wǎng)頁(yè)的html中提取想要的信息數據,如標題、發(fā)布時(shí)間、正文內容等,給內容提取帶來(lái)困難。
  網(wǎng)絡(luò )爬蟲(chóng)難點(diǎn)二:需要登錄才能抓取想要的數據
  人們很貪婪,想要無(wú)窮無(wú)盡的數據,但是很多數據并不容易提供給你。有一大類(lèi)數據,只有賬號登錄才能看到。也就是說(shuō),爬蟲(chóng)在請求的時(shí)候必須登錄才能抓取數據。
  如何獲取登錄狀態(tài)?

官方客服QQ群

微信人工客服

QQ人工客服


線(xiàn)

亚洲国产精品无码久久大片,亚洲AV无码乱码麻豆精品国产,亚洲品质自拍网站,少妇伦子伦精品无码STYLES,国产精久久久久久久