为了账号安全,请及时绑定邮箱和手机立即绑定

Python BeautifulSoup 硒刮板

Python BeautifulSoup 硒刮板

慕侠2389804 2022-01-05 19:40:14
我正在使用以下 python 脚本从亚马逊页面抓取信息。在某些时候,它停止返回页面结果。脚本正在启动,浏览关键字/页面,但我只得到标题作为输出:关键字排名标题 ASIN 评分评论 Prime 日期我怀疑问题出在以下行中,因为此标记不再存在并且resultsvar 没有获得任何值:results = soup.findAll('div', attrs={'class': 's-item-container'})这是完整的代码:from bs4 import BeautifulSoupimport timefrom selenium import webdriverimport reimport datetimefrom collections import dequeimport loggingimport csvclass AmazonScaper(object):    def __init__(self,keywords, output_file='example.csv',sleep=2):        self.browser = webdriver.Chrome(executable_path='/Users/willcecil/Dropbox/Python/chromedriver')  #Add path to your Chromedriver        self.keyword_queue = deque(keywords)  #Add the start URL to our list of URLs to crawl        self.output_file = output_file        self.sleep = sleep        self.results = []    def get_page(self, keyword):        try:            self.browser.get('https://www.amazon.co.uk/s/ref=nb_sb_noss_2?url=search-alias%3Daps&field-keywords={a}'.format(a=keyword))            return self.browser.page_source        except Exception as e:            logging.exception(e)            return    def get_soup(self, html):        if html is not None:            soup = BeautifulSoup(html, 'lxml')            return soup        else:            return输出应该是这样的(为了清晰起见,我已经修剪了标题)。关键字排名标题 ASIN 评分评论 Prime 日期Blue+Skateboard 3 Osprey Complete Beginn B00IL1JMF4 3.7 40 Prime 2019 年 2 月 21 日 Blue+Skateboard 4 ENKEEO Complete Mini C B078J9Y1DG 4.5 42 Prime 2019 年 2 月 21 日 Blue+Skateboard 5 skatro-K23S Mini Cruiser10M29X2019 年 2月7 Vinsani 复古巡洋舰 B00CSV72AK 4.4 8 Prime 2019 年 2 月 21 日 Blue+Skateboard 8 Ridge Retro Cruiser Bo B00CA33ISQ 4.1 207 Prime 2019 年 2 月 21 日 Blue+Skateboard 9 Xootz Kids Complete Be B01B206200002 Blue+Skateboard 8 Ridge Retro Cruiser Bo B00CA33ISQ II Skateboa B00MGRGX2Y 4.3 68 Prime 2019 年 2 月 21 日
查看完整描述

1 回答

?
catspeake

TA贡献1111条经验 获得超0个赞

下面显示了您可以进行的一些更改。我在某些时候改用了 css 选择器。


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


我将 PRIME 选择交换为使用属性 = 值选择器


头现在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)

示例输出:

//img1.sycdn.imooc.com//61d583e10001a35813340267.jpg

查看完整回答
反对 回复 2022-01-05
  • 1 回答
  • 0 关注
  • 170 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信