IndexError:列表索引超出范围在编译脚本时显示,但在Powershell中运行时显示

时间:2019-01-14 02:33:33

标签: python python-3.x

我正在创建刮刮Amazon的网络刮板,但遇到此错误代码 IndexError:list index超出范围时遇到了问题我发现,通过将每一行粘贴到powershell窗口中,程序可以正常工作,但是编译脚本时出现错误。

from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = 'https://www.amazon.com/s/ref=nb_sb_noss_2?url=search- 
alias%3Daps&field-keywords=graphics+card&rh=i%3Aaps%2Ck%3Agraphics+card'
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()

page_soup = soup(page_html, "html.parser")


containers = page_soup.findAll("div",{"class":"a-fixed-left-grid-inner"})
container = containers[0]
for container in containers:

    title_container = container.findAll("h2")
    product_name = title_container[0].text

    value_container = container.findAll("span", {"class":"a-offscreen"})
    value = value_container[0].text
    print("Product: " + product_name)
    print("Price: " + value)

我正在尝试从亚马逊获得产品名称和产品价格。

2 个答案:

答案 0 :(得分:0)

您的代码中有很多错误,我将执行以下操作:

安装/升级请求:

pip3 install --upgrade requests

您的主要问题是containers = page_soup.findAll("div",{"class":"a-fixed-left-grid-inner"})返回一个空列表,因此其他所有操作都将失败,因为它依赖于此“容器”列表。 所以我们不得不稍作改动...

在我在那里的时候,我做了一些改进。您需要使用设置用户代理标头,否则Amazon将503您的请求;请求库更容易使用;通常最好使用attrs={}

您在这里。但是,即使设置用户代理也不是万无一失的,亚马逊很可能会将您的请求视为机器人/抓取工具,在这种情况下,代码会告诉您并退出:

import sys
import requests
from bs4 import BeautifulSoup as soup
url = 'https://www.amazon.com/s/ref=nb_sb_noss_2?url=search- alias%3Daps&field-keywords=graphics+card&rh=i%3Aaps%2Ck%3Agraphics+card'
headers = {
    'User-Agent': 'Mozilla/5.0 (MSIE 10.0; Windows NT 6.1; Trident/5.0)'
}
r = requests.get(url, headers=headers)
s = soup(r.text, 'html.parser')
# We can check for a "you're not a robot" in the page
if s.find('p', attrs={'class': 'a-last'}):
    print(s.find('p', attrs={'class': 'a-last'}).text)
    print('Amazon have spotted we are a scraper - oops!')
    sys.exit(1)

containers = s.find_all('div', attrs={'class': 'a-fixed-left-grid-inner'})
for container in containers:
    product_name = container.find('h2').text
    value = container.find('span', attrs={'class':'a-offscreen'}).text
    print('Product: {}'.format(product_name))
    print('Price:'.format(value))

假设您是机器人/刮板手,亚马逊有很多方式/原因,您将有创造力来解决这个问题。

答案 1 :(得分:0)

问题是您的价格选择器,由于条件不同,您可能需要代码中的条件控制:

value_container = container.findAll("span", {"class":"a-offscreen"})

如下:

1 class="a-offscreen"

enter image description here

2 class="a-size-base a-color-base"

enter image description here