python3.7爬虫实战系列爬取掘金网首页存入mysql数据库

博主是个前端小白,最近在学习爬虫,写个实战系列也是想记录自己学习的过程,以便后续回顾

欢迎大家一起交流学习、共同进步

这篇文章达成的效果是爬掘金网的首页的数据存到mysql数据库里

做这个实战你需要具有一点点python的基础知识,当然没有也行可以复制我的代码先跑一跑感受一下会有动力一点

爬取的网站:https://juejin.im/timeline

系统:win10

python版本:3.7

MYSQL安装包下载:https://dev.mysql.com/downloads/windows/installer/ 

mysql-installer-web-community  15.9M那个是在线安装

mysql-installer-community 推荐下载第二个离线安装

现在这个安装包好像不分32位还是64位,我是64位的安装成功,MSI安装版安装挺简单的我就不赘述了(其实我安装蛮久了没记录下来)

安装完成可以通过·mysql -u root -p查看

mysql安装成功后你还需要一个python操作mysql的库,cmd执行使用pip安装pymysql:

pip install pymysql

环境准备好后就开始愉快的学习吧

网站分析

我们进入网站https://juejin.im/,然后打开f12(博主用的是chrome浏览器,在前端眼里chrome是最好浏览器没有之一)

掘金网是个动态网站,即客户端(浏览器)根据服务端(服务器)返回的数据动态渲染网页

那么数据从哪儿来,服务端会根据客户端不同的请求或者请求参数的差异来返回数据

这里我们需要登陆下,我们登陆成功即通过服务端验证后服务器会签发一个 Token发送给客户端,你可以理解为一个验证身份的令牌,客户端收到 Token 以后把它存储起来,每次向服务端请求资源的时候都需要带着这个token,服务端收到请求,去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

我们可以看到有很多请求,什么图片、脚本资源、svg很多

点击XHR按钮过滤请求只显示XMLHttpRequest方法发送的请求

过滤之后现在挨着查看,找到返回文章数据的那条请求

大部分数据都是页面或者服务器做判断用的,我们提取这些参数就好

['category']['name'] 文章分类
['title'] 文章标题
['content'] 文章概要
['originalUrl'] 文章链接
[’tags'] 文章标签
['user']['username'] 文章作者

然后我们查看他的Headers,滑到底部可以看到uery string params是由客户端发给服务器时请求携带的参数

这些参数里面有个limit是请求的条数,就是你请求多少条就会返回多少条数据

现在上代码

需要3个库,除了第一个pymsql以为都是python自带的

import pymysql # 操作mysql的库
from urllib import request, parse #请求需要的库
import json # 处理参数需要的库

我们先发送请求获取数据 

def juejin_req(data_num): # data_num是请求的条数
    url = 'https://timeline-merger-ms.juejin.im/v1/get_entry_by_rank' # 请求的url
    req_data = {  # 请求需要携带的参数
        'src': 'web',
        'uid': '5b5ebcd1f265da0f60132076',
        'device_id': 1533608440568,
        'token': '你的token',
        'limit': data_num,
        'category': 'all',
        'recomment': 1
    }
    req_data = str(parse.urlencode(req_data, 'utf-8')) # 由于是get请求所以我们在使用parse.urlencode()方法转换编码格式后还需要使用str()方法转换为字符串
    json_data = request.urlopen(url+'?'+req_data) # 拼凑url发送请求
    print('数据请求成功')
    json_data = json_data.read().decode('utf-8')  # 拿到数据转换编码格式
    json_data = json.loads(json_data)  # 使用json.loads()将字符串序列化
    json_data = json_data['d']['entrylist'] # 获取到数据列表
    sql_data = [] # 最后储存到数据的变量
    for item in json_data: # 循环遍历列表提取需要的数据
        tag = [] 
        for aa in item['tags']: # 提取标签
            tag.append(aa['title'])
        sql_data.append((item['category']['name'],  item['title'], item['content'], item['originalUrl'], str(tag), item['user']['username'],))
    print('一共有%s条数据' % len(sql_data))
    return sql_data

打开workbench,这是自带的一款可视化的sql操作工具

首先我们先新建一个连接

点击新建一个连接-----填上连接名字hellosql-----点击ok-----在弹出的弹框中输入你的密码--点击ok

连接建立后我们新建一个数据库,在左侧红圈空白地方右键---create scheme(新建一个数据库),这地方我已经建了

输入数据库名字reptiledata---点击apply---出现一个弹框继续点击apply,这样我们就新建了一个数据库

这是操作数据库的代码,获取到请求的数据后将数据return处理在传给juejin_sql函数,所以把这段代码放在上面那段代码后面 

def juejin_sql(sql_data):
    print('连接数据库')
    db = pymysql.connect(host='localhost',
                        port=3306, # 端口号
                        user='root', 
                        password='123456', # 密码
                        database='reptiledata') # 数据库
    cursor = db.cursor() # 建立一个游标对象
    try:
        #判断表是否存在,若不存在则新建
        cursor.execute("""CREATE TABLE IF NOT EXISTS juejin(
                    category  TEXT,
                    title  TEXT,
                    content  TEXT,
                    originalUrl  TEXT,
                    tags  TEXT,
                    username TEXT)""")
    except:
        print("Table 'juejin' already exists")
        return False
    sql = """insert into juejin(category, title, content, originalUrl, tags, username)
            values (%s, %s, %s, %s, %s, %s)""" # sql语句
    print('正在批量添加')
    cursor.executemany(sql, sql_data) # 批量添加
    cursor.execute('select count(*) from juejin')
    results = cursor.fetchall() # 查询全部总条数
    print('数据库目前有%d条数据' % results[0][0])
    db.commit()  # 对于数据增删改之后一定要提交操作
    cursor.close()  # 关闭游标
    print('操作完成关闭数据库关闭游标')
    db.close()  # 关闭数据库连接

juejin_sql(juejin_req(100))

然后运行代码,效果就达成了

文章若有误,欢迎留言指出(๑•̀ㅂ•́)و✧          若喜欢请点赞 d=====( ̄▽ ̄*)b

猜你喜欢

转载自blog.csdn.net/Tong_11/article/details/81358697