python爬虫之爬取掘金网首页存入mysql数据库
1.5k6PYTHON网络爬虫2018-08-07

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

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

这篇文章达成的效果是爬掘金网的首页的数据存到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自带的

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

我们先发送请求获取数据 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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函数,所以把这段代码放在上面那段代码后面 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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))

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