搜尋
首頁後端開發Python教學python抓取google搜尋結果

前一段時間一直在研究如何用python抓取搜尋引擎結果,在實現的過程中遇到了很多的問題,我把我遇到的問題都記錄下來,希望以後遇到同樣問題的童鞋不要再走彎路。

1. 搜尋引擎的選取

  選擇一個好的搜尋引擎意味著你能夠得到更精確的搜尋結果。我用過的搜尋引擎有四種:Google、Bing、Baidu、Yahoo!。 身為程式設計師,我首選Google。但當我看見我最愛的Google回傳給我的全是一堆的js程式碼,根本沒我想要的搜尋結果。於是我轉而投向了Bing的陣營,在用過一段時間後我發現Bing回傳的搜尋結果對於我的問題來說不太理想。正當我要絕望時,Google拯救了我。原來Google為了照顧那些禁止瀏覽器使用js的用戶,還有另一種搜尋方式,請看下面的搜尋URL:

https://www.google.com.hk/search?hl=en&q=hello

  hl指定要搜尋的語言,q就是你要搜尋的關鍵字。 好了,感謝Google,搜尋結果頁麵包含我要抓取的內容。

  PS: 網路上很多利用python抓取Google搜尋結果還是利用 https://ajax.googleapis.com/ajax/services/search/web... 的方法。要注意的是這個方法Google已經不再建議使用了,請參閱 https://developers.google.com/web-search/docs/ 。 Google現在提供了Custom Search API, 不過API限制每天100次請求,如果需要更多就只能花錢買。

2. Python抓取並分析網頁

  利用Python抓取網頁很方便,不多說,見程式碼:

def search(self, queryStr):
     queryStr = urllib2.quote(queryStr)
     url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr
     request = urllib2.Request(url)
     response = urllib2.urlopen(request)
     html = response.read()
     results = self.extractSearchResults(html)

  第6行的 html 就是我們抓取的搜尋結果頁面來源碼。使用過Python的同學會發現,Python同時提供了urllib 和urllib2兩個模組,都是和URL請求相關的模組,不過提供了不同的功能,urllib只可以接收URL,而urllib2可以接受一個Request類別的實例來設定URL請求的headers,這表示你可以偽裝你的user agent 等(下面會用到)。

  現在我們已經可以用Python抓取網頁並保存下來,接下來我們就可以從源碼頁面中抽取我們想要的搜尋結果。 Python提供了htmlparser模組,不過用起來相對比較麻煩,這裡推薦一個很好用的網頁分析套件BeautifulSoup,關於BeautifulSoup的用法官網有詳細的介紹,這裡我不再多說。

  利用上面的程式碼,對於少量的查詢還比較OK,但如果要進行上千上萬次的查詢,上面的方法就不再有效了, Google會檢測你請求的來源,如果我們利用機器頻繁爬取Google的搜尋結果,不多久就Google會block你的IP,並給你回503 Error頁面。這不是我們想要的結果,於是我們還要繼續探索

  前面提到利用urllib2我們可以設定URL請求的headers,  偽裝我們的user agent。簡單的說,user agent就是客戶端瀏覽器等應用程式使用的一種特殊的網路協議, 在每次瀏覽器(郵件客戶端/搜尋引擎蜘蛛)進行HTTP 請求時發送到伺服器,伺服器就知道了用戶是使用什麼瀏覽器(郵件用戶端/搜尋引擎蜘蛛)來存取的。 有時候為了達到一些目的,我們不得不去善意的欺騙伺服器告訴它我不是用機器訪問你。

  於是,我們的程式碼就成了下面這個樣子:

user_agents = ['Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0', \
         'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0', \
         'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \
         (KHTML, like Gecko) Element Browser 5.0', \
         'IBM WebExplorer /v0.94', 'Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)', \
         'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)', \
         'Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14', \
         'Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \
         Version/6.0 Mobile/10A5355d Safari/8536.25', \
         'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \
         Chrome/28.0.1468.0 Safari/537.36', \
         'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)']
 def search(self, queryStr):
     queryStr = urllib2.quote(queryStr)
     url = 'https://www.google.com.hk/search?hl=en&q=%s' % queryStr
     request = urllib2.Request(url)
     index = random.randint(0, 9)
     user_agent = user_agents[index]
     request.add_header('User-agent', user_agent)
     response = urllib2.urlopen(request)
     html = response.read()
     results = self.extractSearchResults(html)

 於是,我們的程式碼就成了下面這個樣子:

