小编给大家分享一下Python怎么用requests模块实现动态网页爬虫,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!

开发工具

Python版本: 3.6.4

相关模块:

urllib模块;

random模块;

requests模块;

traceback模块;

以及一些Python自带的模块。

环境搭建

安装Python并添加到环境变量,pip安装需要的相关模块即可。

那我们就开启爬虫的正确姿势吧,先用解析接口的方法来写爬虫。

首先,找到真实请求。右键检查,点击Network,选中XHR,刷新网页,选择Name列表中的jsp文件。没错,就这么简单,真实请求就藏在里面。

我们再仔细看看这个jsp,这简直是个宝啊。有真实请求url,有请求方法post,有Headers,还有Form Data,而From Data表示给url传递的参数,通过改变参数,咱们就可以获得数据!为了安全,给自个Cookie打了个马赛克

我们尝试点击翻页,发现只有pagesnum参数会变化。

1fromurllib.parseimporturlencode2importcsv3importrandom4importrequests5importtraceback6fromtimeimportsleep7fromlxmlimportetree#lxml为第三方网页解析库,强大且速度快

1base_url='http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search_content.jsp?'#这里要换成对应Ajax请求中的链接23headers={4'Connection':'keep-alive',5'Accept':'*/*',6'X-Requested-With':'XMLHttpRequest',7'User-Agent':'你的User-Agent',8'Origin':'http://www.hshfy.sh.cn',9'Referer':'http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search.jsp?zd=splc',10'Accept-Language':'zh-CN,zh;q=0.9',11'Content-Type':'application/x-www-form-urlencoded',12'Cookie':'你的Cookie'13}

构建get_page函数,自变量为page,也就是页数。以字典类型创建表单data,用post方式去请求网页数据。这里要注意要对返回的数据解码,编码为’gbk’,否则返回的数据会乱码!

1defget_page(page):2n=33whileTrue:4try:5sleep(random.uniform(1,2))#随机出现1-2之间的数,包含小数6data={7'yzm':'yxAH',8'ft':'',9'ktrqks':'2020-05-22',10'ktrqjs':'2020-06-22',11'spc':'',12'yg':'',13'bg':'',14'ah':'',15'pagesnum':page16}17url=base_url+urlencode(data)18print(url)19try:20response=requests.request("POST",url,headers=headers)21#print(response)22ifresponse.status_code==200:23re=response.content.decode('gbk')24#print(re)25returnre#解析内容26exceptrequests.ConnectionErrorase:27print('Error',e.args)#输出异常信息28except(TimeoutError,Exception):29n-=130ifn==0:31print('请求3次均失败,放弃此url请求,检查请求条件')32return33else:34print('请求失败,重新请求')35continue

构建parse_page函数,对返回的网页数据进行解析,用Xpath提取所有字段内容,保存为csv格式。

1defparse_page(html):2try:3parse=etree.HTML(html)#解析网页4items=parse.xpath('//*[@id="report"]/tbody/tr')5foriteminitems[1:]:6item={7'a':''.join(item.xpath('./td[1]/font/text()')).strip(),8'b':''.join(item.xpath('./td[2]/font/text()')).strip(),9'c':''.join(item.xpath('./td[3]/text()')).strip(),10'd':''.join(item.xpath('./td[4]/text()')).strip(),11'e':''.join(item.xpath('./td[5]/text()')).strip(),12'f':''.join(item.xpath('./td[6]/div/text()')).strip(),13'g':''.join(item.xpath('./td[7]/div/text()')).strip(),14'h':''.join(item.xpath('./td[8]/text()')).strip(),15'i':''.join(item.xpath('./td[9]/text()')).strip()16}17#print(item)18try:19withopen('./law.csv','a',encoding='utf_8_sig',newline='')asfp:20#'a'为追加模式(添加)21#utf_8_sig格式导出csv不乱码22fieldnames=['a','b','c','d','e','f','g','h','i']23writer=csv.DictWriter(fp,fieldnames)24writer.writerow(item)25exceptException:26print(traceback.print_exc())#代替printe来输出详细的异常信息27exceptException:28print(traceback.print_exc())

遍历一下页数,调用一下函数

1forpageinrange(1,5):#这里设置想要爬取的页数2html=get_page(page)3#print(html)4print("第"+str(page)+"页提取完成")

效果:

看完了这篇文章,相信你对“Python怎么用requests模块实现动态网页爬虫”有了一定的了解,如果想了解更多相关知识,欢迎关注亿速云行业资讯频道,感谢各位的阅读!