[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("//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"。
        发现每篇文章都是由一个<div></div>组成,如下所示,只需要定位到该位置即可。

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

代码如下所示。注意,在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])

最后希望文章对你有所帮助,如果文章中存在错误或不足之处,还请海涵~
        提高效率,提升科研,认真教学,娜美人生。
      (By:Eastmount 2017-03-13 下午1点半   http://blog.csdn.net/eastmount/

时间: 2024-10-12 15:39:24

[python爬虫] Selenium爬取内容并存储至MySQL数据库的相关文章

[Python爬虫] Selenium爬取新浪微博客户端用户信息、热点话题及评论 (上)

一. 文章介绍 前一篇文章"[python爬虫] Selenium爬取新浪微博内容及用户信息"简单讲述了如何爬取新浪微博手机端用户信息和微博信息. 用户信息:包括用户ID.用户名.微博数.粉丝数.关注数等. 微博信息:包括转发或原创.点赞数.转发数.评论数.发布时间.微博内容等. 它主要通过从文本txt中读取用户id,通过"URL+用户ID" 访问个人网站,如柳岩: http://weibo.cn/guangxianliuya 因为手机端数据相对精简简单,所以采用输

[Python爬虫] Selenium爬取新浪微博移动端热点话题及评论 (下)

这篇文章主要讲述了使用python+selenium爬取新浪微博的热点话题和评论信息.其中使用该爬虫的缺点是效率极低,傻瓜式的爬虫,不能并行执行等,但是它的优点是采用分析DOM树结构分析网页源码并进行信息爬取,同时它可以通过浏览器进行爬取中间过程的演示及验证码的输入.这篇文章对爬虫的详细过程就不再论述了,主要是提供可运行的代码和运行截图即可.希望文章对你有所帮助吧~ 参考文章 [python爬虫] Selenium爬取新浪微博内容及用户信息 [Python爬虫] Selenium爬取新浪微博客户

[python爬虫] Selenium爬取CSDN博客摘要及问题

本文主要是采用Selenium来爬取CSDN的博文摘要,为后面对CSDN的热点技术.近几年专家发表的博客作数据分析.由于采用BeautifulSoup爬取该网站会报错"HTTPError: Forbidden",所以作者采用Selenium爬取.同时,在爬取过程中遇到了局部动态更新的问题,无法定位换页的问题,作者采用Firebug进行分析,也希望读者提出更好的方法.代码下载地址: 一. CSDN博客网站分析及问题 本文主要爬取CSDN专家的博客,因为专家的论文水平相对高点,同时专栏较多

Python爬虫:爬取小说并存储到数据库

爬取小说网站的小说,并保存到数据库 第一步:先获取小说内容 #!/usr/bin/python # -*- coding: UTF-8 -*- import urllib2,re domain = 'http://www.quanshu.net' headers = {     "User-Agent": "Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom

Python爬虫入门 | 爬取豆瓣电影信息

这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬虫的大门啦~好啦,正式开始我们的第二节课<爬取豆瓣电影信息>吧!啦啦哩啦啦,都看黑板~1. 爬虫原理1.1 爬虫基本原理听了那么多的爬虫,到底什么是爬虫?爬虫又是如何工作的呢?我们先从"爬虫原理"说起.爬虫又称为网页蜘蛛,是一种程序或脚本.但重点在于:它能够按照一定的规则,自动

python爬虫:爬取链家深圳全部二手房的详细信息

1.问题描述: 爬取链家深圳全部二手房的详细信息,并将爬取的数据存储到CSV文件中 2.思路分析: (1)目标网址:https://sz.lianjia.com/ershoufang/ (2)代码结构: class LianjiaSpider(object): def __init__(self): def getMaxPage(self, url): # 获取maxPage def parsePage(self, url): # 解析每个page,获取每个huose的Link def pars

Python 爬虫 ajax爬取马云爸爸微博内容

ajax爬取情况 有时候我们在用 Requests 抓取页面的时候,得到的结果可能和在浏览器中看到的是不一样的,在浏览器中可以看到正常显示的页面数据,但是使用 Requests 得到的结果并没有,这其中的原因是 Requests 获取的都是原始的 HTML 文档,而浏览器中的页面则是页面又经过 JavaScript 处理数据后生成的结果,这些数据的来源有多种,可能是通过 Ajax 加载的,可能是包含在了 HTML 文档中的,也可能是经过 JavaScript 经过特定算法计算后生成的 项目代码如

Python爬虫项目--爬取链家热门城市新房

本次实战是利用爬虫爬取链家的新房(声明: 内容仅用于学习交流, 请勿用作商业用途) 环境 win8, python 3.7, pycharm 正文 1. 目标网站分析 通过分析, 找出相关url, 确定请求方式, 是否存在js加密等. 2. 新建scrapy项目 1. 在cmd命令行窗口中输入以下命令, 创建lianjia项目 scrapy startproject lianjia 2. 在cmd中进入lianjia文件中, 创建Spider文件 cd lianjia scrapy genspi

Python爬虫之爬取煎蛋网妹子图

这篇文章通过简单的Python爬虫(未使用框架,仅供娱乐)获取并下载煎蛋网妹子图指定页面或全部图片,并将图片下载到磁盘. 首先导入模块:urllib.request.re.os import urllib.request import re import os urllib.request模块用于获取HTML页面数据 re模块用于通过正则表达式解析并截取HTML页面图片url os模块用于文件夹相关操作 代码不多,直接贴出来,代码解释在注释中: def crawl_jiandan(page, p