zp7833377 2020-09-17 14:16 采纳率: 0%
浏览 236

python爬取禅道页面特定的人员所提的bug数,试了很多方法,发现访问的结果都是一致的,怎么解决?

在学习python爬虫,要爬取我们公司所用禅道的特定人员所提bug数。
通过F12开发者工具看到总的有3个有用的网页,两个是get请求,一个是post请求
图片说明
图片说明
图片说明

然后我写了代码,尝试用requests.post带着参数去请求这个唯一的post,发现地址写的为post这个地址时,响应是错误的。

response = session.post('http://zentaopms.jjshebao.com/index.php?m=search&f=buildQuery', data = postData,headers = header)

返回的结果如下

<html><meta charset='utf-8'/><style>body{background:white}</style><script>parent.location=' /index.php?m=bug&f=browse&productID=3&branch=0&browseType=bySearch&queryID=myQueryID';

这个最后这段地址,是其中一个get页面的地址。
如果我将post请求中的地址,直接换成这个地址

response = session.post('http://zentaopms.jjshebao.com/index.php?m=bug&f=browse&productID=3&branch=0&browseType=bySearch&queryID=myQueryID', data = postData,headers = header)

则会返回结果。
以上是我第一个疑惑点,为什么我请求的时候,要用的是另外一个地址。

还有一个问题,我现在是要爬取不同人员所提的bug数,那我就给其中一个参数是不一样的。对了每次的结果,发现是其中这个值对应每次的人员不同。
图片说明
但是我在脚本这边将值替换之后,查询出来的结果每次都是一致的。而且不是固定的,而是我在页面操作,比如选择“人员A”进行搜索,搜索出结果,那我此时到python这边运行脚本,则无论参数换成哪个人员,结果都是人员A的结果。
还有一点提一下,因为这个禅道是要登录才能到这个页面,所以我是将cookie写死在header里了。并且这次遇到的不是json数据格式,是form-data格式。 不知道是否我写数据的格式有误。
图片说明

对了。上述提到的,我的入参数据格式都是打错了,用的json格式。后来换成form-data格式后,有提示“http.client.RemoteDisconnected: Remote end closed connection without response”。当然了。post的还是最长的那个网址(本身是get获取到的,也就是actionURL后的那个地址)。代码段如下:

#form-data的数据格式
formData1 = 'fieldtitle=&fieldkeywords=&fieldsteps=&fieldassignedTo=&fieldresolvedBy=&fieldstatus=&fieldconfirmed=ZERO&fieldproduct=2&fieldplan=&fieldmodule=ZERO&fieldproject=&fieldseverity=0&fieldpri=0&fieldtype=&fieldos=&fieldbrowser=&fieldresolution=&fieldactivatedCount=&fieldtoTask=&fieldtoStory=&fieldopenedBy=&fieldclosedBy=&fieldlastEditedBy=&fieldmailto=&fieldopenedBuild=&fieldresolvedBuild=&fieldopenedDate=&fieldassignedDate=&fieldresolvedDate=&fieldclosedDate=&fieldlastEditedDate=&fielddeadline=&fieldid=&andOr1=AND&field1=openedBy&operator1=%3D&value1=liaorongxuan&andOr2=and&field2=id&operator2=%3D&value2=&andOr3=and&field3=keywords&operator3=include&value3=&groupAndOr=and&andOr4=AND&field4=steps&operator4=include&value4=&andOr5=and&field5=assignedTo&operator5=%3D&value5=&andOr6=and&field6=resolvedBy&operator6=%3D&value6=&module=bug&actionURL=%2Findex.php%3Fm%3Dbug%26f%3Dbrowse%26productID%3D2%26branch%3D0%26browseType%3DbySearch%26queryID%3DmyQueryID&groupItems=3&formType=lite'
#创建session
session = requests.session()
#调用post进行请求,添加参数以及信息头
response1 = session.post("http://zentaopms.jjshebao.com/index.php?m=bug&f=browse&productID=2&branch=0&browseType=bySearch&queryID=myQueryID", data=formData1, headers=header)

如果是直接get,不给参数,则是会有错误提示。看样子,好像是提示未登录的情况?最后referer后边的值,是一串加密后的码。

<html><meta charset='utf-8'/><style>body{background:white}</style><script>self.location='/index.php?m=user&f=login&referer=XXXXXXXX';

然后我试了一下,只要访问的时候,不论是requests.post还是get;或者是session.post或get,到最后返回的结果都是一模一样的,还是我在页面操作时,搜索了谁提的bug,我运行脚本后,最后得出的结果就是谁所提的bug数。
但是我对了一下,搜索条件变了,出来结果不一样,cookie的值也是一模一样的,同个网址的信息头也都是一模一样的,就是参数那边变了。
那我在脚本这边,改了参数,返回的结果都是网页那边设置的人员的结果。

最后提一点,刚刚仔细看了眼信息头,发现了访问的一些规律
1.其中一个get地址,是从那个post请求发起的访问
图片说明
2.另外两个地址,显示的都是从第一点中提到的这个地址访问的
图片说明
图片说明

所以我现在也很懵,在写脚本的时候,到底要访问哪个地址? 访问那个post的地址吧,返回的又是错误的(上方有提到),访问get吧,那这个post要怎么去调用它,使它能够获得正确的数据呢,不然直接得到的数据,都是一致的。
感谢

  • 写回答

2条回答 默认 最新

  • tjuyz 2022-01-28 11:33
    关注

    这个有解决吗,用网页的zentaosid获取的结果和网页一致,用脚本登录的获取的就是全量的,即post的查询条件并不生效

    评论

报告相同问题?

悬赏问题

  • ¥15 CPU卡指令整合指令数据都在图片上
  • ¥15 火车票关联12306问题
  • ¥15 odoo17处理受托加工产品
  • ¥15 如何用MATLAB编码图三的积分
  • ¥15 圆孔衍射光强随孔径变化
  • ¥15 MacBook pro m3max上用vscode运行c语言没有反应
  • ¥15 ESP-PROG配置错误,ALL ONES
  • ¥15 结构功能耦合指标计算
  • ¥50 AI大模型精调(百度千帆、飞浆)
  • ¥15 非科班怎么跑代码?如何导数据和调参