前言
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 urlencode2 import csv3 import random4 import requests5 import traceback6 from time import sleep7 from lxml import etree #lxml为第三方网页解析库,强大且速度快
1 base_url = 'http://www./shfy/gweb/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.',9 'Referer': 'http://www./shfy/gweb/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 = 33 while True:4 try:5 sleep(random.uniform(1, 2)) # 随机出现1-2之间的数,包含小数6 data = {7'yzm': 'yxAH',8'ft':'',9'ktrqks': '-05-22',10'ktrqjs': '-06-22',11'spc':'',12'yg':'',13'bg':'',14'ah':'',15'pagesnum': page16 }17 url = base_url + urlencode(data)18 print(url)19 try: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 # 解析内容26 except requests.ConnectionError as e:27print('Error', e.args) # 输出异常信息28 except (TimeoutError, Exception):29 n -= 130 if n == 0:31print('请求3次均失败,放弃此url请求,检查请求条件')32return33 else:34print('请求失败,重新请求')35continue
构建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: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)25 except Exception:26print(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 学习资料,给那些想学习 Python 的小伙伴们一点帮助!
一、Python所有方向的学习路线
Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、学习软件
工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。
三、入门学习视频
四、实战案例
五、面试资料
如果需要可以微信扫描下方CSDN官方认证二维码免费领取