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

时间:2022-03-23 23:53:14

是时候给你说说

爬虫框架了

使用框架来爬取数据

会节省我们更多时间

很快就能抓取到我们想要抓取的内容

框架集合了许多操作

比如请求,数据解析,存储等等

都可以由框架完成

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

有些小伙伴就要问了

你他妈的

为什么不早点说呢?

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

是这样的

当你不知道 1+1 是什么的时候

你去使用计算器来计算

也是没用的

对吧

所以框架的使用

在现在这个时候(爬虫28篇之后)讲

就是一个不错的时机

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

今天

小帅b就跟你说说

scrapy这个框架

到底有多牛b

那么

接下来就是

学习 python 的正确姿势

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

要使用 scrapy

首先当然你得需要有啊

你可以使用 conda 安装

conda install -c conda-forge scrapy

你也可以使用 PyPI 安装

pip install Scrapy

scrapy依赖一些相关的库

lxmlparselw3libtwistedcryptography and pyOpenSSL

如果你在使用 scrapy 的时候发现相关库缺失

把裤子穿上就是了

哦不是

把你缺失的库安装上就完事了

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

好了

现在假设你已经安装好了 scrapy 这个框架

那么接下来

小帅b会带你使用它来爬取一下 糗事百科 的段子

主要让你知道 scrapy 的使用以及体验它的牛逼之处

废话不多说

在你想要存放的爬虫文件目录下

使用命令来创建一个 scrapy 爬虫项目

比如在这里

我们要创建一个 qiushibaike 的爬虫项目

就可以这样

 scrapy startproject qiushibaike

这时候你就会发现

scrapy帮你自动生成了项目文件

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

在这里面有一些配置文件和预定义的设置文件

而我们的爬虫代码

可以在 spiders 目录下创建

在这里我们就创建一个 qiushibaike_spider 吧

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

要使用 scrapy 爬虫

我们就需要继承  scrapy.Spider 这个类

这样我们才能使用它定义的一些方法

class QiushiSpider(scrapy.Spider):

接着我们要定义一个爬虫的名称

这里定义一个唯一的名称

用来标识糗事的爬虫

在项目中不能和别的爬虫名称一样

等会会用到这个名称

  name = "qiushibaike"

接着我们就可以来定义我们的请求了

比如我们要爬糗事百科的段子的第一和第二页

所以我们可以这样定义请求链接

    def start_requests(self):        urls = [            'https://www.qiushibaike.com/text/page/1/',            'https://www.qiushibaike.com/text/page/2/',        ]        for url in urls:            yield scrapy.Request(url=url, callback=self.parse)

我们在这个方法 start_requests 需要返回一个 yield 生成的迭代

而其中的参数 callback=self.parse 就是要让它去回调我们的数据解析方法

回调方法是这样的

    def parse(self, response):        page = response.url.split("/")[-2]        filename = 'qiushi-%s.html' % page        with open(filename, 'wb') as f:            f.write(response.body)        self.log('Saved file %s' % filename)

主要是把我们抓取下来的 html 存入到本地文件

我们来使用 scrapy 运行一下这个爬虫

使用如下命令即可

 cd qiushibaike/ scrapy crawl qiushibaike

scrapy crawl qiushibaike 中的 qiushibaike 就是我们刚刚定义的名称

不过这个时候运行后你会发现报错了

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

这是因为你懂得

糗事做了反爬

我们定义一个 header 吧

 haders = {        'User-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'    }
def start_requests(self): urls = [ 'https://www.qiushibaike.com/text/page/12/', 'https://www.qiushibaike.com/text/page/2/', ] for url in urls: yield scrapy.Request(url=url, callback=self.parse, headers=self.haders)

再次运行命令

scrapy crawl qiushibaike

这次可以发现

源代码被我们爬取下来了

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

是不是很方便咧

接下来我们再来解析关键数据

比如我们只需要段子的作者和段子的内容

scrapy 也内置了 css、xpath 选择器的解析了

而且

scrapy 还内置了很多好用的命令

我们可以使用 scrapy shell 来请求我们的网页

scrapy shell /home/wistbean/PycharmProjects/spider/qiushibaike/qiushi-1.html

shell 后面可以是你爬下来的 HTML 文件

也可以是你一个链接

进去之后是这样的

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

我们可以在这里面做一些命令操作了

比如我们在这里坐一下解析操作

打开我们刚刚要爬的糗事百科的链接

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

可以看到

每个段子都被包含在一个 id 为 content-left 的 div 里面

我们使用如下命令获取

>>> content_left_div = response.xpath('//*[@id="content-left"]')

接着我们获取它下面的所有 div

>>> content_list_div = content_left_div.xpath('./div')

我们试着获取这个页面的所有作者名称和内容

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

作者名称位于 a 标签下的 h2

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

内容位于div下的span

我们还是一样

通过 xpath 获取

我们先来获取一个条目看看

content_div = content_list_div[0]

获取作者名称

>>> author = content_div.xpath('./div/a[2]/h2/text()').get()>>> print(author)
街角*

获取段子内容

