5
\$\开始组\$

我已经做了简单的网页抓取,想确保我的所有步骤都是正确的吗?它被认为是干净的代码吗?有没有更好的方法来使用多页抓取功能?

导入请求从bs4导入BeautifulSoup进口熊猫作为pd定义main():数据=[]对于范围(1,51)中的page_num:url=f’https://books.toscrape.com/catalogue/page-{page_num}.html“headers={'user-agent':'Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/124.0.0.0 Safari/537.36'}response=requests.get(url,headers=headers)汤=BeautifulSoup(response.content,“lxml”)books=soup.find_all('article',class_='product_pod')对于书中之书:name=book.find('img').attrs['alt']price=book.find('p',class_='price_color').text.strip()链接='https://books.toscrape.com/'+book.find('a').attrs['href']stock=book.find('p',class_='库存可用性').text.strip()data.append([名称、价格、链接、股票])df=pd.DataFrame(数据,列=[“名称”,“价格”,“链接”,“股票”])df.to_csv('data.csv')main()
\$\端组\$
2
  • 7
    \$\开始组\$ 欢迎来到代码审查!为了帮助评论员给你更好的答案,我们需要知道代码的目标是什么。请在问题中添加足够的上下文来描述目的代码的。我们想知道为什么远远超过怎样。你告诉我们的越多你的代码是为了什么,评论员就越容易帮助你。也,编辑这个标题简单地总结任务,而不是您对代码的担忧。 \$\端组\$ 5月9日9:58
  • \$\开始组\$ 这里没有什么可回顾的。我会说把它做完黑色薄片8,给函数取一个更好的名称,你就很好了。 \$\端组\$
    – 戈伦
    5月9日15:04

3个答案3

重置为默认值
7
\$\开始组\$

我同意这里没有什么可回顾的。不过有两个提示:使用请求。会话()并始终检查状态代码。如果不是200,则请求未成功。您不应该继续解析。

在上述页面中,还解释了如何实现重试瞬时误差情况下的特性。

问题是,如果在脚本中间发生错误(发生这种情况的可能性相当高),那么就会发生异常,您将丢失所有已擦除的数据。

最好有一个小的专用函数,并像这样在循环中调用它:

对于范围(1,51)中的page_num:结果=fetch_page(page_num:int):。。。

在每次迭代时将数据追加到CSV文件中,而不是在末尾批量追加。使用:df.to_csv('data.csv',mode='a').

代码本身很短,也很容易阅读和理解。缺少的是异常处理。不仅是为了满足客人的要求,还为了提供美味汤。您期望的HTML标记可能并不总是存在。您的代码通常会崩溃,但也可能返回None,这不是您想要的。

不要返回列表,而是使用更灵活的方法,比如namedtuple、自定义类甚至dict,这样您就可以插入更多字段或更改顺序,而无需重写上游代码。

如果您有更广泛的需求,请考虑使用以下工具刮擦,这样你就不会白白地重新发明轮子。

\$\端组\$
5
\$\开始组\$

自从您的数据流只是使用默认范围索引,我建议忽略带有索引=假保存时:

df.to_csv('data.csv',索引=False)

否则,每当有人试图用read_csv('data.csv'),他们将得到一个“未命名:0”列,该列仅与索引重复:

>>>pd.read_csv('data.csv')#未命名:0名称价格链接股票#0 0阁楼上的灯51.77英镑https://books.toscrape.com/a-light-in-the-atti。。。有现货的#11向天鹅绒小费53.74英镑https://books.toscrape.com/tipping-the-velvet_。。。有现货的# ..         ...                   ...     ...                                                ...       ...

这是一个常见/恼人的问题:

如何删除从CSV文件读入的熊猫数据帧中的“未命名:0”列?

我有一种情况,有时当我从df中读取csv时,会得到一个不需要的类似索引的列,名为Unnamed:0。

这太烦人了!有人知道如何解决这个问题吗?

是的,未来用户可以通过指定read_csv('data.csv',index_col=0),但这只是一个不必要的烦恼,可以从一开始就通过正确保存一次来防止。


还有一些格式错误:

  • 不要在默认参数(例如。,class_=“product_pod”->class_='product_pod')
  • 除非需要(例如。,“lxml”是双倍的,而其他一切都是单一的)
  • 在逗号后使用空格(例如。,范围数据.附件缺少一些空格)
\$\端组\$
5
\$\开始组\$

我希望看到一些通用的东西,使这个代码在未来更容易使用。

  • 而不是主要的做我会做的所有工作主要的调用一个或多个其他方法(使用描述性名称,例如。刮擦_页面)
  • (1,51)-什么是51? (巧妙的问题,这是一个幻数)它可能会改变吗?这可能是刮擦_页面例如def scrape_pages(最大页面)
  • 你正在设置标题在每个页面上循环迭代-看起来像是浪费了工作
  • 我可能会将“页面浏览”主体和“书籍浏览”主体分解为各自的方法。我意识到,实施这一点可能会否定我之前的观点。
  • 我可能也会刮擦_页面返回数组,然后由调用代码决定如何处理它,例如。写入到csv

请注意,我不是一个Python人,也不熟悉美容师。这些只是我直接的代码清洁想法。

\$\端组\$

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.