首页 > 解决方案 > 如何将数据发布到立即将您重定向到另一个网站的网站

问题描述

我想在这个网站上进行批处理,但是它没有为用户提供批处理模式,所以我正在考虑使用python提交任务。

我对python的网络抓取并不熟悉。我在 Youtube 上看了几个视频,也在这里查看了很多帖子,我可以通过在浏览器上单击鼠标成功登录某些网站,检查元素,去网络,看看我应该在里面放什么数据POST 方法。

但是,这个网站,在你提交任务后,会立即为你打开一个新的 url,并且在 Network 流程中没有任何 POST 的迹象。我已经花了几个小时尝试,但仍然不知道如何处理这个网站。谁能帮我这个?

在数据字典中我已经删除了电子邮件,您可以输入自己的电子邮件地址。如果您成功地将任务发布到此服务器,您应该会收到一封电子邮件,通知您何时完成。

import requests

url1 = 'http://rna.physics.missouri.edu/vfold3D/index.html'

sequence = 'UCGGACCAUCAGGAGAAAUCCAAUGGAAAACAGGGAAACCCUAAAAGCAAUUUUGGAAGUUUAAAACCGA'
bps = '.((((((((..(((....))).)))).((((.(((...))).((((....))))....))))....))))'
jobname = 'A trial'

data = {}
data['sequence'] = sequence
data['bps'] = bps
data['jobname'] = jobname
data['email'] = ''  # give an email address to receive the result

req1 = requests.post(url1, data=data)

print(req1.status_code)

状态码是 200,但我没有收到电子邮件,所以我认为我没有成功地向它发布任何内容。

正如我所说,我不知道应该发送到服务器的正确数据是什么,因为我在网络流中没有看到任何 POST 的痕迹,而且我从来没有学过任何关于 html 的知识,所以一无所知关于这个网站的结构...

标签: pythonpython-3.xweb-scraping

解决方案


当您req1.contents使用jobname = 'A trial'参数打印响应时,您会收到一个错误页面,提示作业名称中有空格/无效字符。

Please wait...<br>
<br>
Your input jobname: <br>
A trial
<br>
<br>
<font color="red" size="3">contains non-alphanumeric characters.</font><br>
<br>
</body>
</html>

您必须删除这些空格。

这有效,并为您提供了检查结果的 URL:

import re
import requests

server_url = 'http://rna.physics.missouri.edu/vfold3D/3D_run.pl'

sequence = 'UCGGACCAUCAGGAGAAAUCCAAUGGAAAACAGGGAAACCCUAAAAGCAAUUUUGGAAGUUUAAAACCGA'
bps = '.((((((((..(((....))).)))).((((.(((...))).((((....))))....))))....))))'
jobname = 'Atrial'

data = {
    'sequence': sequence,
    'bps': bps,
    'jobname': jobname,
    'email': ''
}

res = requests.post(server_url, 
                    data=data, 
                    headers={'referer': 'http://rna.physics.missouri.edu/vfold3D/index.html'})
result_url = re.search('<META HTTP-EQUIV=refresh CONTENT="0;URL=([^"]+)', res.text).group(1)
print(result_url)

输出:

http://rna.physics.missouri.edu/OUTPUT/3D_Atrial.E6SY.html

然后,您可以访问该 URL 并获取.pdb文件。

import requests
import re
from urllib.parse import urljoin

res =  requests.get('http://rna.physics.missouri.edu/OUTPUT/3D_Atrial.E6SY.html')
pdb_path = re.search('<a href="(.*\.pdb)">', res.text).group(1)
pdb_url = urljoin(res.url, pdb_path)
print(pdb_url)

输出:

http://rna.physics.missouri.edu/OUTPUT/3D_Atrial.E6SY.3d_struct.pdb

注意:由于这些页面看起来不会很快重新设计,并且结构相对简单,因此使用re刮掉一些URL是完全可以的。但是使用 BeautifulSoup 或其他 HTML 解析器是正确的方法。


推荐阅读