>>> content = content_div.xpath('./a/div/span/text()').getall()>>> print(content)['\n\n\n刚上小学一年级时,一次肚子有点不舒服拉肚子,跑到厕所后运动裤上面的绳子竟然打了死结,在厕所里面如无头苍蝇一样乱转。', '这时看到老师在旁边上蹲坑,也不顾难为情了'此时老师蹲在蹲坑躲闪不及,浑身上下星星点点,屎喷了满脸如同长满麻子般!', '又是开心的一天,没有拉裤子!\n\n']>>> 

这样

我们就通过命令行的方式可以知道如何获取我们想要的数据了

回到代码来

我们把 parse 方法改成这样

 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: yield { 'author': content_div.xpath('./div/a[2]/h2/text()').get(), 'content': content_div.xpath('./a/div/span/text()').getall(), }

然后再使用命令行运行

scrapy crawl qiushibaike

可以看到我们要的信息被打印出来了

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

那么

要将爬下来的数据存储为 json 文件怎么办呢

一个命令就搞定了

scrapy crawl qiushibaike -o qiushibaike.json

运行之后你会看到你的项目下多了一个 json 文件

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

不过中文乱码了

在 settings.py 中加一句

FEED_EXPORT_ENCODING = 'utf-8'

我们在运行一下

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

中文回来了

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

什么?

你想实现翻页抓取所有内容?

还想保存到数据库里?

好吧

篇幅有限

今天就到这里

且听帅b下回讲解

peace

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

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

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

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

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

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

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

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

  4. 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据

    初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...

  5. Python爬虫实战三之爬取嗅事百科段子

    一.前言 俗话说,上班时间是公司的,下班了时间才是自己的.搞点事情,写个爬虫程序,每天定期爬取点段子,看着自己爬的段子,也是一种乐趣. 二.Python爬取嗅事百科段子 1.确定爬取的目标网页 首先我 ...

  6. scrapy 爬取糗事百科

    安装scrapy conda install scrapy 创建scrapy项目 scrapy startproject qiubai 启动pycharm,发现新增加了qiubai这个目录 在spid ...

  7. python+正则提取+ip代理爬取糗事百科文字信息

    很多网站都有反爬措施,最常见的就是封ip,请求次数过多服务器会拒绝连接,如图: 在程序中设置一个代理ip,可有效的解决这种问题,代码如下: # 需要的库 import requests import ...

  8. 爬虫--使用scrapy爬取糗事百科并在txt文件中持久化存储

    工程目录结构 spiders下的first源码 # -*- coding: utf- -*- import scrapy from firstBlood.items import Firstblood ...

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

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

随机推荐

  1. C++笔记(1)explicit构造函数

    按照默认规定,只有一个参数的构造函数也定义了一个隐式转换,将该构造函数对应数据类型的数据转换为该类对象,如下面所示: class String { String ( const char* p );  ...

  2. Android 软引用

    2013-08-13 13:56 佚名 eoe Android开发者社区 字号:T | T   可能对于Android开发者来说,软引用这个词有的会不是很熟悉,软引用在Java开发中用的比较多,但是, ...

  3. Python漫谈-比较运算符和类的神奇方法

    昨天遇到一个Python问题,今天好奇试了一下 >>> a = {1:23,'ab':56} >>> b = {2:22,'ab':57} >>> ...

  4. 提升网站用户体验—WebP 图片的高效使用

    一.WebP 的由来 现代图像压缩技术对我们的生活方式影响很大.数码相机能将上千张高质量图片存储到一张内存卡里.智能手机可以与邻近设备快速分享高分辨率的图片.网站与手机等移动设备能快速展示各种富媒体. ...

  5. HDU 3555 Bomb(数位DP)

    Bomb Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) Total Subm ...

  6. 提升Boolean和out相结合的用户体验

    在我们编写代码的过程中经常有这样的需求,比如添加一条数据,我们想要的结果是如果添加成功了就返回true,如果添加失败了就返回false,在返回false的同时携带错误信息,我们通常的做法是定义这样的方 ...

  7. re2c实例

    #include <stdio.h> #include "demo_def.h" #define T_BEGIN 0 #define T_NUMBER 1 #defin ...

  8. 【】小技巧】CSS文字两端对齐

    需求如下,红框所在的文字有四个字的.三个字的.两个字的,如果不两端对齐可以选择居中对齐,或者右对齐.但是如果要像下面这样两端对齐呢? 我相信以前很多人都这么干过:两个字中间使用 来隔开达到四个字的宽度 ...

  9. Ionic APP-Web SPA开发进阶&lpar;一&rpar;AngularJS全栈工程狮进阶

    AngularJS全栈工程狮进阶 前言 学习了一段时间AngularJS,开始接触移动端APP开发.为了响应公司开发需求,采用"Hybrid"混血开发方法.采用Ionic前端框架, ...

  10. 前端工程化基础-vue

    由浅入深支持更多功能 1.安装最新版本的node.js和NPM,并了解NPM基本用法. 2.创建一个目录demo.使用npm 初始化配置: npm init  ,执行后会有一系列选项,可按回车快速确认 ...