爬虫第十一式:用selenium爬取民政部行政区划代码

温馨提示:

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

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

正文:

本篇将介绍更加刺激的案例,嘿嘿~这次我们不整那些各个平台公司的网站了,我们整一下这个:
在这里插入图片描述
这个我们生活啊,时不时的需要来点刺激,这次我考虑了很久,要不要写,我又怕我会进去。。。但是不写这个又是一个很好的案例 (曾经是某公司的面试题),我考虑很久,决定还是写了,在写之前呢,我从网上查了查有没相关的案例,我发现还是有的,所以应该是没有问题的

接下来我们就开始了,提取最新月份的行政区划代码,现在最新的是2020年11月份的,我们就提取这个

提取这个地址URL的主页:

http://www.mca.gov.cn/article/sj/xzqh/2020/

而我们要提取这里面的内容
在这里插入图片描述
那这个节点定位到了后,肯定是click点击,然后用xpath提取就可以,点击完成后我要提取 这些数据
在这里插入图片描述
那现在我们的问题来了,我们点击之后出现了两个窗口:
在这里插入图片描述
假如说我们在第一个窗口的时候,我们创建了一个浏览器对象比如代码我们就这样写:

driver.get(url='http://www.mca.gov.cn/article/sj/xzqh/2020/')

这就是打开了这个主页的URL地址的页面
接着我们就要找到这个节点
在这里插入图片描述
代码如下:

driver.find_element_by_xpath(提取节点xpath表达式).click()

这样我们就打开了第二个窗口,就到了这个页面
在这里插入图片描述

我们就是从这个页面里面提取数据,那么问题来了,我们这个driver,提取的到底是那个页面的driver,那我们想一想,如果是第一个页面的,那就只是点击了一下,那还是停留在这个页面,那我们xpath不可能提取数据的吧,所以就明确的说就是第一个页面的∫driver,但是他不可能跑到第二个页面去

所以我们任务就是把主页的driver切换到详情页里面去,也就是第二页里面去,一但我们切换过来了,我们就可以直接xpath提取了,页面也叫做句柄(窗口)

那我们切换句柄也就两句代码:

# li:[<handle1>,<handle2>...]  handle1就是主页的那个,h2就是切换过来的句柄,类似于这种
li.driver.window_handles  # 拿到整个浏览器的句柄
driver.switch_to.window(li[1])  # 获取第二个元素,第一个是主页的

接下里我们写代码:

from selenium import webdriver
import time
# 导入time模块是因为,webdriver打开浏览器页面需要时间

打开浏览器:

# 打开浏览器,输入URL地址
self.driver = webdriver.Chrome()
self.driver.get(url='http://www.mca.gov.cn/article/sj/xzqh/2020/')

接下来我们点到详情页的页面首先提取xpath表达式:

在这里插入图片描述

self.driver.find_element_by_xpath('//*[@id="list_content"]/div[2]/div/ul/table/tbody/tr[1]/td[2]/a').click()
# 只要click(),必须休眠
time.sleep(1)

接着切换句柄,就是上面我们之前写过,那两行代码就是,再然后就是老一套的提取数据,用xpath表达式,表达式就直接复制就行

所以我们就直接奉上所有代码:

"""
selenium抓取民政部最新行政区划代码
"""
from selenium import webdriver
import time

class MzbSpider:
    def __init__(self):
        # 打开浏览器,输入URL地址
        self.driver = webdriver.Chrome()
        self.driver.get(url='http://www.mca.gov.cn/article/sj/xzqh/2020/')

    def parse_html(self):
        self.driver.find_element_by_xpath('//*[@id="list_content"]/div[2]/div/ul/table/tbody/tr[1]/td[2]/a').click()
        # 谨记:只要click(),必须休眠
        time.sleep(1)
        # 切换句柄
        li = self.driver.window_handles
        self.driver.switch_to.window(li[1])
        # 提取数据
        tr_list = self.driver.find_elements_by_xpath('//tr[@height="19"]')
        for tr in tr_list:
            item = {}
            li = tr.text.split()
            item['code'] = li[0]
            item['name'] = li[1]
            print(item)

    def run(self):
        self.parse_html()

if __name__ == '__main__':
    spider = MzbSpider()
    spider.run()
    
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杨旭华 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值