如何根据产品选择(例如尺寸,颜色,包装)抓取信息?

时间:2019-05-08 21:04:15

标签: python beautifulsoup scrapy selection

我上周成功抓取了1600多页。但被告知,返回的数据中有很大一部分是不正确的,如被拉的东西(即价格),这意味着如果要爬网的商品可以选择(大小,颜色,数量/包装) )以查看价格,我如何能够为每个选择收集正确的价格?似乎我的逻辑是拉出发现的第一个价格。

我在早期尝试尝试仅解析页面代码中的所有可用组合,但这始终无法准确返回,因此我只取了1个价格,但似乎我使用的大多数测试页都没有特定于选项的价格,因此我忽略了大部分网址,这些网址在布局和功能上都不相似。当前唯一起作用的是我所拥有的代码,可以在这里找到。

https://stackoverflow.com/questions/55925202/why-does-this-code-generate-multiple-files-i-want-1-file-with-all-entries-in-it/55925220#55925220

这很好用,并且可以像我们预期的那样对任何我们没有选择的项目页面进行爬网。

https://stackoverflow.com/questions/55925202/why-does-this-code-generate-multiple-files-i-want-1-file-with-all-entries-in-it/55925220#55925220

完整的代码已经发布在这里,并且最终版本正在运行。

我不需要完整的示例,我只需要一些代码方面的指导,以便自动进行产品选择以获得正确的价格,选择组合

这是一个示例页面,它没有拉正确的价格:     https://www.dickssportinggoods.com/p/berkley-vanish-fluorocarbon-fishing-line-15bkyuvnsh25010clfli/15bkyuvnsh25010clfli

当您开始进行选择时,价格会发生变化,如果您选择“ 6”磅和“ 2000码”,价格将变为$ 75.99,然后如果您将其更改为“ 250码”,则价格将变为$ 12.99

由于我们有时会需要拉特定的磅数和长度,因此我需要关注什么才能系统地拉出所需选择的正确价格?

有没有一种方法可以只拉动每页上的所有组合,以便我们一次又一次击打同一页?

我看过这里的一些链接以及其他似乎可以解决此问题的站点,但是即使它们是同一件我想完成的事情,也几乎不会丢失。

只需寻找有关从哪里开始或尝试什么的指南。

1 个答案:

答案 0 :(得分:1)

在使用scrapy时,如果要使用所有组合,则需要确保在脚本中包含所有条件,这是完全不合理的。

我将使用两个不同的解析器,scraper用于常规刮除,而硒用于更具体的刮除。使用硒,您可以在脚本中输入特定的组合,然后在页面上解析价格,如下所示:

import requests
import urllib3
import pandas as pd
import numpy as np
import os
import traceback
import io
from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC


chrome_options = Options()
#chrome_options.add_argument('--headless')
#chrome_options.add_argument('--hide-scrollbars')
#chrome_options.add_argument('--disable-gpu')
#chrome_options.add_argument("--log-level=3")  # fatal

url = 'https://www.dickssportinggoods.com/p/berkley-vanish-fluorocarbon-fishing-line-15bkyuvnsh25010clfli/15bkyuvnsh25010clfli'

browser = webdriver.Chrome(
    executable_path=r'C:\Users\edekio\Documents\chromedriver.exe', chrome_options=chrome_options)
browser.get(url)

pounds = browser.find_element_by_link_text('14').click()

length = browser.find_element_by_link_text('250 yds').click()

price = WebDriverWait(browser, 60).until(
    EC.presence_of_element_located((By.ID, "ProductInfoPrice_740978")))

price_text = price.get_attribute('value')
print(price_text)

输出:

14.99

如您所见,我们可以使用硒将特定的值传递到框中,从而获得您想要的确切价格。但是,以上脚本并非全部包含在内,但它应该是一个很好的起点。