2017-07-07 36 views
0

所以我一直在通過Al Sweigart的在線Automate The Boring東西與Python教程,並且我已經到了webscraping部分。下面是我用什麼樣的程序是應該做一個描述代碼:基本的Python掃描(美麗的湯&請求)

#! python3 
# lucky.py - A small program that allows you to get search keywords from 
# command line arguments, retrieve the search results page, and open 
# a new browser tab for each result 

# Steps: 
# 1. Read the command line arguments from sys.argv 
# 2. Fetch the search result page with the requests module 
# 3. Find the links to each search result 
# 4. Call the webbrowser.open() function to open the web browser 

import sys, requests, bs4, webbrowser 

# 1. Read the command line arguments from sys.argv 

print('Googling...') 

if len(sys.argv) > 1: 
    search = ' '.join(sys.argv[1:]) 

url = "https://www.google.com/#q=" 

for i in range(len(search.split())): 
    url += search.split()[i] + "+" 

# 2. Fetch the search result page with the requests module 

page = requests.get(url) 

# 3. Find the links to each search result 

soup = bs4.BeautifulSoup(page.text, 'lxml') 
linkElems = soup.select('.r a') 

# 4. Call the webbrowser.open() function to open the web browser 

numOpen = min(5, len(linkElems)) 
for i in range(numOpen): 
    webbrowser.open("http://google.com" + linkElems[i].get('href')) 

所以這裏的問題是,當我檢查linkElems的長度,它是0,這意味着soup.select(」 R A。 ')命令未能聚合在元素< a>內部定義的內容class = r(僅在Google中使用開發人員工具時可以看到的搜索結果的類)。因此,我的瀏覽器中沒有搜索結果的網頁。

我認爲這個問題與HTML解析器無法正常工作有關,或者Google改變了他們的HTML代碼的工作方式(?)。任何有關這個問題的見解將不勝感激!

+1

所以你正在尋找一個錨元素?谷歌很可能已經改變了他們提供的內容,所以你可能不會再找到你要找的東西,至少是這樣。您需要查看它們的源代碼並查看包含所需信息的標籤,然後解壓。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ確實如此。有趣的是,通過檢查源代碼,看起來Google仍然使用class = r作爲搜索結果,並在各個鏈接的錨點元素下使用。我會更深入地觀察源代碼,看看是否還有另一個主要的潛在問題。感謝您的評論! – Rohan

+1

這很有可能是通過JS加載的......然後你可能需要看一下phantomjs或硒。祝你好運! –

回答

0

linkElems = soup.find_all('a',href=True)這會返回所有相關的<a>標籤,您可以處理該列表以決定要保留的內容以及不保留的內容。

+0

雖然這確實會返回大量鏈接,但不幸的是它們都鏈接到Google的其他部分,如圖像,視頻,設置等......我打印出結果列表,並且沒有任何href值顯示爲搜索結果網址。無論如何感謝您的答案! – Rohan

0

谷歌似乎正在檢測你是一個機器人,而不是一個真正的網頁瀏覽器與Cookies和Javascript。他們似乎試圖處理新結果的方式仍然是讓網絡抓取工具跟隨他們提供的鏈接並在https://www.google.com前加前綴,這樣當您轉到該網址時,他們仍然可以跟蹤您的移動。

您也可以嘗試在提供的鏈接中查找圖案。例如,當你搜索「Linux的,它返回如下: '?/ URL Q ='

/url?q=https://en.wikipedia.org/wiki/Linux&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=9775308e-206b-11e8-b45f-fb72cae612a8 
/url?q=https://www.linux.org/&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=9775308e-206b-11e8-b45f-fb72cae612a8 
/url?q=https://www.linux.com/what-is-linux&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=d50ea51a-206b-11e8-9432-2bee635f8337 
/url?q=https://www.ubuntu.com/&sa=U&ved=9775308e-206b-11e8-b45f-fb72cae612a8&usg=dab9f6a4-206b-11e8-a999-3fc9d4576425 
/search?q=linux&ie=UTF-8&prmd=ivns&source=univ&tbm=nws&tbo=u&sa=X&ved=9775308e-206b-11e8-b45f-fb72cae612a8 

你可以使用正則表達式來抓取之間的部分和 '& SA = U & VED ='因爲這是您可能需要的網址。當然,這不適用於返回的第5個結果,因爲它對於Google網站來說是特殊的。再次,可能在每個返回的URL的前面加上https://www.google.com是最安全的事情。

大多數搜索引擎(甚至duckduckgo.com)都試圖跟蹤搜索結果和點擊。如果你試圖避免它,他們有檢測代碼來阻止你。你可能會遇到這種情況,告訴你他們已經從你的IP中檢測到大量搜索,並且你必須通過CAPTCHA測試才能繼續。