使用Scrapy网络爬虫框架小试牛刀

Karen110
• 阅读 1562

前言

这次咱们来玩一个在Python中很牛叉的爬虫框架——Scrapy。

scrapy 介绍

标准介绍

  • Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架,非常出名,非常强悍。所谓的框架就是一个已经被集成了各种功能(高性能异步下载,队列,分布式,解析,持久化等)的具有很强通用性的项目模板。对于框架的学习,重点是要学习其框架的特性、各个功能的用法即可。

说人话就是

  • 只要是搞爬虫的,用这个就van事了,因为里面集成了一些很棒的工具,并且爬取性能很高,预留有很多钩子方便扩展,实在是居家爬虫的不二之选。

windows下安装scrapy

命令

pip install scrapy

默认情况下,直接pip install scrapy可能会失败,如果没有换源,加上临时源安装试试,这里使用的是清华源,常见安装问题可以参考这个文章:Windows下安装Scrapy方法及常见安装问题总结——Scrapy安装教程

命令

pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple

scrapy创建爬虫项目


命令

scrapy startproject <项目名称>

示例:创建一个糗事百科的爬虫项目(记得cd到一个干净的目录哈)

scrapy startproject qiushibaike

使用Scrapy网络爬虫框架小试牛刀

:此时,我们已经创建好了一个爬虫项目,但是爬虫项目是一个文件夹

使用Scrapy网络爬虫框架小试牛刀

进入爬虫项目

如果想要进入这个项目,就要cd进这个目录,如上上图所示,先cd <项目>,再创建蜘蛛

使用Scrapy网络爬虫框架小试牛刀

项目目录结构解析


此时,我们就已经进入了项目,结构如下,有一个和项目名同名的文件夹和一个scrapy.cfg文件

scrapy.cfg # scrapy配置,特殊情况使用此配置
qiushibaike # 项目名同名的文件夹
    items.py # 数据存储模板,定制要保存的字段
    middlewares.py # 爬虫中间件
    pipelines.py # 编写数据持久化代码
    settings.py # 配置文件,例如:控制爬取速度,多大并发量,等
    __init__.py
    spiders # 爬虫目录,一个个爬虫文件,编写数据解析代码
        __init__.py

呃,可能此时你并不能懂这么些目录什么意思,不过不要慌,使用一下可能就懂了,别慌。

创建蜘蛛

通过上述的操作,假设你已经成功的安装好了scrapy,并且进入了创建的项目

那么,我们就创建一个蜘蛛,对糗事百科段子进行爬取。

使用Scrapy网络爬虫框架小试牛刀

创建蜘蛛命令

scrapy genspider <蜘蛛名称> <网页的起始url>

示例:创建糗事百科的段子蜘蛛

scrapy genspider duanzi ww.com

使用Scrapy网络爬虫框架小试牛刀

:网页的起始url可以随便写,可以随便改,但是必须有

此时在spider文件夹下,会多一个duanzi.py文件

使用Scrapy网络爬虫框架小试牛刀

代码解释如下

使用Scrapy网络爬虫框架小试牛刀

使用Scrapy网络爬虫框架小试牛刀

爬取数据前准备


创建好蜘蛛之后,需要在配置一些东西的,不能直接就爬的,默认是爬取不了的,需要简单配置一下

打开settings.py文件,找到ROBOTSTXT_OBEYUSER_AGENT变量

ROBOTSTXT_OBEY配置

等于False不遵守robot协议,默认只有搜索引擎网站才会允许爬取,例如百度,必应等,个人爬取需要忽略这个,否则爬取不了

使用Scrapy网络爬虫框架小试牛刀

USER_AGENT配置

User-Agent是一个最基本的请求必须带的参数,如果这个带的不是正常的,必定爬取不了。

User-Agent

Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36

使用Scrapy网络爬虫框架小试牛刀

小试牛刀之获取糗事百科段子段子链接


准备工作做好了,那就开始吧!!!

此处我们需要有xpath的语法基础,其实挺简单的,没有基础的记得百度一下,其实不百度也没关系,跟着学,大概能看懂

实现功能

通过xpath获取每个段子下的a标签连接

注: 审查元素和按住crtl+f搜索内容和写xpath这里不再啰嗦

分析页面规则

使用Scrapy网络爬虫框架小试牛刀

通过审查工具,我们可以看到,class包含article的标签就是一个个的文章,可能你想到xpath可能可以这样写

xpath代码

//div[@class='article']

但是你会发现一个都查不出来,因为是包含的关系,所以需要用contains关键字

使用Scrapy网络爬虫框架小试牛刀

我们需要这样写

xpath代码

//div[contains(@class,"article")]

使用Scrapy网络爬虫框架小试牛刀

但是会发现,这定位的太多了,并不是每个段子的div,所以我们要多包含几个,这样,就是每个段子的div

//div[contains(@class,"article") and contains(@class,"block")]

使用Scrapy网络爬虫框架小试牛刀

