为什么在我的网络抓取程序中没有任何内容被解析?

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)

代码和example in the online IDE:

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.