【Python_requests学习笔记(八)】基于requests模块 实现响应内容嵌入JS 进行url地址跳转 数据的爬取
创始人
2025-06-01 22:13:11
0

基于requests模块构建免费代理IP池

前言

此篇文章中介绍基于requests模块,实现对在响应内容中嵌入JS,真实的url地址进行跳转后数据的爬取,并以爬取行政区划代码数据为例进行讲解。

正文

1、需求梳理

抓取民政部网站最新行政区划代码
一级页面:
在这里插入图片描述
二级页面:
在这里插入图片描述

2、爬虫思路

  1. 确认所抓数据在响应内容中是否存在
    一级页面抓取数据:
    在这里插入图片描述
    二级页面抓取数据:
    在这里插入图片描述

  2. 分析url地址规律
    一级页面的url地址:https://www.mca.gov.cn/article/sj/xzqh/2020/
    二级页面的url地址:https://www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html
    注意:获取二级页面的url地址时,因为网站加入了反爬机制,在响应内容中嵌入了JS,所以url地址会进行跳转,在一级页面中获取的url地址并不是真实的url地址
    在这里插入图片描述
    从上面的动图中可以看到:url地址从 https://www.mca.gov.cn//article/sj/xzqh/2020/202101/20210100031547.shtml 跳转成了 https://www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html
    那么应该如何获取二级页面真实的url地址呢?
    本文采用的方法是:在程序运行时打印二级页面的响应内容,在响应内容中Ctrl+F 寻找 url地址(https://www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html )
    在这里插入图片描述

  3. 写xpath表达式 & re正则表达式
    在这里插入图片描述

一级页面的xpath表达式://tr//@href
在这里插入图片描述
二级页面的re表达式:window.location.href="(.*?)

  1. 编写程序框架、完善程序
    详情见3、程序实现

3、程序实现

  1. 初始化函数
    def __init__(self):self.url = 'https://www.mca.gov.cn/article/sj/xzqh/2020/'  # url地址
  1. 功能函数1:获取html
    def get_html(self, url):"""function:  功能函数1:获取htmlin:  url:url地址out:  html:返回响应内容return:  html:返回响应内容others:  Func1:Get HTML"""headers = {'User-Agent': UserAgent().random}  # 构建随机请求头html = requests.get(url=url, headers=headers).text  # get方法获取响应内容return html
  1. 功能函数2:xpath解析提取数据
    def xpath_func(self, html, xpath_bds):"""function:  功能函数2:xpath解析提取数据in:  html:响应内容xpath_bds:xpath表达式out:  r_list:返回匹配内容return:  r_list:返回匹配内容others:  """p = etree.HTML(html)  # 创建解析对象r_list = p.xpath(xpath_bds)  # 解析对象调用xpath表达式return r_list  # 返回匹配内容
  1. 逻辑函数
    def parse_html(self):"""function:  逻辑函数1、向主页发请求,提取最新月份的链接2、向最新月份的链接发请求,提取数据in:  Noneout:  Nonereturn:  int >0 ok, <0 some wrong others:  Logic Func"""one_html = self.get_html(url=self.url)  # 获取html内容one_xpath = '//tr//@href'  # 定义xpath表达式href_list = self.xpath_func(html=one_html, xpath_bds=one_xpath)  # xpath解析提取数据if href_list:  # 判断是否存在one_url = 'https://www.mca.gov.cn' + href_list[0]  # 拼接返回列表的第一项self.detail_page(one_url)  # 调用 详情页获取具体数据函数else:print("提取最新链接失败!")
  1. 详情页获取具体数据
    def detail_page(self, one_url):"""function:  详情页获取具体数据in:  one_url:一级页面的url地址out:  Nonereturn:  Noneothers:  The Details Page Gets Data"""# 在响应内容中嵌入JS,进行了url地址的跳转two_html = self.get_html(one_url)  # 传入详情页的url地址true_url = self.get_true_url(two_html)  # 从响应内容中提取真实返回数据的链接true_html = self.get_html(true_url)  # 开始从真实链接中提取数据two_xpath = "//tr[@height='19']"  # 写xpath表达式tr_list = self.xpath_func(html=true_html, xpath_bds=two_xpath)item = {}  # 定义一个空字典for tr in tr_list:item["name"] = tr.xpath('./td[3]/text()')[0].strip()item["code"] = tr.xpath('./td[2]/text()|./td[2]/span/text()')[0].strip()print(item)
  1. 从响应内容中提取真实返回数据的url地址
    def get_true_url(self, two_html):"""function:  从响应内容中提取真实返回数据的url地址in:  two_html:二级页面的响应内容out:  true_url[0]:真实的url地址return:  true_url[0]:真实的url地址others:  From Html Get True Url"""regex = 'window.location.href="(.*?)"'  # 正则表达式pattern = re.compile(regex, re.S)  # 创建正则表达式编译对象true_url = pattern.findall(two_html)  # 使用findall方法return true_url[0]  # 返回真实的url地址
  1. 程序入口函数
    def run(self):"""function:  程序入口函数in:  Noneout:  Nonereturn:  Noneothers:  Program Entry Func"""self.parse_html()  # 调用逻辑函数

4、完整代码

import re
import requests
from lxml import etree
from fake_useragent import UserAgentclass MinzhengSpider:"""抓取民政部网站最新行政区划代码"""def __init__(self):self.url = 'https://www.mca.gov.cn/article/sj/xzqh/2020/'  # url地址def get_html(self, url):"""function:  功能函数1:获取htmlin:  url:url地址out:  html:返回响应内容return:  html:返回响应内容others:  Func1:Get HTML"""headers = {'User-Agent': UserAgent().random}  # 构建随机请求头html = requests.get(url=url, headers=headers).text  # get方法获取响应内容return htmldef xpath_func(self, html, xpath_bds):"""function:  功能函数2:xpath解析提取数据in:  html:响应内容xpath_bds:xpath表达式out:  r_list:返回匹配内容return:  r_list:返回匹配内容others:  """p = etree.HTML(html)  # 创建解析对象r_list = p.xpath(xpath_bds)  # 解析对象调用xpath表达式return r_list  # 返回匹配内容def parse_html(self):"""function:  逻辑函数1、向主页发请求,提取最新月份的链接2、向最新月份的链接发请求,提取数据in:  Noneout:  Nonereturn:  int >0 ok, <0 some wrong others:  Logic Func"""one_html = self.get_html(url=self.url)  # 获取html内容one_xpath = '//tr//@href'  # 定义xpath表达式href_list = self.xpath_func(html=one_html, xpath_bds=one_xpath)  # xpath解析提取数据if href_list:  # 判断是否存在one_url = 'https://www.mca.gov.cn' + href_list[0]  # 拼接返回列表的第一项self.detail_page(one_url)  # 调用 详情页获取具体数据函数else:print("提取最新链接失败!")def detail_page(self, one_url):"""function:  详情页获取具体数据in:  one_url:一级页面的url地址out:  Nonereturn:  Noneothers:  The Details Page Gets Data"""# 在响应内容中嵌入JS,进行了url地址的跳转two_html = self.get_html(one_url)  # 传入详情页的url地址true_url = self.get_true_url(two_html)  # 从响应内容中提取真实返回数据的链接true_html = self.get_html(true_url)  # 开始从真实链接中提取数据two_xpath = "//tr[@height='19']"  # 写xpath表达式tr_list = self.xpath_func(html=true_html, xpath_bds=two_xpath)item = {}  # 定义一个空字典for tr in tr_list:item["name"] = tr.xpath('./td[3]/text()')[0].strip()item["code"] = tr.xpath('./td[2]/text()|./td[2]/span/text()')[0].strip()print(item)def get_true_url(self, two_html):"""function:  从响应内容中提取真实返回数据的url地址in:  two_html:二级页面的响应内容out:  true_url[0]:真实的url地址return:  true_url[0]:真实的url地址others:  From Html Get True Url"""regex = 'window.location.href="(.*?)"'  # 正则表达式pattern = re.compile(regex, re.S)  # 创建正则表达式编译对象true_url = pattern.findall(two_html)  # 使用findall方法return true_url[0]  # 返回真实的url地址def run(self):"""function:  程序入口函数in:  Noneout:  Nonereturn:  Noneothers:  Program Entry Func"""self.parse_html()  # 调用逻辑函数if __name__ == '__main__':spider = MinzhengSpider()spider.run()

5、实现效果

在这里插入图片描述

相关内容

热门资讯

丝路视觉(300556.SZ)... 格隆汇6月8日丨丝路视觉(300556.SZ)公布,持有公司股份282,421股(占公司总股本比例0...
抖音关于创业简介,抖音创业领域...   你好,我是六一,一个多年处于无货源模式的电商。      每天,我都在呼喊农民工的灵魂。农民工有...
上证指数和创业板指数的区别 上...   大家好,我是你们的大师南阳,今天的走势符合我昨天的预测。昨天下午外围形势逆转缓和,欧美股市上涨,...
大学生创业还是就业,大学生刚毕...   大家好,我简单介绍一下我自己,90后大叔,从未离开过郑州。大学毕业后,我在两个行业工作。现在已经...
比亚迪李云飞回应“常压油箱”“...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! 6月8日,比亚迪集团...
云计算的关键技术 云计算的关键...         为什么使用VMware服务器虚拟化?      虚拟化是云计算的重要组成部分。有了这...
创业征途歌曲歌词 创业征途歌曲...   来源:人民日报      冬天的花店里,几簇红色的凤梨花格外显眼。店主袁小林笑着招呼客人。   ...
美政府敦促马斯克对手:“搞快点... 据美国《华盛顿邮报》网站6月7日报道,由于特朗普总统威胁要取消给马斯克的太空探索技术公司的合同,以及...
1000元如何创业,10000...   很多商家在试运营阶段就在策划裂变活动,掌握正确的模式可以让你在创业初期事半功倍。而且目前的基础裂...
厦门信达连续两个交易日涨幅偏离... 观点网讯:6月8日,厦门信达股份有限公司(简称“厦门信达”)发布股票交易异常波动公告。公告显示,厦门...
闪电快讯|比亚迪海豹06EV上... 2025年6月7日,在重庆车展上,比亚迪海洋网正式推出全新纯电动轿跑车型——海豹06EV。新车共发布...
WTA女王杯签表公布 头号种子... 转自:央视体育近日,WTA女王杯签表公布郑钦文作为头号种子首轮轮空第二轮将对阵琼斯和凯斯勒之间的胜者...
00后创业开什么店好,现在00...   当你第一次看到这个标题时,你可能会认为这是一个骗局!但这是一个真实发生在我身上的例子。     ...
襄阳光彩物流基地 襄阳光彩物流...   襄阳网讯7月26日,“美丽的蓝城很高兴认识你襄阳”——蓝城广材蓝湾品牌发布暨白萌集团商业管理公司...
“中国游记”第一季丨挖竹笋、采... 转自:中央广电总台国际在线   想解锁中国旅行的“隐藏副...
济南川锦汇麻辣拌英才店,川锦汇...   名称:“红烧里脊”      做法:爆炒      味道:辣      大家好,欢迎来到蒋金辉美...
华兴源创获中国专利优秀奖 6月8日,华兴源创(688001)发布公告,近日公司荣获第二十五届中国专利优秀奖,表彰其在技术创新和...
创业贷款需要什么,武汉创业贷款...           
中央气象台:全球天气公报(20... 来源:中央气象台网站非洲南部有大风降温及雨雪天气日本中南部有强降雨天气一、全球天气实况1. 欧洲西北...
听劝!这类菜一定要少吃,真的可... 转自:中国科协酸豆角、腌黄瓜、脆口萝卜、腌萝卜条、腌辣椒、榨菜……腌菜作为餐桌上必不可少的饭搭子,受...