python Selenium爬取内容并存储至MySQL数据库的实现代码

发表于 5年以前  | 总阅读数:569 次

前面我通过一篇文章讲述了如何爬取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("//div[@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("//div[@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("//div[@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("//div[@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("//div[@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"。
发现每篇文章都是由一个

组成,如下所示,只需要定位到该位置即可。

    这里定位到该位置即可爬取,这里需要分别定位标题、摘要、时间。  

代码如下所示。注意,在while中同时获取三个值,它们是对应的。


    #标题
    article_title = driver.find_elements_by_xpath("//div[@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("//div[@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("//div[@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("//div[@id='papelist']").text
     texts = driver.find_element_by_xpath("//div[@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:
        .....

最后希望文章对你有所帮助,如果文章中存在错误或不足之处,还请海涵~
提高效率,提升科研,认真教学,娜美人生。

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237289次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8126次阅读
 目录