上回我们说到

python爬虫29 | 使用scrapy爬取糗事百科的例子,告诉你它有多厉害!

WOW!!

scrapy

awesome!!

怎么会有这么牛逼的框架

wow!!

awesome!!

用 scrapy 来爬取数据

岂!不!是!非!常!爽!

wow!!

接下来就是我独享的moment

哦不

接下来就是

学习 python 的正确姿势

我们已经创建了爬取糗事百科的项目

并且把糗事百科的前两页的作者和段子爬取到 json 文件了

这次

我们将我们要爬取所有的数据

使用 scrapy 存储到 mangodb 中

在此之前还是先介绍一下我们使用 scrapy 创建出来的文件目录

各个文件代表的都是啥意思

免得又有些 b 友当场懵逼

我们从上往下依个介绍一下

这个 spiders 目录呢

就是用来存放我们写爬虫文件的地方

items.py

就是用来定义我们要存储数据的字段

middlewares.py

就是中间件,在这里面可以做一些在爬虫过程中想干的事情,比如爬虫在响应的时候你可以做一些操作

pipelines.py

这是我们用来定义一些存储信息的文件,比如我们要连接 MySQL或者 MongoDB 就可以在这里定义

settings.py

这个文件用来定义我们的各种配置,比如配置请求头信息等

以上就是 scrapy 生成的目录中主要文件的作用

ok

接下来我们就进入代码中

我们上次创建了 QiushiSpider 来写我们的爬虫

当时我们只是获取了前两页的数据

我们要获取所有页面的数据怎么玩呢

打开糗事百科的链接可以看到

13 页的数据

其实按照以前我们直接写个 for 循环就可以了

不过我们这次还可以使用 scrapy 的 follow 函数

具体使用是这样的

我们先获取下一页的链接

由于下一页这个按钮都是在最后一个 li 标签中的

所以用 xpath 获取就这样

next_page = response.xpath('//*[@id="content-left"]/ul/li[last()]/a').attrib['href']

接着我们就可以让它去请求下一页的内容数据了

  if next_page is not None:      yield response.follow(next_page, callback=self.parse)

你也可以用 urljoin 的方式

# if next_page is not None:      # next_page = response.urljoin(next_page)      # yield scrapy.Request(next_page, callback=self.parse)

这样我们就可以获取到所有页面的数据了

接下来我们要把所有的数据保存到数据库

首先我们在 items.py 中定义一下我们要存储的字段

import scrapy

class QiushibaikeItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() author = scrapy.Field() content = scrapy.Field()    _id = scrapy.Field()

接着我们在 parse 方法中将获取到的数据赋值给 item

具体来说就是这样

    def parse(self, response):
content_left_div = response.xpath('//*[@id="content-left"]') content_list_div = content_left_div.xpath('./div')
for content_div in content_list_div: item = QiushibaikeItem() item['author'] = content_div.xpath('./div/a[2]/h2/text()').get() item['content'] = content_div.xpath('./a/div/span/text()').getall() item['_id'] = content_div.attrib['id'] yield item
next_page = response.xpath('//*[@id="content-left"]/ul/li[last()]/a').attrib['href']
if next_page is not None: yield response.follow(next_page, callback=self.parse)

第 7 行就是获取我们刚刚定义的 item 的类

8-10 行就是相应的赋值

那么我们定义好了要存储的字段以及写好了数据爬取

接下来还有一步

就是定义好我们要存储的数据库

到 pipelines.py 中

class QiushibaikePipeline(object):
def __init__(self): self.connection = pymongo.MongoClient('localhost', 27017) self.db = self.connection.scrapy self.collection = self.db.qiushibaike
def process_item(self, item, spider): if not self.connection or not item: return self.collection.save(item)
def __del__(self): if self.connection: self.connection.close()

在这里我们连接到本地的 MongoDB

建立了 scrapy 数据库及以下的 qiushibaike

接下来还要在 settings.py 文件中配置下

# See https://doc.scrapy.org/en/latest/topics/item-pipeline.htmlITEM_PIPELINES = {   'qiushibaike.pipelines.QiushibaikePipeline': 300,}

这样才可以使用到pipelines

当然我们还可以在 settings.py 里面做更多的设置

比如设置请求头

# Crawl responsibly by identifying yourself (and your website) on the user-agentUSER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/73.0.3683.86 Chrome/73.0.3683.86 Safari/537.36'

ok

搞定了之后

我们使用命令来抓取一下

scrapy crawl qiushibaike

运行之后

我们打开 MongoDB 看看

可以看到

所有的数据就被我爬取到 MongoDB 了

ok

以上就是 scrapy 的简单又牛逼的操作

更多 scrapy 的牛逼操作可以前往 https://doc.scrapy.org 了解

这两篇所涉及的源代码已经上传

可以在公众号后台发送  scrapy 获取

那么

我们下回见

peace

对了

有个事

你希望接下来这个公众号能有更多什么教程

例如

