作者:明天依旧可好
时间:2020年7月29日
联系邮箱:[email protected]
写在前面:本文仅供参考学习之用,请勿用作其他用途。
1.嵌入式网页爬取
举例:最常见的分页式网页
这里我用天津市的信访页面来做示例,(地址:http://www.tj.gov.cn/zmhd/zmljl0524/wywtwqz/)。
右键打开源码找到iframe
标签,拿出里面的src
地址http://zm.tj.gov.cn/gov_open/question/zero/list8a.jsp
进入src
地址中的页面后不要停留在首页,首页网址通常是比较特殊的,分析不出来规律,需要我们进入首页外的任一地址
进入第二页,我们便可以发现页面中的规律,仅仅只需要更换curpage
后的数字就可以切换到不同的页面,这样一来,我们只需要一个循环就可以得到所有数据页面的地址,接下来发送get请求获取数据即可。
http://zm.tj.gov.cn/gov_open/question/zero/list8a.jsp?curpage=2&rows=15&deptId=1002000000000000
2.JS加载型网页抓取
举例:有些动态网页并没有采用网页嵌入的方式,而选择了JS加载
这里我举例的是北京市的信访页面(http://www.beijing.gov.cn/hudong/hdjl/com.web.search.replyMailList.flow)
我们会发现当选择不同页面时,网址并不会发生变化,这点和上面说的嵌入式页面一样。
右键打开源码,没有发现iframe
、html
等嵌入式页面的标致性标签,但是我们不难发现在放有数据的div
中有一个id
,这是JS加载处理的一个明显标识。现在进入控制台的Network
进行页面跳转(我跳转到了第3页),注意观察控制台左方新出现的文件JS,在里面找到加载新数据的JS文件,打开它会发现PageCond/begin: 18
、PageCond/length: 6
类似的参数,很明显网站就是依据这个参数来加载相关数据的,将它随着post请求一下发送给网站,就可以得到我们想要的数据了。
payloadData ={
"PageCond/begin": (i-1)*6,
"PageCond/length": 6,
"PageCond/isCount": "false",
"keywords": "",
"orgids": "",
"startDat e": "",
"endDate": "",
"letterType": "",
"letterStatue": ""}
dumpJsonData = json.dumps(payloadData)
headers = {"Host": "www.beijing.gov.cn",
"Origin": "http://www.beijing.gov.cn",
"Referer": "http://www.beijing.gov.cn/hudong/hdjl/",
"User-Agent": str(UserAgent().random)#,
}
req = requests.post(url,headers=headers,data=payloadData)