【问题标题】:BS4 - Web Scraping - Searching div. class =BS4 - 网页抓取 - 搜索 div。类=
【发布时间】:2020-05-25 02:22:35
【问题描述】:

我试图从下图中抓取“95% 喜欢这部电影”,但是当我通过类指定标签时没有得到任何结果 - 查看下面的代码。关于如何实现这一点的任何想法?

import bs4, requests
from bs4 import BeautifulSoup
res = requests.get('https://www.google.com/search?rlz=1C5CHFA_enUS879US879&sxsrf=ALeKk00cw9xBpC8OWgCnKhMSIGOi4xb3sw%3A1590372307467&ei=0yfLXrSQHNHa9AOzh6jIAg&q=titanic+google+play&oq=Titanic+&gs_lcp=CgZwc3ktYWIQAxgAMgQIIxAnMgoIABCDARAUEIcCMgcIABCDARBDMgUIABCRAjIFCAAQkQIyBwgAEIMBEEMyBAgAEEMyBwgAEIMBEEMyBAgAEEMyBAgAEEM6BAgAEEc6AggAOgUIABCDAVCcLFjMOmCEQ2gBcAN4AIABbIgBigaSAQM4LjGYAQCgAQGqAQdnd3Mtd2l6&sclient=psy-ab')

res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
news = [p.text.strip() for p in soup.select('h1 ~ p') if p.find('font')]

soup = BeautifulSoup(res.content, 'html.parser')
content = BeautifulSoup(res.content, 'html.parser')
content.find_all(class="srBp4.Vrkhme")`  

]1

【问题讨论】:

  • Google 通常使用 JavaScript 来显示元素,但 BeautifulSoup 无法运行 JavaScript。关闭浏览器中的 JavaScript 并使用 Google 重新加载您的页面,您将看到 BeautifulSoup 可以看到的内容。我记得当客户端无法运行 JavaScript 时,Google 会发送不同的 HTML
  • 顺便说一句:您还可以保存通过 BS 获得的 HTML 并在浏览器中显示,以查看您是否没有收到机器人警告或阻止机器人的 recaptcha。谷歌不喜欢脚本/机器人,它有很多钱来创建复杂的系统来阻止机器人。它还有不同的 API 来提供一些数据,而不是从 HTML 中获取数据
  • @furas 谢谢 - 我找不到获取此数据的 API。
  • @furas 获得所有这些数据真是太好了
  • 在网络浏览器中关闭 JavaScript 并重新加载页面以查看 BeautifulSoup 可以从 Google 获得什么 - 然后获取 select()find() 的值。顺便说一句:当我使用您的 URL 时,我不会获得有关电影的信息 - Google 可能会为不同的用户发送不同的结果。当您测试 Google 结果时,您可能必须在网络浏览器中使用隐私模式,因为您的脚本类似于隐私模式。 Google 也可能会为不同的设备(手机、平板电脑、台式机)发送不同的 HTML,这取决于您在 requests 中不使用的标题 User-Agent。也许将res.text 保存在文件中并在浏览器中打开它

标签: python web-scraping beautifulsoup


【解决方案1】:

Google 使用 JavaScript 来显示结果 - 要获得 95% ... 我必须使用 Selenium 来控制可以运行 JavaScript 的真实网络浏览器。我不得不使用查询titanic movie 而不是titanic google play

import selenium.webdriver

url = 'https://www.google.com/search?q=titanic+movie'

#driver = selenium.webdriver.Chrome()
driver = selenium.webdriver.Firefox()
driver.get(url)

item = driver.find_element_by_class_name('srBp4.Vrkhme')
print(item.text.strip())

编辑:我也用requests/BeautifulSoup 得到它,但我必须使用完整的标题User-Agent。它不适用于短 Mozilla/5.0

它需要不带点的"srBp4 Vrkhme" 类。它必须是class_=_

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Firefox/78.0'}
r = requests.get('https://www.google.com/search?q=titanic+movie', headers=headers)

soup = BeautifulSoup(r.content, 'html.parser')
item = soup.find('div', class_="srBp4 Vrkhme")
print(item.get_text(strip=True, separator=' '))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多