python爬虫实践

4 篇文章 0 订阅

近期学习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后,筒子们还要继续努力啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值