最近需要大量爬取数据,像之前那样存储在单个文件中已不合适,本文主要以维基百科为例,将爬取的词条数据导入到MySQL中。
在用Python连接MySQL之前,需要先安装一个Python包pymsql。 在Anaconda中的安装过程如下图所示;
在正式开始之前,先介绍下Python连接MySQL的标准流程。在Python中将数据存储到MySQL的流程主要包括连接数据库、创建会话、断开数据库连接等。
(1)连接数据库
connection = pymysql.connect(host = 'localhost', user = 'root', password = '123456', db = 'wikiurl', charset = 'utf8mb4')(2)创建会话
在执行数据存储操作时,该会话会一直存在,在此期间主要执行创建sql语句、执行sql语句、提交结果等操作。
try: #获取会话指针 with connection.cursor() as cursor: #创建sql语句 sql = "insert into `urls` (`urlname`,`urlhref`) values (%s,%s)" #执行sql语句 cursor.execute(sql,(url.get_text(),"https://en.wikipedia.org" + url['href'])) #提交 connection.commit() finally: connection.close()(3)断开数据库连接
connection.close()代码如下所示:
# -*- coding: utf-8 -*- """ Created on Thu May 4 21:01:38 2017 @author: zch """ from urllib.request import urlopen from bs4 import BeautifulSoup import re import pymysql.cursors #请求URL并将结果用UTF-8编码 response = urlopen('https://en.wikipedia.org/wiki/Main_Page').read().decode('utf-8') #用BeautifulSoup解析 soup = BeautifulSoup(response,'lxml') #print(soup.head.title.string) #print(soup) #p_text = soup.find('a',href=re.compile(r"/wiki/Deaths_in_2017")) #print(p_text.name,p_text.get_text()) #获取所有以/wiki/开头的a标签的href属性 listUrls = soup.find_all('a',href=re.compile('^/wiki/')) for url in listUrls: #过滤掉所有以.jpg或.JPG结尾的url if not re.search('\.(jpg|JPG)$',url['href']): #输出所有Wikipedia词条和对应的URL链接 print(url.get_text(),"---->","https://en.wikipedia.org" + url['href']) #获取数据库链接 connection = pymysql.connect(host = 'localhost', user = 'root', password = '123456', db = 'wikiurl', charset = 'utf8mb4') try: #获取会话指针 with connection.cursor() as cursor: #创建sql语句 sql = "insert into `urls` (`urlname`,`urlhref`) values (%s,%s)" #执行sql语句 cursor.execute(sql,(url.get_text(),"https://en.wikipedia.org" + url['href'])) #提交 connection.commit() finally: connection.close()执行后MySQL数据库情况如下图所示:
如果在运行的过程中,出现以下认证错误的话:
URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>可以导入ssl模块,并做全局设置:
import ssl ssl._create_default_https_context = ssl._create_unverified_context