Python用requests模块实现 * 页爬虫

作者:Python程序员小泉 时间:2022-10-15 16:27:06 

前言

Python爬虫实战,requests模块,Python实现 * 页爬虫

让我们愉快地开始吧~

开发工具

Python版本: 3.6.4

相关模块:

urllib模块;

random模块;

requests模块;

traceback模块;

以及一些Python自带的模块。

环境搭建

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

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

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

Python用requests模块实现 * 页爬虫

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

Python用requests模块实现 * 页爬虫

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

Python用requests模块实现 * 页爬虫

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模块实现 * 页爬虫

来源:https://blog.csdn.net/m0_59162248/article/details/122875682

标签:Python,requests
0
投稿

猜你喜欢

  • ORACLE应用经验(2)

    2010-07-31 13:31:00
  • 在VSCode中添加Python解释器并安装Python库的方法

    2022-04-21 19:13:53
  • 使用python编写简单计算器

    2023-08-27 17:07:46
  • Python字符编码与函数的基本使用方法

    2023-11-29 17:01:30
  • Python批量修改文件名的方式详解

    2023-05-15 20:56:08
  • SQL Server 移动系统数据库

    2024-01-15 11:35:54
  • python 装饰器的使用示例

    2021-05-15 00:52:09
  • vue组件实现可搜索下拉框扩展

    2024-05-28 15:41:57
  • 页面中图像格式的选用之我见

    2007-10-31 18:11:00
  • vue+element-ui+sortable.js实现表格拖拽功能

    2024-04-09 11:00:11
  • 一篇文章带你了解Python的进程,线程和协程

    2023-09-01 18:40:01
  • python从入门到精通(DAY 3)

    2023-11-03 08:23:18
  • python实现五子棋小游戏

    2023-02-28 08:37:59
  • caffe的python接口绘制loss和accuracy曲线

    2021-06-15 23:54:21
  • 启发式评估(heuristic evaluation)

    2009-08-27 13:03:00
  • MySQL数据库监控软件lepus使用问题以及解决办法

    2024-01-25 14:59:37
  • SQL性能优化之定位网络性能问题的方法(DEMO)

    2024-01-13 20:42:17
  • python程序中的线程操作 concurrent模块使用详解

    2021-08-28 00:27:39
  • 批量更新数据库所有表中字段的内容,中木马后的急救处理

    2024-01-27 21:19:54
  • numpy.ndarray 实现对特定行或列取值

    2022-05-14 09:17:24
  • asp之家 网络编程 m.aspxhome.com