上述已经成功定位了一个个的段子,下面在此基础上,定位到每个段子下的a标签

根据审查元素,发现每个段子下class="contentHerf"a标签,就是每个段子的详情页

使用Scrapy网络爬虫框架小试牛刀

详情页,要定位的a标签的href确实是详情页的url

使用Scrapy网络爬虫框架小试牛刀

xpath代码

//div[contains(@class,"article") and contains(@class,"block")]//a[@class="contentHerf"]

使用Scrapy网络爬虫框架小试牛刀

这样,我们就定位了一个个a标签,只至少在控制台操作是没问题的,那么,我们使用Python代码操作一下吧

使用Scrapy网络爬虫框架小试牛刀

代码


def parse(self, response):
    a_href_list = response.xpath('//div[contains(@class,"article") and contains(@class,"block")]//a[@class="contentHerf"]/@href'
    ).extract()
    print(a_href_list)

启动蜘蛛命令

scrapy crawl <爬虫名> [--nolog]

注:--nolog参数不加表示一系列日志,一般用于调试,加此参数表示只输入print内容

示例:启动段子命令

scrapy crawl duanzi --nolog

使用Scrapy网络爬虫框架小试牛刀

成功拿到每一个链接。

获取详情页内容

在上述,我们成功的获取到了每个段子的链接,但是会发现有的段子是不全的,需要进入进入详情页才能看到所以段子内容,那我们就使用爬虫来操作一下吧。

我们定义一下标题内容。

使用Scrapy网络爬虫框架小试牛刀

根据元素审查,标题的定位xpath是:

//h1[@class="article-title"]

使用Scrapy网络爬虫框架小试牛刀

内容的xpath是:

//div[@class="content"]

使用Scrapy网络爬虫框架小试牛刀

确定标题和内容的xpath定位之后,我们在python代码中实现一下。

注:但是先解决一个问题,详情页属于第二次调用了,所以我们也需要进行调用第二次,再编写代码

使用Scrapy网络爬虫框架小试牛刀

代码


# 详情页
def detail(self, response):
    title = response.xpath('//h1[@class="article-title"]/text()').extract()
    content = response.xpath('//div[@class="content"]//text()').extract()
    print("标题:" )
    print(title)
    print("内容")
    print(content)

def parse(self, response):
    a_href_list = response.xpath(
        '//div[contains(@class,"article") and contains(@class,"block")]//a[@class="contentHerf"]/@href'
    ).extract()
    print(a_href_list)
    base_url = "https://www.qiushibaike.com"
    for a_href in a_href_list:
        url = f"{base_url}{a_href}"
        yield scrapy.Request(url=url, callback=self.detail)

结果

使用Scrapy网络爬虫框架小试牛刀

但是会发现啊,似乎每个都是列表形式,这似乎不太行呐,我们稍微修改一下代码,这样我们拿到的就是正常的文本了,如下图所示:

使用Scrapy网络爬虫框架小试牛刀

上述命令总结

创建爬虫项目

scrapy startproject <项目名称>

创建蜘蛛

scrapy genspider <蜘蛛名称> <网页的起始url>

启动爬虫,--nolog参数不加表示一系列日志,一般用于调试,加此参数表示只输入print内容

scrapy crawl <爬虫名> [--nolog]

结尾


经过入门级的操作,我相信你大概知道scrapy是怎么玩了。但是你依然可能懵逼,不懂本质,不过先走起来,才是根本,后续慢慢听我继续。

下篇正在赶飞机,如果你觉得写的还不错,记得点赞留言哈,感谢你的观看,么么哒。

用微笑告诉别人,今天的我比昨天强,今后也一样。

如果你觉得文章还可以,记得点赞留言支持我们哈。感谢你的阅读,有问题请记得在下方留言噢~

想学习更多关于Python的知识,可以参考学习网址:http://pdcfighting.com/,点击阅读原文,可以直达噢~

**-----**------**-----**---**** End **-----**--------**-----**-****

往期精彩文章推荐:

使用Scrapy网络爬虫框架小试牛刀

欢迎各位大佬点击链接加入群聊【helloworld开发者社区】:https://jq.qq.com/?_wv=1027&k=mBlk6nzX进群交流IT技术热点。

本文转自 https://mp.weixin.qq.com/s/eClixDQzLKmckHPNG66WVw,如有侵权,请联系删除。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
Java爬虫之JSoup使用教程
title:Java爬虫之JSoup使用教程date:201812248:00:000800update:201812248:00:000800author:mecover:https://imgblog.csdnimg.cn/20181224144920712(https://www.oschin
Stella981 Stella981
3年前
Scrapy框架
\TOC\1\.Scrapy介绍1.1.Scrapy框架Scrapy是用纯Python实现一个为了爬取网站数据、提取结构性数据而编写的应用框架,用途非常广泛。!(http://ccszt.com.cn/python/%E7%88%AC%E8%99%AB/file/images/
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这