用python模拟网页数据提交

zh
zh
zh
26
文章
0
评论
2020-04-1709:05:00 评论 1,720 3308字
摘要

做实验的时候,需要将独立测试集的数据与server跑出结果进行比较,比如下面这个:http://bioinfo.ggc.org/bindn/ 。但是这个server一次只能提交一个fasta文件,如果人工操作比较耗时,而且工作量特别大,因此这里就需要模拟网页的数据提交。

一.思路

下面先来理清下思路。我的目的是通过自己构造post数据来实现数据提交。

当模拟在网页上提交数据时,首先要弄清楚整个数据处理流程,比如发送了什么样的数据,给谁发的等。那么如果我要在网页上提交数据的话,肯定是要传递参数的,所以我们要知道如何查找这些参数,这是最重要的一点。其次,模拟数据提交,必须要知道提交前的网页和提交后的网页,这样才能将提交后显示结果网页保存下来。最后就是数据处理了,使用正则表达式将需要的数据抽取出来。

二.实践

1.参数分析

关于参数,可以从数据包中分析出来,我是使用google自带的抓包工具分析的,使用ctrl+shift+I快捷键,点击进入Network列,如下图:

用python模拟网页数据提交

可以看到,当前什么都没有,下面我将参数填写完整

用python模拟网页数据提交

多了一个bindn.pl文件,我们来看看这个文件的内容,看看headers部分:

用python模拟网页数据提交

和图二进行比较,你会看到是相互对应。也就是说,这就是我们需要提交的参数:

  1. postData = {"seq" : oneseq, #oneseq是一个字符串,后面作为一个参数传递进来
  2. "qtype" : "rna",
  3. "vtype" : "sp",
  4. "val" : "80",
  5. "submit" : "Submit Query"
  6. }

而点击发送后的请求URL和HTML头内容,如下图:

用python模拟网页数据提交

所以现在我们可以得到以下这些数据(postData在上面已经分析出来了):

  1. hosturl = "http://bioinfo.ggc.org/bindn/"
  2. posturl = "http://bioinfo.ggc.org/cgi-bin/bindn/bindn.pl" #可以从数据包中分析出,处理post请求的url
  3. headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36",
  4. "Referer" : "http://bioinfo.ggc.org/bindn/"}

2.Python模拟

分析结束后,我们要构造自己的HTTP数据包,并发送给指定url。我们通过urllib2等几个模块提供的API来实现request请求的发送和相应的接收。最后需要编写一个函数,将自己需要的内容抽取出来。完整代码和讲解如下如下:

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Fri Jan 01 09:34:50 2016
  4. @author: liudiwei
  5. """
  6. import os
  7. import urllib
  8. import urllib2
  9. import cookielib
  10. import re
  11. #首先定义一个模拟数据提交的函数,传入刚刚分析出来的四个参数即可
  12. def scratchData(hosturl, posturl, postData, headers):
  13. #设置一个cookie处理器,它负责从服务器下载cookie到本地,并且在发送请求时带上本地的cookie
  14. cj = cookielib.LWPCookieJar()
  15. cookie_support = urllib2.HTTPCookieProcessor(cj)
  16. opener = urllib2.build_opener(cookie_support, urllib2.HTTPHandler)
  17. urllib2.install_opener(opener)
  18. #打开登录主页面(他的目的是从页面下载cookie,这样我们在再送post数据时就有cookie了,否则发送不成功)
  19. urllib2.urlopen(hosturl)
  20. #需要给Post数据编码
  21. postDataEncode = urllib.urlencode(postData)
  22. #通过urllib2提供的request方法来向指定Url发送我们构造的数据,并完成数据发送过程
  23. request = urllib2.Request(posturl, postDataEncode, headers)
  24. print request
  25. response = urllib2.urlopen(request)
  26. resultText = response.read()
  27. return resultText
  28. #将一次提交写到一个函数里面,每次只需传入一个序列即可,因为其它的参数不变
  29. def BindN(oneseq, outdir):
  30. #当前页面,即提交数据页面
  31. hosturl = "http://bioinfo.ggc.org/bindn/"
  32. #post数据接收和处理的页面(我们要向这个页面发送我们构造的Post数据)
  33. posturl = "http://bioinfo.ggc.org/cgi-bin/bindn/bindn.pl" #可以从数据包中分析出,处理post请求的url
  34. #构造header,一般header至少要包含一下两项。这两项是从抓到的包里分析得出的。
  35. headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.80 Safari/537.36",
  36. "Referer" : "http://bioinfo.ggc.org/bindn/"}
  37. #构造Post数据,他也是从抓大的包里分析得出的。
  38. postData = {"seq" : oneseq,
  39. "qtype" : "rna",
  40. "vtype" : "sp",
  41. "val" : "80",
  42. "submit" : "Submit Query"
  43. }
  44. result = scratchData(hosturl, posturl, postData, headers)
  45. print "+++++", oneseq
  46. chainname = oneseq[1:5] + oneseq[6:7]
  47. outfilename = str(chainname) + ".html"
  48. fw_result = open(outdir + "/" + outfilename, "w")
  49. fw_result.write(result)
  50. fw_result.close()
  51. return result, str(chainname)
  52. #使用正则表达式提取数据
  53. def extractBindN(htmlfmt, outfile):
  54. fw_result = open(outfile, "w")
  55. inputdata = htmlfmt.split("
    "
    )
  56. for i in range(len(inputdata)):
  57. onedata = inputdata[i].strip()
  58. if not onedata:
  59. continue
  60. if "<" in onedata or "*" in onedata:
  61. continue
  62. regText = onedata.split(" ")[0].strip()
  63. if re.match(r"^d+$", regText) and True or False:
  64. fw_result.write(onedata + "
    "
    )
  65. fw_result.close()
  66. #main方法
  67. if __name__=="__main__":
  68. oneseq = ">2XD0_A
    MKFYTISSKYIEYLKEFDDKVPNSEDPTYQNPKAFIGIVLEIQGHKYLAPLTSPK
  69. KWHNNVKESSLSCFKLHENGVPENQLGLINLKFMIPIIEAEVSLLDLGNMPNTPYKRMLYKQLQFIRANSDKIA
  70. SKSDTLRNLVLQGKMQGTCNFSLLEEKYRDFGK"
  71. outdir = "/home/liudiwei/result" #输出路径
  72. if not os.path.exists(outdir):
  73. os.mkdir(outdir)
  74. print outdir
  75. result, chainname = BindN(oneseq, outdir)
  76. outfile = outdir + "/" + chainname + ".data" #最终输出的文件名
  77. extractBindN(result, outfile)

End.

作者:拾毅者

来源:『刘帝伟』维护的个人技术博客

本文均已和作者授权,如转载请与作者联系。

  • 我的微信公众号
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: