Python 与亚马逊图书ISBN合作

Python 与亚马逊图书ISBN合作,python,beautifulsoup,python-requests,Python,Beautifulsoup,Python Requests,我正试图收集一些关于亚马逊上一些书籍的信息,我有一个奇怪的小故障错误,我无法理解。起初我以为是Amazon阻止了我的连接,但后来我注意到请求有一个“200OK”,它有对应页面的真实HTML内容 让我们以这本书为例: 这部分工作正常,我可以有正常的价格和促销价格(如果存在),甚至货币。但当我这么做的时候: isbn = soup.select("td.bucket > .content > ul > li")[4].contents[1].string.str

我正试图收集一些关于亚马逊上一些书籍的信息,我有一个奇怪的小故障错误,我无法理解。起初我以为是Amazon阻止了我的连接,但后来我注意到请求有一个“200OK”,它有对应页面的真实HTML内容

让我们以这本书为例:

这部分工作正常,我可以有正常的价格和促销价格(如果存在),甚至货币。但当我这么做的时候:

isbn = soup.select("td.bucket > .content > ul > li")[4].contents[1].string.strip().replace("-", "")
我得到“索引器:列表索引超出范围”。但是如果我调试代码,内容实际上就在那里


这是一只美丽的虫子吗?请求-响应是否太长?

我希望能对问题进行解释,但解决方法是将代码封装在如下函数中:

def scrape():
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

    url = 'https://www.amazon.co.uk/All-Rage-Cara-Hunter/dp/0241985110/ref=sr_1_1?crid=2PPCQEJD706VY&dchild=1&keywords=books+bestsellers+2020+paperback&qid=1598132071&sprefix=book%2Caps%2C234&sr=8-1'

    response = requests.get(url, headers=headers)

    soup = BeautifulSoup(response.content, features="lxml")

    price = {}

    if soup.select("#buyBoxInner > ul > li > span > .a-text-strike") != []:
        price["regular_price"] = float(
            soup.select("#buyBoxInner > ul > li > span > .a-text-strike")[0].string[1:].replace(",", "."))
        price["promo_price"] = float(soup.select(".offer-price")[0].string[1:].replace(",", "."))
    else:
        price["regular_price"] = float(soup.select(".offer-price")[0].string[1:].replace(",", "."))
    price["currency"] = soup.select(".offer-price")[0].string[0]


    #ADD THIS FEATURE TO YOUR CODE
    isbn = soup.select("td.bucket > .content > ul > li")
    if not isbn:
        scrape()


    isbn = isbn[4].contents[1].string.strip().replace("-", "")

如果它失败了,它会再次调用自己。您可能希望对其进行重构,使其只发出一次请求。

Amazon似乎返回两个版本的页面。一个是
,另一个是多个
标签。此脚本尝试从这两个脚本中提取ISBN:

import requests
from bs4 import BeautifulSoup


headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}

url = 'https://www.amazon.co.uk/All-Rage-Cara-Hunter/dp/0241985110'
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.content, features="lxml")

isbn_10 = soup.select_one('span.a-text-bold:contains("ISBN-10"), b:contains("ISBN-10")').find_parent().text
isbn_13 = soup.select_one('span.a-text-bold:contains("ISBN-13"), b:contains("ISBN-13")').find_parent().text

print(isbn_10.split(':')[-1].strip())
print(isbn_13.split(':')[-1].strip())
印刷品:

0241985110
978-0241985113

汤。选择(“td.bucket>.content>ul>li”)[4]
抛出错误或
内容[1]
?@sintribu
汤。选择(“td.bucket>.content>ul>li”)[4]
我不知道这对您有什么帮助,但当我运行此代码时,它对我来说运行良好。我只需要在顶部添加几个导入,在底部添加一个
print(isbn)
,我得到的输出是
9780241985113
,它有时对我有效,但对其他人无效。网页抓取是一件奇怪的事情???哇!彼此彼此。4次中有3次对我有效。谢谢你的输入,但我实际上已经尝试过类似的方法,并且效果保持不变。有时候会失败,哇。很好的捕捉,很好的解决方案。你显然知道你的汤。你知道为什么亚马逊会返回两个不同的页面吗?我想知道这是否是一个新版本的网页推出的问题,它没有(或还没有)到所有的服务器。@Steve可能他们a/B测试两个版本的相同网页,或不同版本的服务器软件…或者他们想让机器人更难抓取信息。@AndrejKesely非常感谢!成功了。还有一个问题。价格选择器可以吗?我用一个50多个URL的列表运行了它,它给出了相同的错误,但价格不同。你觉得怎么样?@MiguelSantana我想你从服务器上得到了验证码页面。在几次请求之后,我也开始得到它。@AndrejKesely你认为如果我创建一个requests.session,我可以绕过它吗?
0241985110
978-0241985113