python - 如何使用 Python 在 Google Shopping 上抓取多个产品?
问题描述
在这篇文章之后,我用 Python创建了我的第一个网络爬虫。我的意图是爬谷歌购物,寻找产品价格。该脚本有效,但我想在运行脚本时搜索多个产品。
所以,我正在遍历这样的产品列表:
from time import sleep
from random import randint
import requests
from bs4 import BeautifulSoup
# from dataProducts import products
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"
}
stores = ["Submarino", "Casas Bahia", "Extra.com.br", "Americanas.com",
"Pontofrio.com", "Shoptime", "Magazine Luiza", "Amazon.com.br - Retail", "Girafa"]
products = [
{
"name" : "Console Playstation 5",
"lowestPrice" : 4000.0,
"highestPrice" : 4400.0
},
{
"name" : "Controle Xbox Robot",
"lowestPrice" : 320.0,
"highestPrice" : 375.0
}
]
for product in products:
params = {"q": product["name"], 'tbm': 'shop'}
response = requests.get("https://www.google.com/search",
params=params,
headers=headers)
soup = BeautifulSoup(response.text, 'lxml')
# Normal results
for shopping_result in soup.select('.sh-dgr__content'):
product = shopping_result.select_one('.Lq5OHe.eaGTj h4').text
price = shopping_result.select_one('span.kHxwFf span.a8Pemb').text
store = shopping_result.select_one('.IuHnof').text
link = f"https://www.google.com{shopping_result.select_one('.Lq5OHe.eaGTj')['href']}"
if store in stores:
print(product)
print(price)
print(store)
print(link)
print()
print()
print('####################################################################################################################################################')
当我运行脚本时,它不会带来所有数据。有时,它甚至不会从第一次搜索中带来任何数据。它只显示第二次迭代的打印。我试图在汤线之后放置一个雪橇,10 秒,在循环的最后一行之后,没有任何变化。
我不明白为什么我的脚本无法获得给定产品的所有结果。谁能给我一点帮助?
解决方案
首先,我建议 selenium 请求大多数时候不会带来数据。其次,如果您试图获取 PS5 或 Xbox 的库存警报,我会抓取一个网站而不是谷歌。您将需要安装 chrome 和 chrome 驱动程序。链接:https ://chromedriver.chromium.org/downloads下面是如何使用 Selenium!
import selenium
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
ua = UserAgent()
options = Options()
options.add_argument("useragent="+ua.random)
options.add_argument("--headless")
options.add_argument("--disable-gpu")
options.add_experimental_option("excludeSwitches", ["enable-logging"])
browser = webdriver.Chrome("chromedriver location", options=options)
browser.get("https://google.com")
html = browser.page_source
所以你需要做:
pip install selenium
pip install fake_useragent
设置它。然后使用html
您可以使用BS4来抓取网站。
推荐阅读
- sql-server - 无法为 Integration Services 项目将目标服务器版本设置为 SQL Server 2012
- javascript - 在 Vue 应用程序模板中显示从 API 获取的数据,使用 ASYNC/AWAIT(Nativescript 游乐场)
- c# - 如何在 Web Api 应用程序中使用没有实体框架的 ADO .NET “一对多”获取数据?
- javascript - 如何在 Node 中使用 supertest 包附加来自同一目录的多个文件?
- ios - 如何将标签文本添加到 tableViewCell
- react-virtualized - React-virtualized - 是否可以使用自定义列?
- rxjs - 用于组合 RxJS Observables 的布尔代数助手
- java - 使用两个堆栈来计算中缀表达式
- android - android dev.中是否需要布尔代数知识?
- python - 即使最后一个命令(但不是第一个命令)引发异常,Try 块也会给出输出