Python BeautifulSoup硒刮刀

时间:2019-04-10 09:22:15

标签: python selenium web-scraping amazon tracker

我正在使用以下python脚本从Amazon pages抓取信息。

在某个时候,它停止返回页面结果。脚本正在启动,浏览关键字/页面,但我只得到标题作为输出:

  

关键字排名标题ASIN得分评论有效日期

我怀疑问题出在下一行,因为此标记不再存在,并且... "scripts": { "start": "react-app-rewired start", "build": "react-app-rewired build", "postinstall": "patch-package" } ... var没有任何值:

results

这是完整的代码:

results = soup.findAll('div', attrs={'class': 's-item-container'})

输出应如下所示(为清楚起见,我已经修剪了标题)。

  

关键字排名标题ASIN得分评论有效日期

     

蓝色+滑板3鱼鹰完成   Beginning B00IL1JMF4 3.7 40 Prime 2019年2月21日   蓝色+滑板4 ENKEEO Complete Mini   C B078J9Y1DG 4.5 42 Prime 2019年2月21日Blue + Skateboard 5 skatro-   Mini Cruiser B00K93PIXM 4.8223 Prime 2019年2月21日   蓝色+滑板7 Vinsani复古巡洋舰     B00CSV72AK 4.4 8 Prime 2019年2月21日Blue + Skateboard 8 Ridge   Retro Cruiser Bo B00CA33ISQ 4.1207 Prime 2019年2月21日   蓝色+滑板9 Xootz Kids Complete   Be B01B2YNSJM 3.6 32 Prime 2019年2月21日Blue + Skateboard 10 Enuff   Pyro II Skateboa B00MGRGX2Y 4.3 68 Prime 2019年2月21日

1 个答案:

答案 0 :(得分:1)

以下显示了您可以进行的一些更改。我已经更改为在某些时候使用CSS选择器。

要循环的主要结果集由soup.select('.s-result-list [data-asin]')检索。这将指定具有类名.s-result-list的子元素具有属性data-asin的子元素。这与页面上的60(当前)项匹配。

我将PRIME选择替换为使用attribute = value选择器

标题现在为h5,即header = soup.select_one('h5')


soup.select_one('[aria-label="Amazon Prime"]

示例代码:

import datetime
from bs4 import BeautifulSoup
import time
from selenium import webdriver
import re

keyword = 'blue+skateboard'
driver = webdriver.Chrome()

url = 'https://www.amazon.co.uk/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords={}'

driver.get(url.format(keyword))
soup = BeautifulSoup(driver.page_source, 'lxml')
results = soup.select('.s-result-list [data-asin]')

for a, b in enumerate(results):
    soup = b
    header = soup.select_one('h5')
    result = a + 1
    title = header.text.strip()

    try:
        link = soup.select_one('h5 > a')
        url = link['href']
        url = re.sub(r'/ref=.*', '', str(url))
    except:
        url = "None"

    if url !='/gp/slredirect/picassoRedirect.html':
        ASIN = re.sub(r'.*/dp/', '', str(url))
        #print(ASIN)

        try:
            score = soup.select_one('.a-icon-alt')
            score = score.text
            score = score.strip('\n')
            score = re.sub(r' .*', '', str(score))
        except:
            score = "None"

        try:
            reviews = soup.select_one("href*='#customerReviews']")
            reviews = reviews.text.strip()
        except:
            reviews = "None"

        try:
            PRIME = soup.select_one('[aria-label="Amazon Prime"]')
            PRIME = PRIME['aria-label']
        except:
            PRIME = "None"
        data = {keyword:[keyword,str(result),title,ASIN,score,reviews,PRIME,datetime.datetime.today().strftime("%B %d, %Y")]}
        print(data)

示例输出:

enter image description here