首页 > 编程问答 >如何按页抓取不同位置的元素

如何按页抓取不同位置的元素

时间:2024-08-01 15:22:16浏览次数:12  
标签:python web-scraping beautifulsoup element

我正在抓取位于页面不同位置的元素。我当前的代码有些工作,但会随机不返回该值。当我设置 seller = None 时,它​​会生成值 None 的其他实例,而它应该是卖家名称。

我的目标是根据唯一位置抓取 100 个页面以获取单个元素(并继续添加新的元素)元素的位置)并且如果元素不在页面上,则元素等于 None。

我尝试过 for 语句、if / else 语句,最近使用 try / except 第一次尝试并得到了一些工作代码(感谢 stackoverflow)查看元素是否位于特定区域,如果不在,则移动到另一个区域。再说一次,这不是 100% 有效。

soup = BeautifulSoup(r.text, 'lxml')
if url == product_url:
  try:
    loc1 = soup.find('div', attrs={'id':'availability-brief', 'class':'a- 
    section a-spacing-none'})

    seller = loc1.find('a', href=re.compile('dp_merchant'), attrs= 
    {'id':'sellerProfileTriggerId'}).text.strip()

  except:
     try:
       loc2 = soup.find('div', attrs={'id':'sns-availability', 'class':'a- 
       section a-spacing-none'})

       seller = loc2.find('span', text = re.compile('text'), attrs= 
       {'class':'a-size-base'}).text.strip()

     except:
       seller = None

  print(seller)
  prod_dict = {'seller':seller}
  print(url)
  print(prod_dict)

当使用我的代码时,我将获取卖家名称,如果不存在,它将返回无,但当实际卖家名称存在时,将其他返回值设置为“无”。如果再次运行该代码,它可能不会像以前那样返回卖家名称。例如:运行 1 ,第 1 页:卖家名称 = foo.运行 2,第 1 页:卖家名称 = 无。 我希望代码搜索指定的位置并返回文本,如果不在指定的位置,则 seller = None 并继续浏览所有页面。并且还能够在发现新位置时添加它们。谢谢!


我明白你想做的事情了。你遇到的问题是在抓取网页数据时很常见的,尤其是当网页结构不一致的时候。让我们来优化一下你的代码,使其能够更稳定地抓取卖家信息。

改进后的代码:

import re
from bs4 import BeautifulSoup

def extract_seller(soup):
  """
  从BeautifulSoup对象中提取卖家信息。

  Args:
    soup: BeautifulSoup对象,表示产品页面。

  Returns:
    字符串:卖家名称,如果找不到则返回None。
  """

  # 尝试第一个位置
  loc1 = soup.find('div', attrs={'id':'availability-brief', 'class':'a-section a-spacing-none'})
  if loc1:
    seller_link = loc1.find('a', href=re.compile('dp_merchant'), attrs={'id':'sellerProfileTriggerId'})
    if seller_link:
      return seller_link.text.strip()

  # 尝试第二个位置
  loc2 = soup.find('div', attrs={'id':'sns-availability', 'class':'a-section a-spacing-none'})
  if loc2:
    seller_span = loc2.find('span', text=re.compile('Sold by'), attrs={'class':'a-size-base'})
    if seller_span:
      # 注意:这里需要根据实际情况调整正则表达式,提取卖家名称
      seller_name = re.search(r'Sold by\s*(.*)', seller_span.text.strip()).group(1)
      return seller_name

  # 如果都找不到,返回None
  return None


# 示例用法
prod_dicts = []
for page_num in range(1, 101):  # 抓取100个页面
  # 构建页面URL(你需要根据实际情况修改)
  url = f'https://www.example.com/products?page={page_num}'

  # 发送请求并解析页面
  r = requests.get(url)
  soup = BeautifulSoup(r.text, 'lxml')

  seller = extract_seller(soup)
  prod_dict = {'seller': seller, 'url': url}
  prod_dicts.append(prod_dict)
  print(prod_dict)

代码解释:

  1. 函数化: 我们把提取卖家信息的逻辑封装到 extract_seller 函数中,使代码更清晰易懂。
  2. 逐步检查: 在每个位置,我们先检查是否存在对应的 div 元素,然后再查找卖家信息,避免了 AttributeError 的发生。
  3. 正则表达式: 使用更精确的正则表达式 re.compile('Sold by') 来查找第二个位置的卖家信息。
  4. 循环抓取: 使用循环来遍历所有页面,并将提取到的信息存储到 prod_dicts 列表中。

其他建议:

  • 使用try-except: 可以考虑在 requests.get(url) soup = BeautifulSoup(r.text, 'lxml') 周围添加 try-except 语句,以捕获网络请求和页面解析过程中可能出现的错误。
  • 添加延迟: 为了避免给服务器造成过大压力,建议在每次请求之间添加一些延迟,例如使用 time.sleep(1)
  • 检查网页结构: 在编写代码之前,最好先仔细观察目标网页的结构,找出卖家信息的具体位置和规律。

希望这些改进能够帮助你更稳定地抓取到卖家信息!如果你还有其他问题,请随时提出。

标签:python,web-scraping,beautifulsoup,element
From: 56690965

相关文章

  • C++11 中的 python 海象运算符 (:=) 等效吗?
    最近我在Python中经常使用:=运算符,这样:ifmy_object:=SomeClass.function_that_returns_object():#dosomethingwiththisobjectifitexistsprint(my_object.some_attribute)问题有没有办法在c++11中做到这一点而不使用stdlib?例如......
  • Python 自动创建阿里云 OSS 桶并配置静态网站托管
    在本文中,我们将介绍如何使用Python和阿里云OSSSDK自动创建OSS桶(如果不存在),并为新创建的桶配置静态网站托管。这对于自动化部署和管理静态网站非常有用。前提条件安装阿里云OSSSDK:pipinstalloss2准备好阿里云OSS的访问密钥(AccessKeyID和AccessKeySecret......
  • visual studio 2019下Python的开发环境搭建
    Python的开发环境有各种各样的,在Windows下可以通过各种IDE(IIntegratedDevelopmentEnvironment)来进行开发,比如Pycharm,Spyder,Thonny,Eclipse+PyDev等等一些琳琅满目的编辑器,当然还有我的选择VisualStudio。之所以会选择VS,是因为VS本身就是一个功能非常强大的集成开发环境,其优......
  • 用Python编写你的网络监控系统详解
    概要在现代网络管理中,实时监控网络流量和状态是保证网络正常运行的关键。使用Python编写网络监控工具可以帮助管理员及时发现和解决网络问题。本文将详细介绍如何使用Python编写网络监控工具,包括基本概念、常用库及其应用场景,并提供相应的示例代码。网络监控的基本概念网......
  • Python WSGI服务器库之gunicorn使用详解
    概要在部署PythonWeb应用程序时,选择合适的WSGI服务器是关键的一步。Gunicorn(GreenUnicorn)是一个高性能、易于使用的PythonWSGIHTTP服务器,适用于各种应用部署场景。Gunicorn设计简洁,支持多种工作模式,能够有效地管理和处理大量并发请求。本文将详细介绍Gunicorn......
  • 基于python电影播放平台的设计与实现【源码+文档+PPT】
    ......
  • Python中FastAPI项目使用 Annotated的参数设计
    在FastAPI中,你可以使用PEP593中的Annotated类型来添加元数据到类型提示中。这个功能非常有用,因为它允许你在类型提示中添加更多的上下文信息,例如描述、默认值或其他自定义元数据。FastAPI支持Annotated类型,这使得你可以为路径操作函数的参数提供额外的元数据,例如依赖项、查询参......
  • 三种语言实现计算二进制中1的个数(C++/Python/Java)
    题目给定一个长度为n的数列,请你求出数列中每个数的二进制表示中1的个数。输入格式第一行包含整数n。第二行包含n个整数,表示整个数列。输出格式共一行,包含n个整数,其中的第i个数表示数列中的第i个数的二进制表示中1的个数。数据范围1≤n≤100000,0≤数列中......
  • 三种语言实现双指针判断子序列(C++/Python/Java)
    题目给定一个长度为n的整数序列a1,a2,…,an以及一个长度为m的整数序列b1,b2,…,bm。请你判断a序列是否为b序列的子序列。子序列指序列的一部分项按原有次序排列而得的序列,例如序列{a1,a3,a5}是序列{a1,a2,a3,a4,a5}的一个子序列。输入格式第一行包含两个整数......
  • 三种语言实现双指针解决数组元素的目标和(C++/Python/Java)
    题目给定两个升序排序的有序数组A和B,以及一个目标值x。数组下标从0开始。请你求出满足A[i]+B[j]=x的数对(i,j)。数据保证有唯一解。输入格式第一行包含三个整数n,m,x,分别表示A的长度,B的长度以及目标值x。第二行包含n个整数,表示数组A。第三行包含m个整数......