欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于爬虫学习的一些小小记录(四)——爬取数据存入数据库

程序员文章站 2022-05-03 12:53:45
...

关于爬虫学习的一些小小记录(四)——爬取数据存入数据库


前面我们已经讲了怎么访问网页,并且从网页源码中提取数据。既然数据有了,怎样管理就是下一个需要考虑的问题。这次我们就简单讲讲怎么把爬虫爬取到的数据存入数据库中,以爬取简书文章为例

创建数据库

我们使用的是 MySQL 数据库,不同于 NoSQL 可以直接插入数据,MySQL 需要预先定义数据模式。所以,我们需要先创建一个数据库用于存储爬虫数据

我所使用的数据库图形界面管理工具是 Navicat for MySQL,创建过程如下

打开连接,右键,新建数据库。数据库命名为 pypc,字符集选择 utf-8,排序规则选 utf8_general_ci
关于爬虫学习的一些小小记录(四)——爬取数据存入数据库
打开刚才新建的数据库,新建一张数据表,命名为simplebook,添加四个栏位,分别为 id、title、url、abstract。除了 id 作为主键,剩余的栏位依次存储文章的标题、链接、摘要
关于爬虫学习的一些小小记录(四)——爬取数据存入数据库
好了,这样就可以存入数据了

pymysql 模块

再说一下 Python 脚本与 MySQL 数据库的连接
pymysql是一个很常用 Python 的第三方库,它提供了与 MySQL 数据库连接、执行操作的方法
GitHub 源码地址
菜鸟教程中 pymysql 的部分

我们可以使用pymysql.connect()方法连接数据库,主要参数有
host,MySQL 服务器地址
port,MySQL 服务器端口号
user,登录数据库的用户名
passwd,登录数据库的用户口令
db,待连接的数据库名称
charset,连接的编码方式

connect()方法返回一个 connection 对象,我们主要用到该对象中的方法创建连接 cursor,进而调用execute()方法执行 SQL 语句,可以对数据库进行查询、增删等操作
所以,还需要去学习一点点 SQL……当然,在这里,你会一句就够了

除了 pymysql 模块,Python 中还有 MySQL 官方提供的 mysql-connector 模块可以连接并管理数据库,这里不做多讲,需要可自取:菜鸟教程

具体操作

简书首页地址:https://www.jianshu.com/

还是先打开网页,查看源码进行分析
关于爬虫学习的一些小小记录(四)——爬取数据存入数据库
可以看见,我们需要的几个信息,文章的标题和站内链接地址都可以在 CSS 类名为 title 的 a 标签中获取,文章摘要在 CSS 类名为 abstract 的 p 标签中

可以直接编写爬虫代码

# 爬虫--爬取简书文章存到数据库

import pymysql
from urllib import request
from bs4 import BeautifulSoup

# mysql连接信息
db_config = {
	'host': 'localhost',  # MySQL 服务器为本地主机
	'port': 3306,  # 端口号
	'user': 'root',  # 用户名 root
	'password': 'xxxxxxxx',  # 口令(才不告诉你)
	'db': 'pypc',
	'charset': 'utf8'
}

mydb = pymysql.connect(**db_config)  # 连接数据库

url = 'https://www.jianshu.com/'  # 简书首页
page = request.Request(url)
page.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0')
page_info = request.urlopen(page).read().decode()  # 访问连接
soup = BeautifulSoup(page_info, 'html.parser')

titles = soup.find_all('a', 'title')  # 搜索标题和链接
abstracts = soup.find_all('p', 'abstract')  # 搜索摘要

with mydb.cursor() as cs:  # 获取数据库游标
	sql = 'insert into simplebook(title, url, abstract) values(%s, %s, %s)' # 待执行的sql语句,把元组数据插入title、url、abstract栏
	i = 0
	while i < len(titles):
		t_url = r'http://www.jianshu.com' + titles[i].attrs['href']  # 提取到的是站内链接,完整链接需加上域名地址
		cs.execute(sql, (titles[i].string, t_url, abstracts[i].string))  # 执行 sql 语句
		i += 1

mydb.commit()  # 提交当前事务
mydb.close()  # 关闭连接

运行结果
关于爬虫学习的一些小小记录(四)——爬取数据存入数据库
因为简书首页文章列表刷新的时间间隔比较短,所以我们运行时爬下来的数据和刚才我们分析时的数据并不一样(手残党伤不起),不过这并不影响我们的效果

预知后事如何

不同于之前几篇的爬虫,刚刚我们的代码中有这么两行

page = request.Request(url)
page.add_header('User-Agent', 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0')

如果去掉这两行,直接 open 我们的 url,会怎样?

Traceback (most recent call last):
  File "E:\Python\爬虫\爬虫-爬取简书文章存到数据库.py", line 23, in <module>
    page_info = request.urlopen(url).read().decode()
  File "E:\Python\Python37-32\lib\urllib\request.py", line 222, in urlopen
    return opener.open(url, data, timeout)
  File "E:\Python\Python37-32\lib\urllib\request.py", line 531, in open
    response = meth(req, response)
  File "E:\Python\Python37-32\lib\urllib\request.py", line 641, in http_response
    'http', request, response, code, msg, hdrs)
  File "E:\Python\Python37-32\lib\urllib\request.py", line 569, in error
    return self._call_chain(*args)
  File "E:\Python\Python37-32\lib\urllib\request.py", line 503, in _call_chain
    result = func(*args)
  File "E:\Python\Python37-32\lib\urllib\request.py", line 649, in http_error_default
    raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 403: Forbidden
[Finished in 0.6s with exit code 1]

这就是我下一篇要写的
(感觉好装啊,别打我)

相关标签: Python 爬虫