requests爬取民政部的区划代码增量实现

news/2024/7/19 9:44:57 标签: python, 爬虫

温馨提示:

爬虫玩得好,监狱进得早。数据玩得溜,牢饭吃个够。

《刑法》第 285 条,非法获取计算机信息系统数据罪。
       违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或者传输的数据,或者对该计算机信息系统实施非法控制,情节严重的,处三年以下有期徒刑或者拘役,并处或者单处罚金;情节特别严重的,处三年以上七年以下有期徒刑,并处罚金。

正文:

本篇文章我们将用requests爬取民政部的区划代码,并且实现增量爬虫
我们就不再分析这个网站了,因为这个和之前各个网站的分析差不了太多,就不过多分析了,但是我们在这里介绍这个网站和别的不一样的 反爬机制

第一个:

在这里插入图片描述

我们看这几个标签,F12响应出来的是这样的,我们在看网页源代码中是什么样子

在这里插入图片描述
我们看是没有tbody的,table标签完了之后,直接就是tr、td,因为我们是要用xpath提取数据的,标签准确是必须的,所以这就是这个网站的第一个反爬机制

第二个:

在这里插入图片描述
我们看这个最新的行政区划代码的链接,但是我们点进去在看链接是什么样的

在这里插入图片描述

这个链接就变了,这个是用到了一个URL地址跳转的技术,因为我们要用这个地址提取数据,所以我们要拿到准确的地址去响应数据才行

这就是这个网站的两个反爬机制,我们就都介绍完了,接下来就直接代码实现就好了

拿到最新月份的链接

python">//table/tr[1]/td[@class="arlisttd"]/a/@href

第二个反爬机制我们解决的代码,就是拿到真实链接:

python"><script>
     window.location.href="http://preview.www.mca.gov.cn/article/sj/xzqh/2020/2020/202101041104.html";
</script>

这个就是真实的数据地址链接,那我们用正则把它提取出来就是:

python">regex = 'window.location.href="(.*?)"'
pattern = re.compile(regex, re.S)

其他的代码我们就不一一说了,跟之前的思路都一样
全部代码奉上:

python">import requests
from lxml import etree
from fake_useragent import UserAgent
import re
import redis
from hashlib import md5
import sys


class MzbSpider:
    def __init__(self):
        self.url = 'http://www.mca.gov.cn/article/sj/xzqh/2020/'
        self.headers = {'User-Agent': UserAgent().random}
        self.r = redis.Redis(host='localhost', port=6379, db=0)

    def get_html(self, url):
        """请求URL功能函数"""
        html = requests.get(url=url,
                            headers=self.headers).text

        return html

    def xpath_func(self, html, xpath_bds):
        """xpath提取功能函数"""
        eobj = etree.HTML(html)
        r_list = eobj.xpath(xpath_bds)

        return r_list

    def md5_url(self, url):
        """md5加密功能函数"""
        s = md5()
        s.update(url.encode())

        return s.hexdigest()

    def parse_html(self):
        html = self.get_html(url=self.url)
        # 提取最新月份的href
        xpath_bds = '//table/tr[1]/td[@class="arlisttd"]/a/@href'
        href_list = self.xpath_func(html, xpath_bds)
        if href_list:
            two_url = 'http://www.mca.gov.cn' + href_list[0]
            finger = self.md5_url(two_url)
            if self.r.sadd('mzb:spiders', finger) == 1:
                # 提取详情页的具体数据
                self.get_data(two_url)
            else:
                sys.exit('网站未更新')
        else:
            print('提取最新链接失败')

    def get_data(self, two_url):
        """提取具体数据"""
        # 1.在two_html中提取跳转之后的真实链接
        false_html = self.get_html(url=two_url)
        regex = 'window.location.href="(.*?)"'
        pattern = re.compile(regex, re.S)
        true_url_list = pattern.findall(false_html)
        if true_url_list:
            true_url = true_url_list[0]
            true_html = self.get_html(url=true_url)
            # 2.向真实链接发请求,拿到响应内容
            two_xpath = '//tr[@height="19"]'
            tr_list = self.xpath_func(true_html, two_xpath)
            for tr in tr_list:
                item = {}
                item['name'] = tr.xpath('./td[3]/text()')[0]
                item['code'] = tr.xpath('./td[2]/text() | ./td[2]/span/text()')[0]
                print(item)
        else:
            print('真实链接提取失败')

    def run(self):
        self.parse_html()


if __name__ == '__main__':
    spider = MzbSpider()
    spider.run()


http://www.niftyadmin.cn/n/835423.html

相关文章

在ios桌面添加web站点图标及增加启动画面

首先说明本文摘自csdn如果你开发了一款属于你自己的系统&#xff0c;那么你最希望的自然是能够被人喜爱&#xff0c;收藏了。在ios系统中可以对web应用添加到桌面这个功能。就是在系统桌面上会生成一个图标和其他的应用一样仿佛是从应用商店下载的应用一样。可是当你把你的站点…

bzoj 2244 [SDOI2011]拦截导弹(dp+CDQ+树状数组)

传送门 题解 看了半天完全没发现这东西和CDQ有什么关系…… 先把原序列翻转&#xff0c;求起来方便 然后把每一个位置表示成$(a,b,c)$其中$a$表示位置&#xff0c;$b$表示高度&#xff0c;$c$表示速度&#xff0c;求有多少个位置$a,b,c$都小于它&#xff0c;这就是一个三维偏序…

Oracle常用总结

Oracle常用总结 1、查看表空间详细信息 select * from dba_data_files order by tablespace_name2、创建表空间&#xff1a; create tablespace HEATPUMP logging datafile E:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\heatpump01.DBF size 200m autoextend on next 20…

一图解千言,从兴趣意念直达搜索目标!

2019独角兽企业重金招聘Python工程师标准>>> 前言&#xff1a; 搜索是人们在海量信息中获取有效信息的一种常见方式。 与日常“文字搜索”不同&#xff0c;图像搜索是通过“以图搜图”的方式来获取人们想要的图片信息。 当前&#xff0c;图像搜索正在以更广泛的应用…

趣味C++

用三段 140 字符以内的代码生成一张 10241024 的图片 Kyle McCormick 在 StackExchange 上发起了一个叫做TweetableMathematical Art 的比赛&#xff0c;参赛者需要用三条推这么长的代码来生成一张图片。具体地说&#xff0c;参赛者需要用 C 语言编写 RD 、 GR 、 BL 三个函数&…

度度熊拼三角

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid6374解题的思路有两个&#xff0c;一个暴力求解&#xff0c;时间复杂度为N^3&#xff0c;另一种是将木棍从大到小排序&#xff0c;按照三个三个一起进行遍历&#xff0c;能够成三角形就是答案下面是代码&#x…

瓦力 - 基于ElasticSearch的搜房网实战

为什么80%的码农都做不了架构师&#xff1f;>>> 课程介绍 项目设计 环境搭建 环境要求 JDK 1.8 Maven IDEA MySQL 5.5 ES 集群 Spring Boot (Security/DevTools/Web/Thymeleaf) 架构设计 后台管理模块实现 房源信息管理模块实现 基础功能实现 搜索引擎实现 基于百度…

Java b2b2c SpringBoot多用户商城系统(十):服务网关zuul初级篇

为什么需要API Gateway1、简化客户端调用复杂度在微服务架构模式下后端服务的实例数一般是动态的&#xff0c;对于客户端而言很难发现动态改变的服务实例的访问地址信息。因此在基于微服务的项目中为了简化前端的调用逻辑&#xff0c;通常会引入API Gateway作为轻量级网关&…