爬虫实战?

ubuntu?

vim?

...?

请扫下方的码评论告诉我一下

python爬虫30 | scrapy后续,把「糗事百科」的段子爬下来然后存到数据库中的更多相关文章

  1. python_爬虫一之爬取糗事百科上的段子

    目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面  requests官方教程 使用 ...

  2. Python 爬虫系列:糗事百科最热段子

    1.获取糗事百科url http://www.qiushibaike.com/hot/page/2/    末尾2指第2页 2.分析页面,找到段子部分的位置, 需要一点CSS和HTML的知识 3.编写 ...

  3. python爬虫学习(4) —— 手刃「URP教务系统」

    0. 本爬虫目标 模拟登陆URP教务系统 查询 本学期/历年 成绩 计算历年成绩的绩点 下面是一点废「私」话「货」: 一般情况,查询成绩大家会通过如下方式: 登陆信息门户 -> 转到教学空间 - ...

  4. scrapy基本的流程 糗事百科

    https://www.cnblogs.com/c-x-a/p/9889623.html 创建scrapy工程 1.scrapy startproject xxx xxx就是你的项目名,这里我们给我们 ...

  5. python爬虫之爬取糗事百科并将爬取内容保存至Excel中

    本篇博文为使用python爬虫爬取糗事百科content并将爬取内容存入excel中保存·. 实验环境:Windows10   代码编辑工具:pycharm 使用selenium(自动化测试工具)+p ...

  6. Python爬虫--抓取糗事百科段子

    今天使用python爬虫实现了自动抓取糗事百科的段子,因为糗事百科不需要登录,抓取比较简单.程序每按一次回车输出一条段子,代码参考了 http://cuiqingcai.com/990.html 但该 ...

  7. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  8. 8.Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  9. [Python]网络爬虫(八):糗事百科的网络爬虫(v0.2)源码及解析

    转自:http://blog.csdn.net/pleasecallmewhy/article/details/8932310 项目内容: 用Python写的糗事百科的网络爬虫. 使用方法: 新建一个 ...

随机推荐

  1. [Codeforces 666B] World Tour

    [题目链接] https://codeforces.com/contest/666/problem/B [算法] 首先 , 用BFS求出任意两点的最短路径 然后 , 我们用f[i][0-2]表示从i出 ...

  2. linux下的C语言开发(定时器)

    定时器是我们需要经常处理的一种资源.那Linux下面的定时器又是怎么一回事呢?其实,在linux里面有一种进程中信息传递的方法,那就是信号.这里的定时器就相当于系统每隔一段时间给进程发一个定时信号,我 ...

  3. 698C

    Description n个视频,长度为k的缓存,每次询问,每个视频以pi的概率被选,如果不在缓存区则加入,如果缓存区满了,则最先进缓存的出来,问10^100次操作以后每个视频在缓存的概率 Input ...

  4. js中setInterval() 和 setTimeout()

    setInterval() 方法 定义和用法 setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式. setInterval() 方法会不停地调用函数,直到 clearI ...

  5. Linux 系统管理命令 - lsof - 查看进程打开的文件

    命令详解 重要星级: ★★★★★ 功能说明: 全名为 list open files,也就是列举系统中已经被打开的文件,通过 lsof 命令,就可以根据文件找到对应的进程信息,也可以根据进程信息找到进 ...

  6. DTO和ENTITY的关系

    DTO是数据传输对象:主要用于封装前台页面传过来的数据,在各个层之间进行数据的传递,主要用于接受前台数据进行封装并向各个层之间传递数据(个人理解是向下层传递数据),定义方法跟Bean规范一致 ENTI ...

  7. bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛【状压dp】

    设f[i][j]为奶牛选取状态为i,最后一头选的为j,转移直接f[k][(1<<(k-1)|i]+=f[j][i] #include<iostream> #include< ...

  8. bzoj 1650: [Usaco2006 Dec]River Hopscotch 跳石子【贪心+二分】

    脑子一抽写了个堆,发现不对才想起来最值用二分 然后判断的时候贪心的把不合mid的区间打通,看打通次数是否小于等于m即可 #include<iostream> #include<cst ...

  9. BZOJ4543/BZOJ3522 [POI2014]Hotel加强版(长链剖分)

    题目好神仙--这个叫长链剖分的玩意儿更神仙-- 考虑dp,设\(f[i][j]\)表示以\(i\)为根的子树中到\(i\)的距离为\(j\)的点的个数,\(g[i][j]\)表示\(i\)的子树中有\ ...

  10. [App Store Connect帮助]四、添加 App 图标、App 预览和屏幕快照(4)为其他设备尺寸和本地化内容添加屏幕快照和预览

    如果您不想在其他设备尺寸上使用经过缩放的高分辨率屏幕快照或 App 预览,您可以使用“媒体管理”为其他设备尺寸和本地化内容添加自定屏幕快照. 屏幕快照和 App 预览仅在 App 状态为可编辑时才能进 ...