首页 > 编程问答 >Python 搜索和抓取

Python 搜索和抓取

时间:2024-07-26 15:37:31浏览次数:10  
标签:python web-scraping search

我有一个问题想知道是否值得花时间尝试用 Python 来解决。我有一个包含鱼类学名的大型 CSV 文件。我想将该 CSV 文件与大型鱼类形态信息数据库 (www.fishbase.ca) 交叉引用,并让代码返回每条鱼的最大长度。基本上,我需要创建代码来搜索 Fishbase 网站上的每条鱼,然后找到页面上的最大长度信息并以 CSV 文件将其返回给我。最后两部分相对简单,但第一部分是我陷入困境的地方。提前致谢。


当然可以,抓取 FishBase 来获取鱼类的最大长度信息是绝对可行的。方法如下:

1. 导入必要的库

import csv
import requests
from bs4 import BeautifulSoup

2. 创建函数来从 FishBase 中提取最大长度

def get_max_length(scientific_name):
    """从 FishBase 中获取给定鱼类的最大长度。

    Args:
        scientific_name: 鱼类的学名(str)。

    Returns:
        最大长度(str),如果没有找到则返回 None。
    """
    # 将学名格式化为 FishBase URL
    url = f"https://www.fishbase.ca/summary/{scientific_name.replace(' ', '-')}.html"

    try:
        # 获取网页内容
        response = requests.get(url)
        response.raise_for_status()  # 如果请求失败,则引发异常

        # 使用 BeautifulSoup 解析 HTML 内容
        soup = BeautifulSoup(response.content, 'html.parser')

        # 找到包含最大长度的表格行
        max_length_row = soup.find('td', string='Maximum Length').find_next_sibling('td')

        # 从表格行中提取最大长度
        max_length = max_length_row.text.strip()

        return max_length
    except requests.exceptions.RequestException as e:
        print(f"无法获取 {scientific_name} 的数据:{e}")
        return None

3. 读取 CSV 文件并处理每行

# CSV 文件的路径
csv_file = 'fish_names.csv'

# 存储结果的列表
results = []

# 使用 'utf-8' 编码读取 CSV 文件来处理特殊字符
with open(csv_file, 'r', encoding='utf-8') as file:
    reader = csv.reader(file)

    # 跳过标题行(如果有)
    next(reader, None) 

    for row in reader:
        scientific_name = row[0]  # 假设学名在第一列
        max_length = get_max_length(scientific_name)

        # 将结果存储在一个列表中,即使最大长度为 None
        results.append([scientific_name, max_length]) 

# 将结果写入新的 CSV 文件
with open('fish_max_lengths.csv', 'w', newline='', encoding='utf-8') as file:
    writer = csv.writer(file)
    writer.writerow(['Scientific Name', 'Maximum Length'])  # 写入标题行
    writer.writerows(results)

此代码将执行以下操作:

  1. 读取 的 CSV 文件,并将每个学名传递给 get_max_length 函数。
  2. get_max_length 函数:
  3. 根据给定的学名 构建 FishBase URL
  4. 获取 FishBase 页面。
  5. 使用 Beautiful Soup 解析 HTML 内容。
  6. 查找 包含“最大长度”的特定表格单元格,并 提取 最大长度值。
  7. 返回 最大长度。
  8. 学名和提取的最大长度 写入 一个新的 CSV 文件。

重要提示:

  • 在抓取网站之前, 请务必检查其使用条款
  • 网站的结构可能会发生变化,因此可能需要相应地 调整代码
  • 如果抓取过程发送大量请求,请考虑在请求之间 添加延迟 ,以避免给服务器造成过大的负载。

此脚本可以帮助从 FishBase 中提取鱼类的最大长度信息。

标签:python,web-scraping,search
From: 28028327

