千家信息网

Python怎么用requests模块实现动态网页爬虫

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,小编给大家分享一下Python怎么用requests模块实现动态网页爬虫,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!开发工具Python版本: 3.6.4相关模块:urllib模块
千家信息网最后更新 2025年01月21日Python怎么用requests模块实现动态网页爬虫

小编给大家分享一下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参数会变化。

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):2    n = 33    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': page16            }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 -= 130            if n == 0:31                print('请求3次均失败,放弃此url请求,检查请求条件')32                return33            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模块实现动态网页爬虫"有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!

0