如何在网络抓取时继续循环
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在网络抓取时继续循环相关的知识,希望对你有一定的参考价值。
我编写了一个简单的脚本,以探索如何使用python进行Web抓取。我选择了这个网址:https://www.ebay.co.uk/b/Mens-Coats-Jackets/57988/bn_692010
页面中有48个项目,每个项目都有品牌,风格等细节,除了第16项,我的代码在第16项时停止。所以我的问题是如何继续这个循环或者我怎么说传递这些细节。这是我在下面的代码;
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
my_url = 'https://www.ebay.co.uk/b/Mens-Coats-Jackets/57988/bn_692010'
#opening up connection, grabbing the page
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
# html parsing
page_soup = soup(page_html, 'html.parser')
#grabs each product
containers = page_soup.findAll('div',{'class':'s-item__wrapper clearfix'})
filename = 'ebayproducts1.csv'
f = open(filename, 'w+')
headers = 'product_name, item_price, item_style, shipping_detail
'
f.write(headers)
contain = containers[0]
container = containers[0]
for container in containers:
product_name = container.h3.text
item_details_container = container.findAll('div',{'class':'s-item__details clearfix'})
item_price = item_details_container[0].div.text
item_style = item_details_container[0].findAll('span',{'class':'s-item__detail s-item__detail--secondary'})[0].text
shipping_detail = item_details_container[0].findAll('span',{'class':'s-item__shipping s-item__logisticsCost'})[0].text
print('product_name: '+ product_name)
print('item_price: ' + item_price)
print('item_style: ' + item_style)
print('shipping_detail: ' + shipping_detail)
f.write("%s,%s,%s,%s
" %( product_name, item_price, item_style, shipping_detail))
答案
您可能在containers
列表中遇到与您要搜索的所有其他元素不同的元素或标记。
您可以通过在containers
方法中更改搜索参数来更改指定soup.findAll()
列表的方式。
尝试打印containers
并找出该列表中第16项不同的原因,并相应地调整搜索。
或者,你可以使用try,除了这样的东西:
for container in containers:
try:
product_name = container.h3.text
item_details_container = container.findAll('div',{'class':'s-item__details clearfix'})
item_price = item_details_container[0].div.text
item_style = item_details_container[0].findAll('span',{'class':'s-item__detail s-
item__detail--secondary'})[0].text
shipping_detail = item_details_container[0].findAll('span',{'class':'s-item__shipping s-item__logisticsCost'})[0].text
# etc ...
except <name of your error here, eg. TypeError>:
print(f'except triggered for {container}')
另一答案
你是正确的,有些项目不存在,你不能在所有情况下单独测试位置或选择器,例如样式。您可以测试容器文本中存在的样式。拥有更多Python知识的人可能可以将其整理成更加pythonic和高效的东西
import requests
from bs4 import BeautifulSoup as bs
import re
import pandas as pd
pattern = re.compile(r'Style:')
url = 'https://www.ebay.co.uk/b/Mens-Coats-Jackets/57988/bn_692010?_pgn=1'
res = requests.get(url)
soup = bs(res.content, 'lxml')
results = []
for item in soup.select('.s-item'):
x = item.select_one('.s-item__title')
title = x.text if x else None
x = item.select_one('.s-item__price')
price = x.text if x else None
x = item.select_one('.s-item__shipping')
shipping = x.text if x else None
x = item.find('span', text=pattern)
style = x.text.replace('Style: ','') if x else None
results.append([title, price, shipping, style])
df = pd.DataFrame(results)
print(df)
以上是关于如何在网络抓取时继续循环的主要内容,如果未能解决你的问题,请参考以下文章