web抓取Newegg-Python

web抓取Newegg-Python,python,web-scraping,Python,Web Scraping,我目前正在用python编写代码,使用BS4从网页中获取html代码。基本上,我开始从网站上提取价格和名称,而且效果很好。然后我知道的下一件事就是它停止工作,即使我根本没有更改代码。目前我只是想知道有没有办法修复这个问题以及到底发生了什么。说到这些,我是新手,我只是想通过我的这个小项目来提高我的编码技能,这个项目的价格和型号都比newegg上的GPU便宜。我确实查了一下,试图在手边找到答案。。。。但正如我所说,我是一个新手,可能不知道术语(我自学)。 这是我的代码,如果你想看看我做了什么: fr

我目前正在用python编写代码,使用BS4从网页中获取html代码。基本上,我开始从网站上提取价格和名称,而且效果很好。然后我知道的下一件事就是它停止工作,即使我根本没有更改代码。目前我只是想知道有没有办法修复这个问题以及到底发生了什么。说到这些,我是新手,我只是想通过我的这个小项目来提高我的编码技能,这个项目的价格和型号都比newegg上的GPU便宜。我确实查了一下,试图在手边找到答案。。。。但正如我所说,我是一个新手,可能不知道术语(我自学)。 这是我的代码,如果你想看看我做了什么:

from bs4 import BeautifulSoup
import lxml
import pandas
import requests,re

#webscrape prices off of newegg
r_newegg=requests.get(URL GOES HERE)
c_newegg=r_newegg.content

soup_newegg=BeautifulSoup(c_newegg,"html.parser")
print(soup_newegg)
newegg_price=soup_newegg.find_all("div",{"class":"item-action"})
#newegg_price[0].find("span").next_sibling.next_sibling.text ## this is the way to find the price
newegg_name=soup_newegg.find_all("a",{"class":"item-title"})
print(newegg_name.find("a").text)
print(newegg_name[0].find("a"))
newegg=[]

for price,name in zip(newegg_price,newegg_name):#don't forget to use zip to iterate through two lists
    d={}
    try:
        d["Price"]=price.find("span").next_sibling.next_sibling.text
    except:
        pass

    

在访问页面几次后,由于网站使用,因此刮削页面停止工作

当web刮取停止工作时,您可以通过在浏览器中手动打开URL来验证这一点,这可能会显示类似以下内容的reCaptcha bot警告: 但是,在web浏览器中手动访问页面后(可能需要选中“我不是机器人”表单),您应该能够再次运行代码并刮取页面

至于从页面中抓取数据,并检索商品名称和价格,这段代码应该可以完成这项工作。为了便于读取结果,我添加了一些字符串输出编号和格式:

items = soup.find_all('div', {'class':'item-container'})

names = []
prices = []

for item in items:
    names.append(item.find('a', {'class': "item-title"}).text.strip('\n').strip(' ').strip('\n'))
    for price in item.find_all('li', {'class': 'price-current'}):
        prices.append(''.join([price.strong.text.strip(), price.sup.text.strip()]))

items_prices = zip(prices, names)

for n, (price, item) in enumerate(items_prices):
    print 'Item #{n}: {p} : {i}'.format(n=n+1, p=price, i=item)
输出:

Item #1: 139.99 : EVGA GeForce GTX 1050 FTW GAMING ACX 3.0, 02G-P4-6157-KR, 2GB GDDR5, DX12 OSD Support (PXOC)
Item #2: 699.99 : GIGABYTE GeForce GTX 1080 Ti DirectX 12 GV-N108TGAMING OC-11GD 11GB 352-Bit GDDR5X PCI Express 3.0 x16 ATX Video Card
Item #3: 119.99 : GIGABYTE GeForce GTX 1050 DirectX 12 GV-N1050OC-2GD 2GB 128-Bit GDDR5 PCI Express 3.0 x16 ATX Video Card
Item #4: 159.99 : GIGABYTE GeForce GTX 1050 Ti DirectX 12 GV-N105TWF2OC-4GD 4GB 128-Bit GDDR5 PCI Express 3.0 x16 ATX Video Card
Item #5: 139.99 : GIGABYTE GeForce GTX 1050 Ti DirectX 12 GV-N105TD5-4GD 4GB 128-Bit GDDR5 PCI Express 3.0 x16 ATX Video Cards
Item #6: 809.99 : EVGA GeForce GTX 1080 Ti SC2 HYBRID GAMING, 11G-P4-6598-KR, 11GB GDDR5X, HYBRID & LED, iCX Technology - 9 Thermal Sensors
...
Item #35: 109.99 : ZOTAC GeForce GTX 1050 DirectX 12 ZT-P10500A-10L 2GB 128-Bit GDDR5 PCI Express 3.0 HDCP Ready Video Card
Item #36: 719.99 : ASUS GeForce GTX 1080 Ti DirectX 12 TURBO-GTX1080TI-11G 11GB 352-Bit GDDR5X PCI Express 3.0 HDCP Ready SLI Support Video Card

