前言
Python爬虫实战,requests模块,Python实现动态网页爬虫
让我们愉快地开始吧~
开发工具
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参数会变化。
1 from urllib.parse import urlencode 2 import csv 3 import random 4 import requests 5 import traceback 6 from time import sleep 7 from lxml import etree #lxml为第三方网页解析库,强大且速度快
1 base_url = 'http://www.hshfy.sh.cn/shfy/gweb2017/ktgg_search_content.jsp?' #这里要换成对应Ajax请求中的链接 2 3 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): 2 n = 3 3 while True: 4 try: 5 sleep(random.uniform(1, 2)) # 随机出现1-2之间的数,包含小数 6 data = { 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': page 16 } 17 url = base_url + urlencode(data) 18 print(url) 19 try: 20 response = requests.request("POST",url, headers = headers) 21 #print(response) 22 if response.status_code == 200: 23 re = response.content.decode('gbk') 24 # print(re) 25 return re # 解析内容 26 except requests.ConnectionError as e: 27 print('Error', e.args) # 输出异常信息 28 except (TimeoutError, Exception): 29 n -= 1 30 if n == 0: 31 print('请求3次均失败,放弃此url请求,检查请求条件') 32 return 33 else: 34 print('请求失败,重新请求') 35 continue
构建parse_page函数,对返回的网页数据进行解析,用Xpath提取所有字段内容,保存为csv格式。
1def parse_page(html): 2 try: 3 parse = etree.HTML(html) # 解析网页 4 items = parse.xpath('//*[@id="report"]/tbody/tr') 5 for item in items[1:]: 6 item = { 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) 18 try: 19 with open('./law.csv', 'a', encoding='utf_8_sig', newline='') as fp: 20 # 'a'为追加模式(添加) 21 # utf_8_sig格式导出csv不乱码 22 fieldnames = ['a', 'b', 'c', 'd', 'e','f','g','h','i'] 23 writer = csv.DictWriter(fp,fieldnames) 24 writer.writerow(item) 25 except Exception: 26 print(traceback.print_exc()) #代替print e 来输出详细的异常信息 27 except Exception: 28 print(traceback.print_exc())
遍历一下页数,调用一下函数
1 for page in range(1,5): #这里设置想要爬取的页数 2 html = get_page(page) 3 #print(html) 4 print("第" + str(page) + "页提取完成")
效果:
总结
到此这篇关于Python用requests模块实现动态网页爬虫的文章就介绍到这了,更多相关Python requests内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!