首页 > 解决方案 > 如何使用 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 秒,在循环的最后一行之后,没有任何变化。

我不明白为什么我的脚本无法获得给定产品的所有结果。谁能给我一点帮助?

标签: pythonpython-3.xweb-scraping

解决方案


首先,我建议 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来抓取网站。


推荐阅读