以爬取糗事百科中24小时网页中第一列表页中所有文章的内容,作者,搞笑数,评论数为例,将爬取的四项内容存入到mysql数据库中。
思路:要想存入到数据库中就需要用到数据库中的表,所以我们首先创建一个名叫‘myblog’的数据库,然后在此数据库中建立一个名
叫‘qiushi’的表,可以使用命令符进入mysql数据库,使用mysql语句进行创建。也可以使用Navicat Premium软件直接连接mysql数据库,在
可视化界面直接进行操作。如下图所示,在qiushi表中建立如下类型的字段。
然后需要用python连接数据库,需要用到pymsql模块,此模块为python的三方模块,需要进行引入下载,。然后创建连接的语句如下程序所示:
# mysql数据库服务器,端口:3306,而且确保服务器是处于启动状态
# 安装pymysql:pip install pymysql
import pymysql
# 建立连接
conn = pymysql.connect('127.0.0.1','root','密码','myblog',charset='utf8')
# 建立游标
cursor = conn.cursor()
# 数据库操作
# (1)定义一个格式化的sql语句
sql = 'insert into qiushi(author,funny_num,comment_num,content) values(%s,%s,%s,%s) '
# (2)准备数据
data = ('nancy','30','100','太好笑了')
# (3)操作
try:
cursor.execute(sql,data)
conn.commit()
except Exception as e:
print('插入数据失败',e)
conn.rollback() #回滚
# 关闭游标
cursor.close()
# 关闭连接
conn.close()
由于我们要做项目的时候不可能将这一段代码都拼接到我们的爬取程序文件当中,所以我们可以将这些语句封装为一个类的形式,每次爬
虫完成之后,可以在该程序中直接实例化一个类对象,然后调用类中存入数据库的一个方法来进行数据的存入。
封装后的类形式如下程序所示;
首先是settings.py文件用来写入连接mysql数据的各项参数,连接的ip,端口,mysql数据库密码,连接的数据库名字
# 该文件存储项目中的所有配置参数
MYSQL_HOST = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_PWD = '密码'
MYSQL_DB = 'myblog'
创建类的文件:
# mysql数据库服务器,端口:3306,而且服务器是处于启动状态
# 安装pymysql:pip install pymysql
import pymysql
import threading
from settings import MYSQL_HOST,MYSQL_DB,MYSQL_PWD,MYSQL_USER
class DataManager():
# 单例模式,确保每次实例化都调用一个对象。
_instance_lock = threading.Lock()
def __new__(cls, *args, **kwargs):
if not hasattr(DataManager,"_instance"):
with DataManager._instance_lock:
DataManager._instance = object.__new__(cls)
return DataManager._instance
return DataManager._instance
def __init__(self):
# 建立连接
self.conn = pymysql.connect(MYSQL_HOST,MYSQL_USER,MYSQL_PWD,MYSQL_DB,charset='utf8')
# 建立游标
self.cursor = self.conn.cursor()
def save_data(self,data):
# 数据库操作
# (1)定义一个格式化的sql语句
sql = 'insert into qiushi(author,funny_num,comment_num,content) values(%s,%s,%s,%s) '
# (2)准备数据
# data = ('nancy','30','100','太好笑了')
# (3)操作
try:
self.cursor.execute(sql,data)
self.conn.commit()
except Exception as e:
print('插入数据失败',e)
self.conn.rollback() #回滚
def __del__(self):
# 关闭游标
self.cursor.close()
# 关闭连接
self.conn.close()
然后可以直接进行爬虫,在爬虫程序中可以先引入类文件中的类名,进行实例化创建一个类对象,然后直接调用类中的save_data方法就可以将爬取的数据存入到数据中。
具体程序如下:
import requests
from lxml import etree
from datamanage import DataManager
# 实例化数据库类对象
db = DataManager()
# 判空
def getDataFormList(temp_list):
if len(temp_list) > 0:
return temp_list[0].strip()
else:
return ''
# 接口
base_url = 'https://www.qiushibaike.com/hot/page/%d/'
# 网络请求
for page in range(1,2,1):
# url = 'https://www.qiushibaike.com/hot/page/%d/'%(page)
url = base_url%(page)
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
# response = requests.get(url,headers = headers,)
response = requests.request('get',url = url,headers = headers,verify = False )
with open('qiushi.html','w',encoding=response.encoding) as fp:
fp.write(response.text)
# 数据提取
tree = etree.HTML(response.text)
h2_list = tree.xpath('//h2/text()')
# 先定位到文章列表
article_list = tree.xpath('//div[contains(@id,"qiushi_tag_")]')
for article in article_list:
# 作者
author_list = article.xpath('./div/a/h2/text()')
author = getDataFormList(author_list).strip()
# print('作者:',author)
# 好笑数
funny_number_list = article.xpath('.//i[@class="number"]/text()')
funny_number = getDataFormList(funny_number_list)
# print('好笑数:',funny_number)
# 评论数
comment_list = article.xpath('.//a[@class="qiushi_comments"]/i/text()')
comment = getDataFormList(comment_list).strip()
# print('评论数:',comment)
# 段子内容
content_list = article.xpath('.//div[@class="content"]/span/text()')
content = getDataFormList(content_list).strip()
# print('段子内容:',content)
print(author,content,comment,funny_number,)
# 图片链接
# pic_list = article.xpath('')
# 数据存储
# data = (author,content,comment,funny_number)
# 注意此处存储数据时,要和插入mysql表中的mysql语句中的字段相对应,否则会报错。
data = (author,funny_number,comment,content)
db.save_data(data)
运行后数据库结果如下: