温馨提示:
爬虫玩得好,监狱进得早。数据玩得溜,牢饭吃个够。
《刑法》第 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()