相关文章

  • 《最新出炉》系列入门篇-Python+Playwright自动化测试-54- 上传文件(input控件) - 上篇
    1.简介在实际工作中,我们进行web自动化的时候,文件上传是很常见的操作,例如上传用户头像,上传身份证信息等。所以宏哥打算按上传文件的分类对其进行一下讲解和分享。2.上传文件的API(input控件)Playwright是一个现代化的自动化测试工具,它支持多种浏览器和操作系统,可以帮助开发人员和......
  • python requests 报错 Caused by ProxyError ('Unable to connect to proxy', OSError
    背景:访问https接口,使用http代理版本:requests:2.31.0 从报错可以看出,是proxy相关的报错调整代码,设定不使用代理,将http与https对应的proxy值置空即可(尝试过proxies={},但此写法不生效)proxies={'http':'','https':''}response = requests.get('https://xxx......
  • python基础函数
    1.为什么使用函数使用函数的目的是去减少代码的冗余性,简化代码的复杂度2.如何去定义一个函数以def开头去进行相关的定义在def的后面我们就去以见明知意的方式去定义一个函数的名称在函数名称后面的括号中去添加参数值,可以是多个参数,也可以是无餐的3.函数的调用无参多......
  • OpenAI深夜发布 SearchGPT:进军大模型搜索领域,挑战谷歌与 Perplexity!
    近期,AI领域竞争愈发激烈,不仅大模型发布频繁,还不断带来新的产品体验。刚刚,OpenAI正式发布了其大模型搜索产品SearchGPT。链接:https://chatgpt.com/searchSamAltman在X上表示:“我们认为搜索功能还有改进的空间。我们推出了一个名为SearchGPT的新原型产品。我......
  • 不使用 + 或 - 运算符 | 添加 2 个数字Python
    我一直在尝试编写逻辑,但测试用例失败。如何改进我的代码?代码:#Giventwointegersaandb,returnthesumofthetwointegerswithoutusingtheoperators+and-.a=-1b=1min_val=min(a,b)max_val=max(a,b)ifmin_val==max_val:pr......
  • python 中的智能 Cisco IOS 差异
    之前:hostnameFoo!interfaceGigabitEthernet1/1switchportmodetrunkswitchporttrunkallowedvlan10,20,30!interfaceGigabitEthernet1/2ipaddress192.0.2.1255.255.255.128noipproxy-arp!之后:hostnameFoo!interfaceGigabitEt......
  • 无法编译 Arduino ESP32 代码:.../python3: exec 格式错误
    昨天我使用MacOSArduinoIDE或VSCode编译Arduino草图没有任何问题。但今天什么也编译不了。我尝试在ArduinoIDE或带有Arduino扩展的VSCode中编译的任何草图都会出现此错误:fork/exec/Library/Frameworks/Python.framework/Versions/3.11/bin/python3:exec......
  • 禁忌搜索(Tabu Search or Taboo Search,TS)算法解决3DTSP问题
     禁忌搜索算法的基本思想:给定一个当前解(初始解)和一种邻域,然后在当前解的邻域中确定若干候选解;若最佳候选解对应的目标值优于“bestsofar”状态,则忽视其禁忌特性,用它替代当前解和“bestsofar”状态,并将相应的对象加入禁忌表,同时修改禁忌表中各对象的任期;若不存在上述候选解......
  • 用Python解析邮件日志
    我的任务有点困难。我有一个邮件日志,如:Oct315:30:18mail1postfix/lmtp[5369]:DB10242054:to=<XXXXX>,orig_to=<XXXXXX>,relay=ip[ip]:port,delay=1.4,delays=0.04/0/0.01/1.4,dsn=2.0.0,status=sent(2502.0.0fromMTA(smtp:[iP]:port):2502.0.0Ok:queueda......
  • Python,Pyinstaller打包含taichi模块的程序
    Python版本3.9、taichi版本1.7.1,pyinstaller版本6.9.0问题描述:正常Pyinstaller打包后报错[Taichi]version1.7.1,llvm15.0.1,commit0f143b2f,win,python3.9.19[Taichi]Startingonarch=x64Traceback(mostrecentcalllast):File"taichi\lang\_wrap_inspec......