python - 如何将数据发布到立即将您重定向到另一个网站的网站
问题描述
我想在这个网站上进行批处理,但是它没有为用户提供批处理模式,所以我正在考虑使用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 的知识,所以一无所知关于这个网站的结构...
解决方案
当您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 解析器是正确的方法。
推荐阅读
- google-chrome - 作为初学者,我从哪里开始学习编写 chrome 扩展程序?
- c# - 如何使用 BotFramework 发送主动消息,该消息将触发 Teams 警报并显示在“活动”选项卡中?
- python - Pandas - 删除重复项 - 没有属性?
- python - 尝试打印时不显示张量名称
- python - 将列中的科学计数法转换为十进制并将十进制转换为整数而不进行四舍五入
- javascript - 初始化对象时,javascript属性名称中的双方括号有什么意义?
- css - 将鼠标悬停在图像上方时会导致图像比例变大的问题。(我使用ease-in-out,但在“out”中它并不像我想要的那样慢)
- c# - 如何让集成测试项目使用不同的连接字符串?
- java - 在 Spring MVC 项目中使用休眠验证器分组跳过一些更新场景所需的验证
- arduino - 是否有使用 CH340 驱动程序的 Arduino Uno R3 的 webUSB 工作代码示例?