为什么在我的网络抓取程序中没有任何内容被解析?
why is nothing getting parsed in my web scraping program?
我编写了这段代码来搜索 google 搜索中的所有热门链接。但它返回 none.
import webbrowser, requests
from bs4 import BeautifulSoup
string = 'selena+gomez'
website = f'http://google.com/search?q={string}'
req_web = requests.get(website).text
parser = BeautifulSoup(req_web, 'html.parser')
gotolink = parser.find('div', class_='r').a["href"]
print(gotolink)
Google 需要您指定 User-Agent
http header 到 return 正确的页面。如果没有指定正确的 User-Agent
,Google return 的页面不包含带有 r
class 的 <div>
标签。当你做 print(soup)
有和没有 User-Agent
.
时你可以看到它
例如:
import requests
from bs4 import BeautifulSoup
string = 'selena+gomez'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0'}
website = f'http://google.com/search?hl=en&q={string}'
req_web = requests.get(website, headers=headers).text
parser = BeautifulSoup(req_web, 'html.parser')
gotolink = parser.find('div', class_='r').a["href"]
print(gotolink)
打印:
https://www.instagram.com/selenagomez/?hl=en
来自 的回答将引发错误,因为此 css
class 不再存在:
gotolink = parser.find('div', class_='r').a["href"]
AttributeError: 'NoneType' object has no attribute 'a'
详细了解 user-agent
and request headers。
基本上 user-agent
let 标识浏览器、它的版本号和它的主机操作系统,代表一个人(浏览器)在允许服务器和网络对等点识别它是否是机器人。
在这种情况下,您需要发送伪造的 user-agent
,这样 Google 会将您的请求视为“真实”用户访问,also known as user-agent
spoofing。
在请求中传递 user-agent
headers
:
headers = {
'User-agent':
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
requests.get(YOUR_URL, headers=headers)
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/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
params = {
"q": "selena gomez"
}
html = requests.get('https://www.google.com/search', headers=headers, params=params)
soup = BeautifulSoup(html.text, 'lxml')
link = result.select_one('.yuRUbf a')['href']
print(link)
# https://www.instagram.com/selenagomez/
或者,您可以使用 SerpApi 中的 Google Organic Results API 来实现相同的目的。这是付费 API 和免费计划。
本质上,你的情况的主要区别是你不需要考虑如何绕过 Google 块,如果它们出现或弄清楚如何抓取更难抓取的元素,因为它已经为最终用户完成了。唯一需要做的就是从 JSON 字符串中获取您想要的数据。
示例代码:
import os
from serpapi import GoogleSearch
params = {
"engine": "google",
"q": "selena gomez",
"api_key": os.getenv("API_KEY"),
}
search = GoogleSearch(params)
results = search.get_dict()
# [0] means index of the first organic result
link = results['organic_results'][0]['link']
print(link)
# https://www.instagram.com/selenagomez/
Disclaimer, I work for SerpApi.
我编写了这段代码来搜索 google 搜索中的所有热门链接。但它返回 none.
import webbrowser, requests
from bs4 import BeautifulSoup
string = 'selena+gomez'
website = f'http://google.com/search?q={string}'
req_web = requests.get(website).text
parser = BeautifulSoup(req_web, 'html.parser')
gotolink = parser.find('div', class_='r').a["href"]
print(gotolink)
Google 需要您指定 User-Agent
http header 到 return 正确的页面。如果没有指定正确的 User-Agent
,Google return 的页面不包含带有 r
class 的 <div>
标签。当你做 print(soup)
有和没有 User-Agent
.
例如:
import requests
from bs4 import BeautifulSoup
string = 'selena+gomez'
headers = {'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:76.0) Gecko/20100101 Firefox/76.0'}
website = f'http://google.com/search?hl=en&q={string}'
req_web = requests.get(website, headers=headers).text
parser = BeautifulSoup(req_web, 'html.parser')
gotolink = parser.find('div', class_='r').a["href"]
print(gotolink)
打印:
https://www.instagram.com/selenagomez/?hl=en
来自 css
class 不再存在:
gotolink = parser.find('div', class_='r').a["href"]
AttributeError: 'NoneType' object has no attribute 'a'
详细了解 user-agent
and request headers。
基本上 user-agent
let 标识浏览器、它的版本号和它的主机操作系统,代表一个人(浏览器)在允许服务器和网络对等点识别它是否是机器人。
在这种情况下,您需要发送伪造的 user-agent
,这样 Google 会将您的请求视为“真实”用户访问,also known as user-agent
spoofing。
在请求中传递 user-agent
headers
:
headers = {
'User-agent':
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
requests.get(YOUR_URL, headers=headers)
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/70.0.3538.102 Safari/537.36 Edge/18.19582"
}
params = {
"q": "selena gomez"
}
html = requests.get('https://www.google.com/search', headers=headers, params=params)
soup = BeautifulSoup(html.text, 'lxml')
link = result.select_one('.yuRUbf a')['href']
print(link)
# https://www.instagram.com/selenagomez/
或者,您可以使用 SerpApi 中的 Google Organic Results API 来实现相同的目的。这是付费 API 和免费计划。
本质上,你的情况的主要区别是你不需要考虑如何绕过 Google 块,如果它们出现或弄清楚如何抓取更难抓取的元素,因为它已经为最终用户完成了。唯一需要做的就是从 JSON 字符串中获取您想要的数据。
示例代码:
import os
from serpapi import GoogleSearch
params = {
"engine": "google",
"q": "selena gomez",
"api_key": os.getenv("API_KEY"),
}
search = GoogleSearch(params)
results = search.get_dict()
# [0] means index of the first organic result
link = results['organic_results'][0]['link']
print(link)
# https://www.instagram.com/selenagomez/
Disclaimer, I work for SerpApi.