美文网首页爬虫搜集爬虫专题Python 学习之路
利用scrapy爬取简书文章并保存到数据库

利用scrapy爬取简书文章并保存到数据库

作者: 简讯Alfred | 来源:发表于2017-02-12 13:09 被阅读2172次

    这篇文章主要是介绍利用scrapy爬取简书IT专栏的文章,并把爬取结果保存到数据库中。所以实现这些功能的前提电脑中安装了scrapy,MySQL数据库,和一些爬虫的基本知识。代码我会详细介绍。如果有问题也可以给我留言。

    简介

    scrapy

    官方文档的介绍是“Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。”我现在对它了解还不是很多,知道它的功能很强大,但还只会做一些简单的爬取。

    MySQL数据库

    MySQL是一种开放源代码的关系型数据库管理系统(RDBMS),MySQL数据库系统使用最常用的数据库管理语言–结构化查询语言(SQL)进行数据库管理。

    安装方法我在这里就赘述了,网上有很多方法。因为我安装scrapy的方法不是最简单的,所以我就不介绍我的方法了;至于MySQL,这个比较容易。安装好直接就可以使用了。

    功能实现

    scrapy部分

    我们的目的是抓取简书@IT·互联网专题,网址是:

    http://www.jianshu.com/c/V2CqjW

    这个网址的确可以抓取到内容,但只是极少部分,在浏览的过程中还会继续加载内容,所以这个网址是不对的。我们必须获取它的真实网址才行。这就用到了抓包。

    简书简书

    通过抓包我们获取到的真实网址是:

    http://www.jianshu.com/c/V2CqjW?order_by=commented_at&page=1

    应该已经注意到了,真正有用的是page,我们在抓取的时候只要改变页数就能实现多页抓取。

    按下win+R,输入cmd运行终端,输入scrapy startproject jianshu等待scrapy自动生成文件,在jianshu->jianshu->spiders文件夹下创建jianshuspider.py文件。

    jianshuspider.py代码部分:

    from scrapy.spider import Spider
    from jianshu.items import JianshuItem
    class JianshuSpider(Spider):
        name = 'jianshu'
        box = []
        for num in range(120):
            pages = 'http://www.jianshu.com/c/V2CqjW?order_by=commented_at&page={0}'.format(num)
            box.append(pages)
        start_urls = box
        def parse(self, response):
            item = JianshuItem()
            articles = response.xpath("//ul[@class='note-list']/li")
            for article in articles:
                item['author'] = article.xpath('.//div[@class="name"]/a/text()').extract()[0]
                item['title'] = article.xpath('.//div[@class="content"]/a/text()').extract()[0]
                item['times'] = article.xpath('.//div[@class="name"]/span/@data-shared-at').extract()[0]
                url = article.xpath('.//div[@class="content"]/a/@href').extract()[0]
                item['url'] = 'http://www.jianshu.com' + url
                admire = article.xpath('.//div/div[2]/span[2]/text()').extract()
                item['admire'] = ''.join(admire)
                likes = article.xpath('.//div/div[2]/span[1]/text()').extract()
                item['likes'] = ''.join(likes)
                yield item
    

    我来介绍一下这段代码。

    name是以后运行爬虫的名字,start_urls是爬取的网站,是一个列表,因为我们要抓取很多页,所以我定义了一个空列表用来存放不同页数的网址。parse部分可以说就是用来把爬取到的内容传递给item。我们抓取了简书文章的作者、文章标题、创建的时间、文章的网址、赞赏和喜欢。

    在筛选信息的过程中用到了xpath,其实只要多看看别人的代码,自己研究研究,很好理解的。jianshuspider.py这部分代码筛选出需要的结果后,我们就开始写items.py。

    items.py代码部分:

    import scrapy
    class JianshuItem(scrapy.Item):
        title = scrapy.Field()
        author = scrapy.Field()
        times = scrapy.Field()
        url = scrapy.Field()
        admire = scrapy.Field()
        likes = scrapy.Field()
    

    这部分代码就是对应的要抓取的内容。很好理解。正常情况下,在jianshu的文件夹下运行命令提示符,输入scrapy crawl jianshu
    就可以看到运行结果了。因为我们要保存到数据库,所以还得继续完成代码。

    MySQL部分

    这部分用到了数据库的知识,安装好数据库以后,在数据库的终端登录以后,输入CREATE DATABASE jianshu;,然后输入USE jianshu;,在使用jianshu数据库后,所有的操作就都在这个数据库里了。在结束命令的时候一定要记得输入“;”分号。然后就是创建新表。输入:

    CREATE TABLE articles (id BIGINT(5) NOT NULL AUTO_INCREMENT, title VARCHAR(100), author VARCHAR(100), times VARCHAR(100), url VARCHAR(100), admire VARCHAR(1000), likes VARCHAR(1000))
    

    这样就创建好了表,如果输入无误的话输入DESCRIBE articles;就可以查看表的数据结构了。如图:

    表结构表结构

    scrapy保存到数据库

    创建好新表,我们就可以写pipelines.py的代码了。

    pipelines.py代码部分:

    import pymysql
    def dbHandle():
        conn = pymysql.connect(
            host = "localhost",
            user = "root",
            passwd = "root",
            charset = "utf8",
            use_unicode = False
        )
        return conn
    class JianshuPipline(object):
        def process_item(self,item,spider):
            dbObject = dbHandle()
            cursor = dbObject.cursor()
            cursor.execute("USE jianshu")
            sql = "INSERT INTO articals(author,title,times,url,admire,likes) VALUES(%s,%s,%s,%s,%s,%s)"
            try:
                cursor.execute(sql,(item['author'],item['title'],item['times'],item['url'],item['admire'],item['like']))
                cursor.connection.commit()
            except BaseException as e:
                print("错误在这里>>>>>>>>>>>>>",e,"<<<<<<<<<<<<<错误在这里")
                dbObject.rollback()
            return item
    

    代码分为两部分,第一部分用来连接数据库,第二部分用来用来向数据库传入数据。

    如果这段代码不是太明白可以先看这部分代码,Python操作数据库的代码:

    #导入pymysql模块
    import pymysql
    #连接数据库
    conn = pymysql.connect(host='127.0.0.1', user='root', passwd='root', db='music')
    cur = conn.cursor()
    #输入使用数据库和查询信息的命令,操作类似在cmd中的输入
    cur.execute("USE music")
    #插入数据(pages是数据库music下的表)
    cur.execute("INSERT INTO pages(title,content) VALUES('449454051','http://m2.music.126.net/GvSlxgdwVCKelv3gFaw9pg==/18641120138988064.mp3')")
    cur.connection.commit()
    #更新数据
    cur.execute("SELECT * FROM pages")
    print("获取全部信息\n",cur.fetchall())
    #关闭数据库
    cur.close()
    conn.close()
    

    先导入pymysql库,然后定义函数,用来存放数据库信息。下边的JianshuPipline在创建文件时自动生成。我们只要添加往数据库导入信息的代码就可以了。

    我们还需要改一改settings.py中的代码,把下边的代码添加和修改一下就行了。

    settings.py代码:

    ROBOTSTXT_OBEY = False #True 修改为 False
    
    #添加请求头
    DEFAULT_REQUEST_HEADERS = {
    'accept': 'image/webp,*/*;q=0.8',
    'accept-language': 'zh-CN,zh;q=0.8',
    'referer': 'https://www.jianshu.com/',
    'user-agent': 'Mozilla/5.0 (Windows NT 6.3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.63 Safari/537.36',
    }
    
    #连接数据库
    ITEM_PIPELINES = {
    'jianshu.pipelines.JianshuPipline': 300,
    }
    

    这样就算大功告成了。查看数据库,如图:

    数据结果数据结果

    总结

    在迷迷糊糊看完上边的教程之后我们总结一下。

    scrapy组件的作用

    Item 对象是种简单的容器,保存了爬取到得数据。其提供了类似于词典(dictionary-like)的API以及用于声明可用字段的简单语法。

    Spider 类定义了如何爬取某个(或某些)网站。包括了爬取的动作(例如:是否跟进链接)以及如何从网页的内容中提取结构化数据(爬取 item)。换句话说,Spider 就是您定义爬取的动作及分析某个网页(或者是有些网页)的地方。

    当 Item 在 Spider 中被收集之后,它将会被传递到 Item Pipeline,一些组件会按照一定的顺序执行对 Item 的处理。

    详情查看官方文档:http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/install.html

    数据库

    在创建数据库和新表的过程中一定要仔细,避免错输和漏输,在出现问题的时候一定要认真阅读提示的错误信息。如果字太小的话可以这么设置。我电脑的操作系统是Win10。如图:

    cmdcmd

    把字体调的大一点看起来就轻松许多。数据库命令如果不是很懂可以自行查阅资料,因为我也在学习中,先不介绍了太多。

    与本文相关的链接

    1.http://scrapy-chs.readthedocs.io/zh_CN/1.0/intro/install.html
    2.https://www.mysql.com/
    3.http://www.jianshu.com/c/V2CqjW
    4.格外感谢这篇教程,受此启发:Scrapy入门教程之写入数据库

    如果在操作过程中遇到问题欢迎留言,也可查看:https://alpha87.github.io/

    相关文章

      网友评论

      • adec4ef2b94b:写的很好,逻辑很清晰。但是我想问一下如果我要获取文章内容的话,xpath应该怎么写呢。因为有的内容直接在<p>下有的<p>下还有别的标签。
      • EruDev:楼主,数据能出来,但是插入不到数据库,错误是这样的
        1241, 'Operand should contain 1 column(s)'
        百度 谷歌了 半天 也不知道 怎么改 - -
      • 小小佐:写xpath的时候//前面为什么都要有个点(.)
        简讯Alfred:@小小佐 .代表articles那部分路径
      • 春日部少年:谢谢po主!!用了python3+scrapy1.0的版本后对pipeline设置一直不成功,现在终于可以了!!这篇讲得好清楚!
        简讯Alfred:@春日部少年 感谢阅读:blush:
      • 划船的浆不浪:怎么抓包拿到url
        简讯Alfred:@拾三度 浏览器单击右键审查元素或者检查,右边有一个network 选项,就是从那里找信息
      • w森林狼w:弱弱的问一句:结尾那张“数据结果” 用的是mysql的什么可视框?
        简讯Alfred:@w森林狼w 官方下载的还有一个 MySQL Notifier,点击这个试一下
        w森林狼w:我的也是官网下载的,可是只有黑乎乎的视窗,没有后面那种窗口。
        简讯Alfred:我使用的是官网的软件,网址:https://dev.mysql.com/downloads/mysql/
      • 罗罗攀:多关注我们专栏哦

      本文标题:利用scrapy爬取简书文章并保存到数据库

      本文链接:https://www.haomeiwen.com/subject/fodaittx.html