anden3 icon

Order Finder

anden3 | PRO | 01/25/17 04:26:30 PM UTC | 0 ⭐ | 509 👁️ | Never ⏰ | []
Python |

6.13 KB

|

None

|

0 👍

/

0 👎

import re
import json
import openpyxl
import requests
 
from lxml import html
 
 
def search_fauna_eu(genus=None, species=None):
    query = []
 
    if genus is not None:
        query.append(genus)
 
    if species is not None:
        query.append(species)
 
    page = requests.get("http://www.fauna-eu.org/cdm_dataportal/search/results/taxon",
        headers={
            'User-Agent': 'Species Finder/0.1 ([email protected])'
        },
        cookies={
            'has_js': '0'
        },
        params={
            'query': ' '.join(query),
            'ws': 'portal/taxon/find',
            'search[doTaxa]': '1',
            'search[doSynonyms]': '',
            'search[doTaxaByCommonNames]': ''
        }
    )
 
    tree = html.document_fromstring(page.text)
    tree.make_links_absolute("http://www.fauna-eu.org/cdm_dataportal/search/results/taxon")
    results = tree.xpath("//a[@class='nameAuthorPart']")
 
    if len(results) == 0:
        page = requests.get("http://www.fauna-eu.org/cdm_dataportal/search/results/taxon",
            headers={
                'User-Agent': 'Species Finder/0.1 ([email protected])'
            },
            cookies={
                'has_js': '0'
            },
            params={
                'query': " AND ".join(query),
                'ws': 'portal/taxon/search',
                'search[doTaxa]': '1',
                'search[doSynonyms]': '1',
                'search[doMisappliedNames]': '1',
                'search[doTaxaByCommonNames]': '1'
            }
        )
 
        tree = html.document_fromstring(page.text)
        tree.make_links_absolute("http://www.fauna-eu.org/cdm_dataportal/search/results/taxon")
 
        results.extend(tree.xpath("//a[@class='nameAuthorPart']"))
 
    for r in results:
        item = r.get('href')
 
        page = requests.get(item,
            headers={
                'User-Agent': 'Species Finder/0.1 ([email protected])'
            },
            cookies={
                'has_js': '0'
            }
        )
 
        tree = html.document_fromstring(page.text)
        order_results = tree.xpath("//ul[@id='classification-breadcrumbs']/li[7]/a")
 
        if len(order_results) > 0:
            return order_results[0].text_content()
 
    return None
 
 
def search_col(genus=None, species=None):
    url = "http://www.catalogueoflife.org/col/search/scientific/"
 
    if genus is not None:
        url += "genus/{}/".format(genus)
 
    if species is not None:
        url += "species/{}/".format(species)
 
    url += "fossil/1/match/1"
 
    page = requests.get(url,
        headers={
            'User-Agent': 'Species Finder/0.1 ([email protected])'
        },
        cookies={
            'aci_language=': 'en',
            'treeExtinct': '1',
            'has_js': '0'
        }
    )
 
    tree = html.document_fromstring(page.text)
    tree.make_links_absolute(url)
    results = tree.xpath("//td[@class='field_header_black']/a")
 
    for r in results:
        item = r.get('href')
 
        page = requests.get(item,
            headers={
                'User-Agent': 'Species Finder/0.1 ([email protected])'
            },
            cookies={
                'aci_language=': 'en',
                'treeExtinct': '1',
                'has_js': '0'
            }
        )
 
        tree = html.document_fromstring(page.text)
        order_results = tree.xpath("//td[preceding-sibling::td[text()='Order']]/a")
 
        if len(order_results) > 0:
            return order_results[0].text_content()
 
    return None
 
 
def search_wikipedia(query):
    search = requests.get("https://en.wikipedia.org/w/api.php",
        headers={
            'User-Agent': 'Species Finder/0.1 ([email protected])'
        },
        params={
            'action': 'query',
            'list': 'search',
            'format': 'json',
            'srinfo': '',
            'srsearch': query
        }
    )
 
    order_regex = re.compile(r'<span class="order"><a.+?>([\w ]+?)</a></span>')
 
    for r in json.loads(search.text)['query']['search']:
        url = "https://en.wikipedia.org/wiki/{}".format(r['title'].replace(' ', '_'))
        page = requests.get(url,
            headers={
                'User-Agent': 'Species Finder/0.1 ([email protected])'
            }
        )
 
        r_match = order_regex.search(page.text)
 
        if r_match is None:
            continue
 
        return r_match.group(1)
 
    return None
 
 
def main():
    temp = openpyxl.load_workbook("/Users/mac/Downloads/part2.xlsx").get_sheet_by_name('Tabelle1')
    coleoptera = [str(r[3].value) for i, r in enumerate(temp.rows) if i > 1]
 
    del temp
 
    wb = openpyxl.load_workbook("test.xlsx")
    ws = wb.get_sheet_by_name('OHNE Subspezies')
 
    print("Worksheets loaded.")
 
    for i, row in enumerate(ws.rows):
        if i == 0:
            continue
 
        wb.save('test.xlsx')
 
        order, match, status, genus, subgenus, species, subspecies, author_year = tuple(c.value for c in row)
 
        if order is None:
            print("{:40}".format(genus + " " + species), end="")
 
            if genus in coleoptera:
                ws['A' + str(i + 1)] = "Coleoptera"
                print("{:20}{}".format("Coleoptera", "Cross-Reference"))
                continue
 
            feu_guess = search_fauna_eu(genus, species)
 
            if feu_guess is not None:
                ws['A' + str(i + 1)] = feu_guess
                print("{:20}{}".format(feu_guess, "Fauna-EU"))
                continue
 
            col_guess = search_col(genus, species)
 
            if col_guess is not None:
                ws['A' + str(i + 1)] = col_guess
                print("{:20}{}".format(col_guess, "Catalogue of Life"))
                continue
 
            wiki_guess = search_wikipedia(genus)
 
            if wiki_guess is not None:
                ws['A' + str(i + 1)] = wiki_guess
                print("{:20}{}".format(wiki_guess, "Wikipedia"))
                continue
 
            print("Unknown - A{}".format(i + 1))
 
main()

Comments