Python用requests模块实现动态网页爬虫
目录
- 前言
- 开发工具
- 环境搭建
- 总结
前言 Python爬虫实战,requests模块,Python实现动态网页爬虫
让我们愉快地开始吧~
开发工具 Python版本: 3.6.4
相关模块:
urllib模块;
【Python用requests模块实现动态网页爬虫】random模块;
requests模块;
traceback模块;
以及一些Python自带的模块。
环境搭建 安装Python并添加到环境变量,pip安装需要的相关模块即可。
那我们就开启爬虫的正确姿势吧,先用解析接口的方法来写爬虫。
首先,找到真实请求。右键检查,点击Network,选中XHR,刷新网页,选择Name列表中的jsp文件。没错,就这么简单,真实请求就藏在里面。
我们再仔细看看这个jsp,这简直是个宝啊。有真实请求url,有请求方法post,有Headers,还有Form Data,而From Data表示给url传递的参数,通过改变参数,咱们就可以获得数据!为了安全,给自个Cookie打了个马赛克
文章图片
我们尝试点击翻页,发现只有pagesnum参数会变化。
文章图片
1 from urllib.parse import urlencode2 import csv3 import random4 import requests5 import traceback6 from time import sleep7 from lxml import etree#lxml为第三方网页解析库,强大且速度快
1 base_url = 'http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search_content.jsp?'#这里要换成对应Ajax请求中的链接23 headers = {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’,否则返回的数据会乱码!
1def get_page(page):2n = 33while True:4try:5sleep(random.uniform(1, 2))# 随机出现1-2之间的数,包含小数6data = https://www.it610.com/article/{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)22if response.status_code == 200:23re = response.content.decode('gbk')24# print(re)25return re# 解析内容26except requests.ConnectionError as e:27print('Error', e.args)# 输出异常信息28except (TimeoutError, Exception):29n -= 130if n == 0:31print('请求3次均失败,放弃此url请求,检查请求条件')32return33else:34print('请求失败,重新请求')35continue
构建parse_page函数,对返回的网页数据进行解析,用Xpath提取所有字段内容,保存为csv格式。
1def parse_page(html):2try:3parse = etree.HTML(html)# 解析网页4items = parse.xpath('//*[@id="report"]/tbody/tr')5for item in items[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:19with open('./law.csv', 'a', encoding='utf_8_sig', newline='') as fp: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)25except Exception:26print(traceback.print_exc())#代替print e 来输出详细的异常信息27except Exception:28print(traceback.print_exc())
遍历一下页数,调用一下函数
1for page in range(1,5):#这里设置想要爬取的页数2html = get_page(page)3#print(html)4print("第" + str(page) + "页提取完成")
效果:
文章图片
总结 到此这篇关于Python用requests模块实现动态网页爬虫的文章就介绍到这了,更多相关Python requests内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- Docker应用:容器间通信与Mariadb数据库主从复制
- JS中的各种宽高度定义及其应用
- 由浅入深理解AOP
- 【译】20个更有效地使用谷歌搜索的技巧
- 涉毒患者(新诗)
- 参保人员因患病来不及到指定的医疗机构就医,能否报销医疗费用()
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus|MybatisPlus LambdaQueryWrapper使用int默认值的坑及解决
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息