我正在创建刮刮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)
我正在尝试从亚马逊获得产品名称和产品价格。
答案 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)