星期二, 11月 19, 2013

[Python] 你也會寫的google search crawler

最近會用到Google的搜尋解果
但是Google似乎在三年前就把web search api給deprecate了
現在用Google custom search只能對特定網站搜尋
小氣巴拉的

所以身為一個硬(ㄌㄢˇ)派(ㄉㄨㄛˋ)的工程師
當然二話不說就是自幹一個出來


首先,當然是了解要怎麼餵參數給google
Google search最主要吃的參數不外乎就是查詢的字串
先來觀察一下:



阿 非常簡單  I got you~
直接在網址後接上/search?q=XXX就是查詢的動作了

這裡要注意的是Google會自動把空白字元轉成"+"號:



不過別怕,就算直接留空白也不會影響到搜尋結果:




萬事俱備,開始爬結果啦!!
這裡會用到兩個Python的Lib--RequestsBeautifulSoup
Requests是方便抓取網頁的Lib,這邊不多作介紹

第一步先分析網頁
這邊有兩個要抓到的重點:

  1. 搜尋結果
  2. 換頁方式
先來看搜尋結果:


抓到啦!!每個class是"g"的li都是一筆搜尋結果
這用BeautifulSoup選出來的方法是:

for result in soup.find_all("li", class_="g"):

    print(result.find("a").get("href"))
夠簡單吧!!
再來是換頁機制:

這邊發現有兩個class是"b navend"的td,一個是上一頁一個是下一頁
如果到了最後一頁:

發現td還是存在,但是連結不見了!!
很好很好
一樣用簡單的方式選出來
result = soup.find_all("td", class_="navend")

print(result[-1].find("a").get("href"))
很好,萬事俱備了,接下來就把兩段湊起來:
while(url !=  None):
data = requests.get(url)
soup = BeautifulSoup(data.text)
    for result in soup.find_all("li", class_="g"):
        print(result.find("a").get("href")
    result = soup.find_all("td", class_="navend")
    url = 'http://www.google.com'+result[-1].find("a").get("href")
看起來一切完美
可惜人算不如天算
還是乖乖的回去用了Google custom search....

4 則留言:

Terces Tsai 提到...

用phantomjs吧~
我會用了! 但是好慢...

羅澤揚 提到...

這種用硬幹的就好了啦XD

Unknown 提到...

接下來只好硬幹reCAPTCHA(誤)

rogerroan 提到...

user-agent有沒有設定呢