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

这篇文章主要是介绍利用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。如图:

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

与本文相关的链接

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/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容