python爬虫之爬取掘金网首页存入mysql数据库

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

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

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

image.png

image.png

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

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

系统:win10

python版本:3.7

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

image.png

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
image.gif

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

网站分析

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

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

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

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

image.png

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

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

image.png

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

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

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

image.png

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

image.png

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

现在上代码

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

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

我们先发送请求获取数据

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
image.gif

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

image.png

首先我们先新建一个连接

image.png

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

image.png

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

image.png

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

image.png

这是操作数据库的代码,获取到请求的数据后将数据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))
image.gif

然后运行代码,成功添加进数据库

image.png

欢迎留言交流 (´▽`ʃ♡ƪ)**

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容