rrreee

 不要被user_agents那個list嚇到,那其實就是10個user agent 字串,這麼做是讓我們偽裝的更好一些,如果你需要更多的user agent 請看這裡UserAgentString。

17-19行表示隨機選擇一個user agent 字串,然後用request 的add_header方法偽裝一個user agent。

  透過偽裝user agent能夠讓我們持續抓取搜尋引擎結果,如果這樣還不行,那我建議在每兩次查詢間隨機休眠一段時間,這樣會影響抓取速度,但是能夠讓你更持續的抓取結果,如果你有多個IP,那抓取的速度也就上來了。

🎜🎜
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
Python中的合併列表:選擇正確的方法Python中的合併列表:選擇正確的方法May 14, 2025 am 12:11 AM

Tomergelistsinpython,YouCanusethe操作員,estextMethod,ListComprehension,Oritertools

如何在Python 3中加入兩個列表?如何在Python 3中加入兩個列表?May 14, 2025 am 12:09 AM

在Python3中,可以通過多種方法連接兩個列表:1)使用 運算符,適用於小列表,但對大列表效率低;2)使用extend方法,適用於大列表,內存效率高,但會修改原列表;3)使用*運算符,適用於合併多個列表,不修改原列表;4)使用itertools.chain,適用於大數據集,內存效率高。

Python串聯列表字符串Python串聯列表字符串May 14, 2025 am 12:08 AM

使用join()方法是Python中從列表連接字符串最有效的方法。 1)使用join()方法高效且易讀。 2)循環使用 運算符對大列表效率低。 3)列表推導式與join()結合適用於需要轉換的場景。 4)reduce()方法適用於其他類型歸約,但對字符串連接效率低。完整句子結束。

Python執行,那是什麼?Python執行,那是什麼?May 14, 2025 am 12:06 AM

pythonexecutionistheprocessoftransformingpypythoncodeintoExecutablestructions.1)InternterPreterReadSthecode,ConvertingTingitIntObyTecode,whepythonvirtualmachine(pvm)theglobalinterpreterpreterpreterpreterlock(gil)the thepythonvirtualmachine(pvm)

Python:關鍵功能是什麼Python:關鍵功能是什麼May 14, 2025 am 12:02 AM

Python的關鍵特性包括:1.語法簡潔易懂,適合初學者;2.動態類型系統,提高開發速度;3.豐富的標準庫,支持多種任務;4.強大的社區和生態系統,提供廣泛支持;5.解釋性,適合腳本和快速原型開發;6.多範式支持,適用於各種編程風格。

Python:編譯器還是解釋器?Python:編譯器還是解釋器?May 13, 2025 am 12:10 AM

Python是解釋型語言,但也包含編譯過程。 1)Python代碼先編譯成字節碼。 2)字節碼由Python虛擬機解釋執行。 3)這種混合機制使Python既靈活又高效,但執行速度不如完全編譯型語言。

python用於循環與循環時:何時使用哪個?python用於循環與循環時:何時使用哪個?May 13, 2025 am 12:07 AM

UseeAforloopWheniteratingOveraseQuenceOrforAspecificnumberoftimes; useAwhiLeLoopWhenconTinuingUntilAcIntiment.forloopsareIdealForkNownsences,而WhileLeleLeleLeleLeleLoopSituationSituationsItuationsItuationSuationSituationswithUndEtermentersitations。

Python循環:最常見的錯誤Python循環:最常見的錯誤May 13, 2025 am 12:07 AM

pythonloopscanleadtoerrorslikeinfiniteloops,modifyingListsDuringteritation,逐個偏置,零indexingissues,andnestedloopineflinefficiencies

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver Mac版

Dreamweaver Mac版

視覺化網頁開發工具

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具