在之前已经实现了将爬取到的信息直接打印出来,但这样是远远不够的,要对数据进行进一步的处理,就要将其存放在数据库中,我的方法是先将数据调整格式后储存在本地的Excel中,然后再由Excel导入数据库。
对Excel进行操作主要用到了xlwt模块,官网下载(http://pypi.python.org/pypi/xlwt)。大致使用流程如下:
1、导入模块
import xlwt
2、创建workbook(其实就是excel,后来保存一下就行)
workbook = xlwt.Workbook(encoding = 'utf-8')
3、创建表
worksheet = workbook.add_sheet('My Worksheet')
4、往单元格内写入内容
worksheet.write(0, 0, x)
该函数的前两个变量分别表示单元格的横纵坐标,与数组类似,第三个变量为写入单元格的内容
5、保存
workbook.save('Excel_Workbook.xls')
附源码:
__author__='XJX'
__date__='2017.07.19'
import re
import urllib.request
import urllib
import xlwt
#网址
url1 = "http://drugs.medlive.cn/drugref/html/"
url2 = ".shtml"
i = 1
book=xlwt.Workbook(encoding='utf-8')
sheet1=book.add_sheet('sheet1',cell_overwrite_ok=True)
heads=[u'药品名称',u'所属类别',u'性状',u'适应症',u'用法用量',u'不良反应',u'注意事项',u'url']
ii=0
for head in heads:
sheet1.write(0,ii,head)
ii+=1
for n in range(2,14579):
url = url1 + str(n) + url2
try:
#抓取页面
urlop = urllib.request.urlopen(url,timeout=100)
except Exception:
print("超时")
continue
#判断是否为html页面
if 'html' not in urlop.getheader('Content-Type'):
continue
#避免程序异常中止, 用try..catch处理异常
try:
#转换为utf-8码
data = urlop.read().decode('utf-8')
#print(data)
except:
continue
#正则表达式提取页面中所有队列, 并判断是否已经访问过, 然后加入待爬队列
linkre1 = re.compile("<label class=\"w110\">【通用名称】</label>\\s*\\s*(.*?)\\s*\\s*<")
for x in linkre1.findall(data):##返回所有有匹配的列表
sheet1.write(i,0,x)
print(x)
linkre2 = re.compile("class=\"have-h\">\\s*(.*?)\\s*</a>\\s*</p>\\s*</div>")
for x in linkre2.findall(data):##返回所有有匹配的列表
sheet1.write(i,1,x)
#print(x)
linkre3 = re.compile("性状:</a>\\s*</div>\\s*<div class=\"more-infomation\">\\s*<p>(.*?)</p>\\s*</div>")
for x in linkre3.findall(data):##返回所有有匹配的列表
sheet1.write(i,2,x)
#print(x)
linkre4 = re.compile("适应症:</a>\\s*</div>\\s*<div class=\"more-infomation\">\\s*<p>(.*?)</p>\\s*</div>")
for x in linkre4.findall(data):##返回所有有匹配的列表
sheet1.write(i,3,x)
#print(x)
linkre5 = re.compile("用法用量:\\s*</a>\\s*</div>\\s*<div class=\"more-infomation\">\\s*<p>(.*?)</p>\\s*</div>")
for x in linkre5.findall(data):##返回所有有匹配的列表
sheet1.write(i,4,x)
#print(x)
linkre6 = re.compile("不良反应:</a>\\s*</div>\\s*<div class=\"more-infomation\">\\s*<p>(.*?)</p>\\s*</div>")
for x in linkre6.findall(data):##返回所有有匹配的列表
sheet1.write(i,5,x)
#print(x)
linkre7 = re.compile("注意事项:</a>\\s*</div>\\s*<div class=\"more-infomation\">\\s*<p>(.*?)</p>\\s*</div>")
for x in linkre7.findall(data):##返回所有有匹配的列表
sheet1.write(i,6,x)
#print(x)
sheet1.write(i,7,x)
print(url)
i += 1
book.save("/Users/xujiaxing/Desktop/data.xls")
完成了将爬取信息导入表格后就可以将表格信息导入数据库了
在这里我用的是Navicat for SQL Server
导入方法参考http://www.cnblogs.com/wanggd/archive/2012/11/09/2762761.html即可
需要注意的是,导入指定类型数据时栏位对应数据的长度应根据数据的最大长度确定,否则将无法成功导入
为了防止这种情况的出现,我将中文文本的类型都设置为了nvarchar(max),可以理解为是汉字的最大长度,将英文文本的类型都设置为了varchar(max),可以理解为是非汉字字符的最大长度,既然都已经设置成了最大,后面的size就不用管直接默认是0就可以了
这样我们就成功将爬取到的数据导入了数据库