Python BeautifulSoup 硒刮板

我正在使用以下 python 脚本从亚马逊页面抓取信息。


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


关键字排名标题 ASIN 评分评论 Prime 日期


我怀疑问题出在以下行中,因为此标记不再存在并且resultsvar 没有获得任何值:


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


这是完整的代码:


from bs4 import BeautifulSoup

import time

from selenium import webdriver

import re

import datetime

from collections import deque

import logging

import csv



class 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 日


慕侠2389804
浏览 171回答 1
1回答

catspeake

下面显示了您可以进行的一些更改。我在某些时候改用了 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 datetimefrom bs4 import BeautifulSoupimport timefrom selenium import webdriverimport rekeyword = '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)示例输出:
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python