大家好,我是马哥。废话不多说,直接开始!
目标网站:济南市统计局官网的统计数据:http://jntj.jinan.gov.cn/col/col18253/index.html
出于职业操守(hai pa)的考虑,先看一下目标网站的robots.txt:
页面显示,只有部分col目录下数据是Disallow的,其他目录可以爬取,OK,前方安全,兄弟们给我上!
随便打开一个链接,比如:
打开"2021年全年数据"链接之后,页面上是一堆表格,我数了数,一共21个这种数据表格。
对着其中一个表格,右键,检查,查看元素属性:
果然是<table>标签的表格,那就好办了,爬虫神器登场!(亮个相吧小宝贝~)
先整体看一下代码,一共14行!
首先,导入需要用到的库:
import pandas as pd # 存入数据
import requests # 发送请求
定义爬取目标网址:
url = 'http://jntj.jinan.gov.cn/art/2022/2/7/art_18279_4745121.html' # 目标网址
定义一个请求头,并发送请求:
header = { # 请求头
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Mobile Safari/537.36', }
r = requests.get(url, headers=header) # 发送请求
下面神器登场,用read_html一行代码,直接读取请求返回的页面内容即可!
df = pd.read_html(r.content) # 爬虫神器
就爬取到了这21个表格数据,后面就存入excel完事了,是不是很棒!
可以试想,如果按照常规的爬虫开发流程,分析页面的table、每一行的tr、每一列的td,按照这个步骤去分析页面写爬虫代码,得写多少逻辑处理呢 - -!
所以说,神器真的是,好用!!
存入excel时,由于我想把每个表格放到1个sheet页里,所以,这样实现逻辑:
with pd.ExcelWriter('data.xlsx') as writer:
for i in range(2, table_count - 1): # 第0、1、-1个表格不是需要的,所有从第2个开始
df[i].to_excel(writer, sheet_name=str(i), index=False, header=False)
print('已保存完成:第{}个表格'.format(str(i)))
细心的你,可能会有疑问:
为什么不直接用read_html(url)爬取,而要先requests.get(url),再用read_html呢?
没错,反爬较弱的网站,可以这样。
但,济南市统计局网站,我试过直接用read_html(url),会返回403错误码,403 Forbidden!你懂了吧。。
所以先requests.get(url),这样就能带上request header了,伪装好自己~
爬取完成后,看一下结果:
一共21个sheet页,每个sheet页对应一个表格数据。
最后,针对其他链接的统计局表格数据,同理,这里就不做演示了,照葫芦画瓢,改目标URL就是了~
本次案例爬虫代码相对简单,总共只有14行代码,大家对照着复制我上面的代码即可。