我正在嘗試使用bs4(Beautiful Soup 4)并請求python 中的庫從網站上為我分配的基于作業的專案抓取關鍵資料。雖然我主要讓我的網路抓取程式作業,但我在某些網站上遇到了問題,比如谷歌。
問題是我的程式在某些網站上抓取的 HTML 與許多瀏覽器上的開發人員工具 Elements Panel 中顯示的 HTML 不匹配。
考慮以下從我的程式中提取的“視覺測驗”:
from bs4 import BeautifulSoup
import requests
URL_source = r'https://google.com/search?q=stack overflow'
response_object = requests.get(URL_source).text
soup = BeautifulSoup(response_object, 'lxml')
soup = str(soup.prettify())
soup = soup.split('\n')
for i in range(20):
print(soup[i])
該程式應該刮取并列印出支持 Google 頁面的 HTML 的前 20 行,該頁面是在 Google ( https://google.com/search?q=stack overflow ) 中搜索“堆疊溢位”所產生的結果。我使用 Spyder IDE 獲得的輸出如下:
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<style nonce="RJFpNnOeRBbdIaYpv jsHw">
a, a:link, a:visited, a:active, a:hover {
color: #1a73e8;
text-decoration: none;
}
body {
font-family: Roboto,RobotoDraft,Helvetica,Arial,sans-serif;
text-align: center;
-ms-text-size-adjust: 100%;
-moz-text-size-adjust: 100%;
-webkit-text-size-adjust: 100%;
}
.box {
border: 1px solid #dadce0;
box-sizing: border-box;
border-radius: 8px;
margin: 24px auto 5px auto;
但是,此 HTML 代碼似乎與 Chrome(和 Microsoft Edge 的)開發人員工具 Elements Panel(鍵盤快捷鍵:F12)建議的底層 HTML 代碼非常不同: Chrome 開發人員工具 Elements Panel 的結果
為什么會出現這種差異?
您可以提供的任何幫助將不勝感激。我相信你們中的許多人將能夠立即看到問題的根源。我懷疑我抓取的 HTML 提取物是(主要是)json 格式這一事實可能包含一些線索。
謝謝你。
uj5u.com熱心網友回復:
嘗試使用另一個鏈接,因為 google 是一個搜索引擎,每次搜索查詢時其源代碼都會更改。嘗試使用簡單的鏈接,如https://hacknetayush.repl.co
uj5u.com熱心網友回復:
注意 開發者工具在實時瀏覽器 DOM 上運行,在檢查頁面源時您將看到的不是原始 HTML,而是在應用一些瀏覽器清理和執行 JavaScript 代碼后修改后的 HTML。
Requests 不會執行 JavaScript,因此內容可能會略有不同,但您可以抓取 - 只需更深入地了解您的內容。
怎么修”?
headers在您的請求中提出一些并嘗試顯示“它是一個瀏覽器”,希望得到回應(從開發工具復制您的標頭,因此,谷歌不會要求 cookie,...)
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'}
例子
from bs4 import BeautifulSoup
import requests
headers ={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36'}
URL_source = r'https://www.google.com/search?q=stack overflow'
response_object = requests.get(URL_source,headers=headers).text
soup = BeautifulSoup(response_object, 'lxml')
[x.text for x in soup.select('a:has(h3)')]
輸出
['Stack Overflow - Where Developers Learn, Share, & Build ...https://stackoverflow.com',
'Stack Overflow (@StackOverflow) · Twitterhttps://twitter.com/StackOverflow',
'Stack Overflow (Website) - Wikipediahttps://de.wikipedia.org ? wiki ? Stack_Overflow_(Web...',
'Stack Overflow - Wikipediahttps://en.wikipedia.org ? wiki ? St...',
'Softwareentwicklung: So geht es weiter bei Stack Overflowhttps://www.heise.de ? news ? Softwareentwicklung-So-...',
'Stack Overflow Blog - Essays, opinions, and advice on the act ...https://stackoverflow.blog']
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/387388.html
上一篇:抓取網站,不能嵌套同名資料