希望这能有所帮助。

由于网站使用的是新功能,因此在访问页面几次后,抓取页面将停止工作

当web刮取停止工作时,您可以通过在浏览器中手动打开URL来验证这一点,这可能会显示类似以下内容的reCaptcha bot警告: 但是,在web浏览器中手动访问页面后(可能需要选中“我不是机器人”表单),您应该能够再次运行代码并刮取页面

至于从页面中抓取数据,并检索商品名称和价格,这段代码应该可以完成这项工作。为了便于读取结果,我添加了一些字符串输出编号和格式:

items = soup.find_all('div', {'class':'item-container'})

names = []
prices = []

for item in items:
    names.append(item.find('a', {'class': "item-title"}).text.strip('\n').strip(' ').strip('\n'))
    for price in item.find_all('li', {'class': 'price-current'}):
        prices.append(''.join([price.strong.text.strip(), price.sup.text.strip()]))

items_prices = zip(prices, names)

for n, (price, item) in enumerate(items_prices):
    print 'Item #{n}: {p} : {i}'.format(n=n+1, p=price, i=item)
输出:

Item #1: 139.99 : EVGA GeForce GTX 1050 FTW GAMING ACX 3.0, 02G-P4-6157-KR, 2GB GDDR5, DX12 OSD Support (PXOC)
Item #2: 699.99 : GIGABYTE GeForce GTX 1080 Ti DirectX 12 GV-N108TGAMING OC-11GD 11GB 352-Bit GDDR5X PCI Express 3.0 x16 ATX Video Card
Item #3: 119.99 : GIGABYTE GeForce GTX 1050 DirectX 12 GV-N1050OC-2GD 2GB 128-Bit GDDR5 PCI Express 3.0 x16 ATX Video Card
Item #4: 159.99 : GIGABYTE GeForce GTX 1050 Ti DirectX 12 GV-N105TWF2OC-4GD 4GB 128-Bit GDDR5 PCI Express 3.0 x16 ATX Video Card
Item #5: 139.99 : GIGABYTE GeForce GTX 1050 Ti DirectX 12 GV-N105TD5-4GD 4GB 128-Bit GDDR5 PCI Express 3.0 x16 ATX Video Cards
Item #6: 809.99 : EVGA GeForce GTX 1080 Ti SC2 HYBRID GAMING, 11G-P4-6598-KR, 11GB GDDR5X, HYBRID & LED, iCX Technology - 9 Thermal Sensors
...
Item #35: 109.99 : ZOTAC GeForce GTX 1050 DirectX 12 ZT-P10500A-10L 2GB 128-Bit GDDR5 PCI Express 3.0 HDCP Ready Video Card
Item #36: 719.99 : ASUS GeForce GTX 1080 Ti DirectX 12 TURBO-GTX1080TI-11G 11GB 352-Bit GDDR5X PCI Express 3.0 HDCP Ready SLI Support Video Card

希望这有帮助。

您能提供url吗?首先要检查的是:1。我的IP/bot是否被禁止,2。网站更改了吗?[link]-Visnav-游戏-视频卡\u 1您如何检查您的IP或bot是否被禁止?我仍然可以访问该网页,提前感谢您在访问该网页几次后,该网页停止工作,因为该网站使用。当代码停止工作时,您可以尝试打开链接,检查您的IP或bot是否被禁止。它停止为我工作,我得到了这个。你能提供网址吗?首先要检查的是:1。我的IP/bot是否被禁止,2。网站更改了吗?[link]-Visnav-游戏-视频卡\u 1您如何检查您的IP或bot是否被禁止?我仍然可以访问该网页,提前感谢您在访问该网页几次后,该网页停止工作,因为该网站使用。当代码停止工作时,您可以尝试打开链接,检查您的IP或bot是否被禁止。这对我来说已经不起作用了,我得到了这个,很棒的答案。非常感谢你能分享这些知识。非常棒的回答。非常感谢你分享这些知识。