您好,欢迎访问一九零五行业门户网

使用python Selenium爬取内容并存储MySQL数据库的实例图解

这篇文章主要介绍了python selenium爬取内容并存储至mysql数据库的实现代码,需要的朋友可以参考下
前面我通过一篇文章讲述了如何爬取csdn的博客摘要等信息。通常,在使用selenium爬虫爬取数据后,需要存储在txt文本中,但是这是很难进行数据处理和数据分析的。这篇文章主要讲述通过selenium爬取我的个人博客信息,然后存储在数据库mysql中,以便对数据进行分析,比如分析哪个时间段发表的博客多、结合wordcloud分析文章的主题、文章阅读量排名等。
这是一篇基础性的文章,希望对您有所帮助,如果文章中出现错误或不足之处,还请海涵。下一篇文章会简单讲解数据分析的过程。
一. 爬取的结果
爬取的地址为:http://blog.csdn.net/eastmount
爬取并存储至mysql数据库的结果如下所示:
运行过程如下图所示:
二. 完整代码分析
完整代码如下所示:
# coding=utf-8 from selenium import webdriver from selenium.webdriver.common.keys import keys import selenium.webdriver.support.ui as ui import re import time import os import codecs import mysqldb #打开firefox浏览器 设定等待加载时间 driver = webdriver.firefox() wait = ui.webdriverwait(driver,10) #获取每个博主的博客页面低端总页码 def getpage(): print 'getpage' number = 0 texts = driver.find_element_by_xpath("//p[@id='papelist']").text print '页码', texts m = re.findall(r'(\w*[0-9]+)\w*',texts) #正则表达式寻找数字 print '页数:' + str(m[1]) return int(m[1]) #主函数 def main(): #获取txt文件总行数 count = len(open("blog_url.txt",'ru').readlines()) print count n = 0 urlfile = open("blog_url.txt",'r') #循环获取每个博主的文章摘信息 while n < count: #这里爬取2个人博客信息,正常情况count个博主信息 url = urlfile.readline() url = url.strip("\n") print url driver.get(url) #获取总页码 allpage = getpage() print u'页码总数为:', allpage time.sleep(2) #数据库操作结合 try: conn=mysqldb.connect(host='localhost',user='root', passwd='123456',port=3306, db='test01') cur=conn.cursor() #数据库游标 #报错:unicodeencodeerror: 'latin-1' codec can't encode character conn.set_character_set('utf8') cur.execute('set names utf8;') cur.execute('set character set utf8;') cur.execute('set character_set_connection=utf8;') #具体内容处理 m = 1 #第1页 while m <= allpage: ur = url + "/article/list/" + str(m) print ur driver.get(ur) #标题 article_title = driver.find_elements_by_xpath("//p[@class='article_title']") for title in article_title: #print url con = title.text con = con.strip("\n") #print con + '\n' #摘要 article_description = driver.find_elements_by_xpath("//p[@class='article_description']") for description in article_description: con = description.text con = con.strip("\n") #print con + '\n' #信息 article_manage = driver.find_elements_by_xpath("//p[@class='article_manage']") for manage in article_manage: con = manage.text con = con.strip("\n") #print con + '\n' num = 0 print u'长度', len(article_title) while num < len(article_title): #插入数据 8个值 sql = '''insert into csdn_blog (url,author,artitle,description,manage,fbtime,ydnum,plnum) values(%s, %s, %s, %s, %s, %s, %s, %s)''' artitle = article_title[num].text description = article_description[num].text manage = article_manage[num].text print artitle print description print manage #获取作者 author = url.split('/')[-1] #获取阅读数和评论数 mode = re.compile(r'\d+\.?\d*') ydnum = mode.findall(manage)[-2] plnum = mode.findall(manage)[-1] print ydnum print plnum #获取发布时间 end = manage.find(u' 阅读') fbtime = manage[:end] cur.execute(sql, (url, author, artitle, description, manage,fbtime,ydnum,plnum)) num = num + 1 else: print u'数据库插入成功' m = m + 1 #异常处理 except mysqldb.error,e: print "mysql error %d: %s" % (e.args[0], e.args[1]) finally: cur.close() conn.commit() conn.close() n = n + 1 else: urlfile.close() print 'load over' main()
在blog_url.txt文件中放置需要爬取用户的博客地址url,如下图所示。注意在此处,作者预先写了个爬取csdn所有专家的url代码,这里为访问其他人用于提升阅读量已省略。
分析过程如下所示。
1.获取博主总页码
首先从blog_url.txt读取博主地址,然后访问并获取页码总数。代码如下:
#获取每个博主的博客页面低端总页码 def getpage(): print 'getpage' number = 0 texts = driver.find_element_by_xpath("//p[@id='papelist']").text print '页码', texts m = re.findall(r'(\w*[0-9]+)\w*',texts) #正则表达式寻找数字 print '页数:' + str(m[1]) return int(m[1])
比如获取总页码位17页,如下图所示:
2.翻页dom树分析
这里的博客翻页采用的是url连接,比较方便。
如:http://blog.csdn.net/eastmount/article/list/2
故只需要 :1.获取总页码;2.爬取每页信息;3.url设置进行循环翻页;4.再爬取。
也可以采用点击"下页"跳转,没有"下页"停止跳转,爬虫结束,接着爬取下一个博主。
3.获取详细信息:标题、摘要、时间
然后审查元素分析每个博客页面,如果采用beautifulsoup爬取会报错"forbidden"。
发现每篇文章都是由一个<p></p>组成,如下所示,只需要定位到该位置即可。
这里定位到该位置即可爬取,这里需要分别定位标题、摘要、时间。
代码如下所示。注意,在while中同时获取三个值,它们是对应的。
#标题 article_title = driver.find_elements_by_xpath("//p[@class='article_title']") for title in article_title: con = title.text con = con.strip("\n") print con + '\n' #摘要 article_description = driver.find_elements_by_xpath("//p[@class='article_description']") for description in article_description: con = description.text con = con.strip("\n") print con + '\n' #信息 article_manage = driver.find_elements_by_xpath("//p[@class='article_manage']") for manage in article_manage: con = manage.text con = con.strip("\n") print con + '\n' num = 0 print u'长度', len(article_title) while num < len(article_title): artitle = article_title[num].text description = article_description[num].text manage = article_manage[num].text print artitle, description, manage
4.特殊字符串处理
获取url最后一个/后的博主名称、获取字符串时间、阅读数代码如下:
#获取博主姓名 url = "http://blog.csdn.net/eastmount" print url.split('/')[-1] #输出: eastmount #获取数字 name = "2015-09-08 18:06 阅读(909) 评论(0)" print name import re mode = re.compile(r'\d+\.?\d*') print mode.findall(name) #输出: ['2015', '09', '08', '18', '06', '909', '0'] print mode.findall(name)[-2] #输出: 909 #获取时间 end = name.find(r' 阅读') print name[:end] #输出: 2015-09-08 18:06 import time, datetime a = time.strptime(name[:end],'%y-%m-%d %h:%m') print a #输出: time.struct_time(tm_year=2015, tm_mon=9, tm_mday=8, tm_hour=18, tm_min=6, # tm_sec=0, tm_wday=1, tm_yday=251, tm_isdst=-1)
三. 数据库相关操作
sql语句创建表代码如下:
create table `csdn` ( `id` int(11) not null auto_increment, `url` varchar(100) collate utf8_bin default null, `author` varchar(50) collate utf8_bin default null comment '作者', `artitle` varchar(100) collate utf8_bin default null comment '标题', `description` varchar(400) collate utf8_bin default null comment '摘要', `manage` varchar(100) collate utf8_bin default null comment '信息', `fbtime` datetime default null comment '发布日期', `ydnum` int(11) default null comment '阅读数', `plnum` int(11) default null comment '评论数', `dznum` int(11) default null comment '点赞数', primary key (`id`) ) engine=innodb auto_increment=9371 default charset=utf8 collate=utf8_bin;
显示如下图所示:
其中,python调用mysql推荐下面这篇文字。
python专题九.mysql数据库编程基础知识
核心代码如下所示:
# coding:utf-8 import mysqldb try: conn=mysqldb.connect(host='localhost',user='root',passwd='123456',port=3306, db='test01') cur=conn.cursor() #插入数据 sql = '''insert into student values(%s, %s, %s)''' cur.execute(sql, ('yxz','111111', '10')) #查看数据 print u'\n插入数据:' cur.execute('select * from student') for data in cur.fetchall(): print '%s %s %s' % data cur.close() conn.commit() conn.close() except mysqldb.error,e: print "mysql error %d: %s" % (e.args[0], e.args[1])
注意,在下载过程中,有的网站是新版本的,无法获取页码。
比如:http://blog.csdn.net/michaelzhou224
这时需要简单设置,跳过这些链接,并保存到文件中,核心代码如下所示:
#获取每个博主的博客页面低端总页码 def getpage(): print 'getpage' number = 0 #texts = driver.find_element_by_xpath("//p[@id='papelist']").text texts = driver.find_element_by_xpath("//p[@class='pagelist']").text print 'testsss' print u'页码', texts if texts=="": print u'页码为0 网站错误' return 0 m = re.findall(r'(\w*[0-9]+)\w*',texts) #正则表达式寻找数字 print u'页数:' + str(m[1]) return int(m[1])
主函数修改:
error = codecs.open("blog_error.txt", 'a', 'utf-8') #循环获取每个博主的文章摘信息 while n < count: #这里爬取2个人博客信息,正常情况count个博主信息 url = urlfile.readline() url = url.strip("\n") print url driver.get(url+"/article/list/1") #print driver.page_source #获取总页码 allpage = getpage() print u'页码总数为:', allpage #返回错误,否则程序总截住 if allpage==0: error.write(url + "\r\n") print u'错误url' continue; #跳过进入下一个博主 time.sleep(2) #数据库操作结合 try: .....
以上就是使用python selenium爬取内容并存储mysql数据库的实例图解的详细内容。
其它类似信息

推荐信息