Python搜索和Scrape

时间:2015-01-19 15:43:01

标签: python search scrape

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

2 个答案:

答案 0 :(得分:1)

看起来您可以直接从属和种中生成网址,即

虹鳟鱼(oncorhynchus mykiss)成为

http://www.fishbase.ca/summary/Oncorhynchus-mykiss.html

类似

def make_url(genus, species):
    return (
        "http://www.fishbase.ca/summary/{}-{}.html"
        .format(genus.title(), species.lower())
    )

查看页面源代码,html严重缺乏语义;虽然使用正则表达式解析html是邪恶而可怕的,但我认为它是这种情况下最简单的方法:

import re

fishlength = re.compile("max length : ([\d.]+) ([cm]{1,2})", re.I).search

def get_length_in_cm(html):
    m = fishlength(html)
    if m:     # match found
        value = float(m.group(1))
        unit  = m.group(2)
        if unit == "cm":
            return value
        elif unit == "m":
            return value * 100.
        else:
            raise ValueError("Unknown unit: {}".format(unit))
    else:
        raise ValueError("Length not found")

然后抓住每一页,

import csv
import requests
from time import sleep

DELAY = 2
GENUS_COL = 4
SPECIES_COL = 5

with open("fish.csv") as inf:
    next(inf)  # skip header row
    for row in csv.reader(inf):
        url  = make_url(row[GENUS_COL], row[SPECIES_COL])

        # should add error handling, in case
        #   that page doesn't exist
        html = requests.get(url).text

        length = get_length_in_cm(html)

        # now store the length value somewhere

        # be nice, don't pound their site
        sleep(DELAY)

答案 1 :(得分:0)

因此,为了在其他Web应用程序中使用这些信息,您需要使用API​​来获取其数据。

Fishbase.ca(或.org)没有官方面向公众的API。有一些chat in 2013关于创建一个RESTful API,它只是你需要的门票,但这还没有发生(不要屏住呼吸)。

另一种方法是使用您需要查找的鱼的名称,将其放入URI(例如www.fishbase.ca/fish/Rainbow+Trout),然后使用Xquery或类似方法深入研究DOM以查找最大长度。

不幸的是,fishbase没有这种方法所需的URI,this是Rainbow Trout的URI - 使用ID而不是名称来轻松查找。

我建议寻找另一个寻找这两个API的数据提供者。

关于第二种方法:网站所有者可能不会以这种方式告知您使用他们的网站。如果可以,请事先询问他们。