亚马逊网页抓取

Amazon web scraping

我正在尝试使用 phantomjs 和 python 来获取亚马逊的价格。我想用漂亮的汤来解析它,以获得新书和旧书的价格,问题是:当我传递请求的来源时,我用 phantomjs 做的价格只是 0,00,代码就是这个简单的测试。

我是网络抓取的新手,但我不明白亚马逊是否有避免抓取价格的措施,或者我做错了因为我正在尝试其他更简单的页面并且我可以获得数据我要。

PD 我所在的国家/地区不支持使用亚马逊 API,这就是为什么需要刮板的原因

import re
import urlparse

from selenium import webdriver
from bs4 import BeautifulSoup
from time import sleep

link = 'http://www.amazon.com/gp/offer-listing/1119998956/ref=dp_olp_new?ie=UTF8&condition=new'#'http://www.amazon.com/gp/product/1119998956'

class AmzonScraper(object):
    def __init__(self):
        self.driver = webdriver.PhantomJS()
        self.driver.set_window_size(1120, 550)

    def scrape_prices(self):
        self.driver.get(link)
        s = BeautifulSoup(self.driver.page_source)
        return s

    def scrape(self):
        source = self.scrape_prices()
        print source
        self.driver.quit()

if __name__ == '__main__':
    scraper = TaleoJobScraper()
    scraper.scrape()

首先,按照@Nick Bailey 的评论,研究使用条款 并确保您没有违规行为。

要解决它,您需要调整PhantomJS所需的功能:

caps = webdriver.DesiredCapabilities.PHANTOMJS
caps["phantomjs.page.settings.userAgent"] = "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/53 (KHTML, like Gecko) Chrome/15.0.87"

self.driver = webdriver.PhantomJS(desired_capabilities=caps)
self.driver.maximize_window()

并且,要使其防弹,您可以Custom Expected Condition等待价格变为非零:

from selenium.common.exceptions import StaleElementReferenceException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class wait_for_price(object):
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try :
            element_text = EC._find_element(driver, self.locator).text.strip()
            return element_text != "0,00"
        except StaleElementReferenceException:
            return False

用法:

def scrape_prices(self):
    self.driver.get(link)

    WebDriverWait(self.driver, 200).until(wait_for_price((By.CLASS_NAME, "olpOfferPrice")))
    s = BeautifulSoup(self.driver.page_source)

    return s

关于将 phantomjs 的用户代理设置为普通浏览器的用户代理的好答案。既然你说你的国家被亚马逊屏蔽了,那我想你也需要设置代理吧

这里是一个如何在 python 中使用 firefox 用户代理和代理启动 phantomJS 的示例。

from selenium.webdriver import *
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
service_args = [ '--proxy=1.1.1.1:port', '--proxy-auth=username:pass'  ]
dcap = dict( DesiredCapabilities.PHANTOMJS )
dcap["phantomjs.page.settings.userAgent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0"
driver = PhantomJS( desired_capabilities = dcap, service_args=service_args )

其中 1.1.1.1 是您的代理 IP,端口是代理端口。此外,仅当您的代理需要身份验证时才需要用户名和密码。

另一个可以尝试的框架是 Scrapy 它比用于模拟浏览器交互的 selenium 更简单。 Scrapy 为您提供 类 以便使用 CSS selectorsXPath 轻松解析数据,以及一个管道以您喜欢的任何格式存储该数据,比如将其写入 MongoDB例如数据库

通常您可以编写一个完全构建的爬虫并将其部署到 10 行代码

中的 Scrapy 云中

查看此 YT 视频,了解如何将 Scrapy 用于 scraping Amazon reviews 作为用例