【问题标题】:Autofill simple web form and retrieve result自动填充简单的 Web 表单并检索结果
【发布时间】:2015-11-17 15:26:40
【问题描述】:

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

这非常麻烦,需要几天时间。

我的想法是使用urllib2 使用 Python 脚本自动执行此操作(我不能使用 mechanize,我必须在 MAC OS 上进行开发,由于我既不了解 Python setup.py install 也不了解 pip mechanize install 工作的原因 - 所以我必须到urllib2)。

我的第一次尝试是访问相应的网站并首先提交样本基因序列。 (在原始网站上,您只需将序列粘贴到名为“或粘贴”的输入字段中,然后按“开始”。)

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

我的第一次尝试:

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

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

因此,我有两个问题:

1) 如何确定我的序列已正确粘贴到输入字段“或粘贴:”中?

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

【问题讨论】:

  • pip mechanize install 不起作用,因为您将 mechanize 作为第一个参数传递给 pip,而它应该是 pip install mechanize
  • 谢谢威尔伯!但我仍然无法安装它。它总是说我没有权限这样做,即使以管理员身份登录....

标签: python urllib2 autofill


【解决方案1】:

这里有几个问题。首先,您的form_data 字典中需要更多参数。仅仅因为您只手动填写一个字段并不意味着这是服务器完成您的请求所需的唯一参数。我在下面包含了一个对我有用的form_data dict。您关心的主要关键是'v3seq'。这是您要“粘贴”的序列。

然后,当您请求页面时,您需要使用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 抓取数据的优秀库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-05
    • 1970-01-01
    • 2011-10-22
    • 2018-11-28
    • 2014-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多