近期学习python爬虫,且正好帝都公布了19年积分落户名单,实践一下爬取名单并存入数据库,统计下各个阶段落户的人数:
页面请求分析
可以很直观的看到,页面数据是通过ajax请求获取的,请求方法为post,参数为rows和page,返回响应为html文档。
代码实现
- 模拟请求获取响应的数据
import requests
from bs4 import BeautifulSoup
import mysql
base_url = 'http://rsj.beijing.gov.cn/integralpublic/settlePerson/tablePage'
headers = {
'Host': 'rsj.beijing.gov.cn',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/58.0.3029.110 Safari/537.36',
'X-Requested-With': 'XMLHttpRequest',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Connection': 'keep-alive'
}
def get_page(page):
params = {
'rows': 100,
'page':(page-1)*100
}
try:
response = requests.post(url=base_url, data=params,headers=headers)
if response.status_code == 200:
parse(response.text)
except requests.ConnectionError as e:
print('Error', e.args)
- 定义解析html的函数,并将解析的名单数据存在list中,每次循环需要清空list;
person = []
def parse(html):
person.clear();
soup = BeautifulSoup(html, 'lxml')
tables = soup.findAll('table')
tab = tables[0]
for tr in tab.tbody.findAll('tr'):
person.clear()
for td in tr.findAll('td'):
person.append(td.getText())
mysql.insert(person)
- 将解析的list中的数据存储在mysql数据库中,前提是已创建库和表,可以手动创建或通过程序创建;
import pymysql
def insert(person):
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306,db='spiders')
# 使用cursor()方法获取操作游标
cursor = db.cursor()
# SQL 插入语句
sql = "INSERT INTO person(id,name, brithday, department, score)VALUE ('%s', '%s','%s', '%s','%s')" %(person[0],person[1],person[2],person[3],person[4])
try:
# 执行sql语句
cursor.execute(sql)
# 提交到数据库执行
db.commit()
except Exception as e:
print(e)
# Rollback in case there is any error
db.rollback()
# 关闭数据库连接
db.close()
定义调用的主方法:
if __name__ == '__main__':
for page in range(1, 62):# 通过名单公布人数计算写死了
get_page(page)
运行完之后,名单数据已保存在db中,通过sql分析结果如下:
50后:1人
60后:45人
70后:4758人
80后:1203人
这个结果很桑心啊 ,主力军是70和80后,筒子们还要继续努力啊!