自动填写简单的网络表单并检索结果

Autofill simple web form and retrieve result

我有一位同事的任务是将患者样本中的丙型肝炎病毒基因序列提交到特定网站的申请表中,然后识别突变,提供有关潜在耐药性的信息。

这很麻烦,需要几天时间。

我的想法是使用 urllib2 使用 Python 脚本自动执行此操作(我不能使用 mechanize,我必须在 MAC OS 上开发,出于某些原因我不明白 Python setup.py installpip mechanize install 都不起作用 - 所以我必须 urllib2).

我的第一次尝试是访问各自的网站并首先提交样本基因序列。 (在原始网站上,您只需将序列粘贴到名为 "or paste in" 的输入字段中,然后按 "go"。)

在下一页,你会得到结果,我想通过正则表达式读出突变。

我的第一次尝试:

import url lib
import urllib2

url = 'http://hcv.geno2pheno.org/index.php'
form_data = {'or paste in:': 'CTTCACGGAGGCTATGACGAGGTACTCCGCTCCCCCCGGGGACCCCCCCCAACCAGAATACGACTTGGAGCTCATAACATCGTGCTCCTCTAACGTGTCAGTCGCCCACGACGGCGCTGGAAAAAGGGTCTACTACCTTACCCGTGACCCTACAACCCCCCTCGCAAGAGCTGCGTGGGAGACAGCAAGACACACTCCAGTCAATTCCTGGCTAGGCAACATAATCATGTTTGCCCCCACATTGTGGGCGAGAATGATACTGATGACCCACTTCTTCAGTGTCCTCATCGCCAGGGATCAACTTGAACAGGCCCTTGATTGCGAAATCTACGGAGCCTGCTACTCCATTCAACCACTGGACCTACCTCCAATCATTCAAAGACTCCATGGCCTTAGCGCATTTTCACTCCACAGTTACTCTCCAGGTGAAATCAATAGGGTGGCCGCATGCCTCAGGAAACTTGGGGTCCCGCCCTTGCGAGCTTGGAGACACCGGGCCCGGAGCGTCCGCGCTAAGCTTCTGTCCAGAGGAGGCAGGGCTGCCATATGTGGCAAGTACCTCTTCAATTGGGCAGTAAGAACAAAGCTCAAACTCACTCCAATAGCGGCCGCTGGCCAGCTGGACTTGTCCGGCTGGTTCACGGCTGGCTACAGCGGGGGAGACATTTATCACAGCGTGTCTC'}

params = urllib.urlencode(form_data)
response = urllib2.urlopen(url, params)
data = response.read()
print data

我从 "data" 得到的是来自 http://hcv.geno2pheno.org/index.php 的源代码,而不是来自以下结果页面。

因此,我有两个问题:

1) 如何确定我的序列已正确粘贴到输入字段 "or paste in:"?

2) 如何访问结果页面的源代码以便应用正则表达式?

这里有几处错误。首先,您的 form_data 字典中需要更多参数。仅仅因为您只手动填写一个字段并不意味着这是服务器完成您的请求所需的唯一参数。我在下面包含了一个对我有用的 form_data 字典。您关心的主键是 'v3seq'。这是你想要的序列 "paste in".

然后,当您请求页面时,您需要使用 Request 对象并读取该请求的响应。看起来像这样:

import urllib
import urllib2
url = 'http://hcv.geno2pheno.org/index.php'

form_data = {
    'v3seq': 'CTTCACGGAGGCTATGACGAGGTACTCCGCTCCCCCCGGGGACCCCCCCCAACCAGAATACGACTTGGAGCTCATAACATCGTGCTCCTCTAACGTGTCAGTCGCCCACGACGGCGCTGGAAAAAGGGTCTACTACCTTACCCGTGACCCTACAACCCCCCTCGCAAGAGCTGCGTGGGAGACAGCAAGACACACTCCAGTCAATTCCTGGCTAGGCAACATAATCATGTTTGCCCCCACATTGTGGGCGAGAATGATACTGATGACCCACTTCTTCAGTGTCCTCATCGCCAGGGATCAACTTGAACAGGCCCTTGATTGCGAAATCTACGGAGCCTGCTACTCCATTCAACCACTGGACCTACCTCCAATCATTCAAAGACTCCATGGCCTTAGCGCATTTTCACTCCACAGTTACTCTCCAGGTGAAATCAATAGGGTGGCCGCATGCCTCAGGAAACTTGGGGTCCCGCCCTTGCGAGCTTGGAGACACCGGGCCCGGAGCGTCCGCGCTAAGCTTCTGTCCAGAGGAGGCAGGGCTGCCATATGTGGCAAGTACCTCTTCAATTGGGCAGTAAGAACAAAGCTCAAACTCACTCCAATAGCGGCCGCTGGCCAGCTGGACTTGTCCGGCTGGTTCACGGCTGGCTACAGCGGGGGAGACATTTATCACAGCGTGTCTC',
    'H77Switch': '1',
    'ignore_sgtSwitch': '1',
    'alignwidth': '3',
    'action': '1',
    'go': 'Go',
    'viewResults': '1',
    'viewResSec': 'Prediction'
}

data = urllib.urlencode(form_data)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
html_data = response.read()

然后您可以从响应中抓取数据并应用您的正则表达式。如果你能让你的 pip 正常工作,我还建议你看看 BeautifulSoup - 它是从 html.

抓取数据的优秀库