龙空技术网

Python数据分析之Scrapy第一练:十分钟编写一个Scrapy爬虫

职教之光 276

前言:

此刻大家对“pythonscrapy参数”大致比较重视,姐妹们都需要了解一些“pythonscrapy参数”的相关文章。那么小编在网络上汇集了一些对于“pythonscrapy参数””的相关文章,希望各位老铁们能喜欢,你们快快来了解一下吧!

背景

在前面的几篇关于爬虫的文章中,我们对基础的Requests、lxml两个库做了简要介绍,但是重所周知,Scrapy才是爬虫界的扛把子,想要爬取企业外部数据,肯定是无法逃避的。

Scrapy

为了方便小伙伴们根据自己的业务需求选择适用的爬虫工具,我对目前常用的几种做了对比,如下表所示:

常用爬虫工具对比

另外,有需要的伙伴可以简单回顾下之前的两篇文章,链接如下:

Python数据分析之爬虫第四练:如何避免爬取到重复的数据?Python数据分析之爬虫第六练:五分钟掌握XPath使用窍门

需要注意的是,头条有个不太友好的地方,通过链接进行访问的页面会存在代码块没有换行的问题,最好还是通过个人主页查找相应的文章浏览。

现在网上很多资料可能伙伴们看起来都觉得从开始到放弃只要3秒钟的节奏,但其实真正的操练下,也还是有一套快速了解和上手的路径的,以下enjoy~~~

Scrapy简介

Scrapy是一个为了爬取网站信息,提取结构性数据而编写的应用框架。Scrapy用途广泛,可用于数据挖掘、监测和自动化测试等。Scrapy是全世界爬虫专家的秘密。他们知道如何使用它以节省工作时间,提供出色的性能,并且使他们的主机费用达到最低限度。

Scrapy的工作原理如下图所示:

Scrapy工作原理

Python数据分析之Scrapy第一练:十分钟亲手编写一个Scrapy爬虫

原创2022-05-11 19:36·职教之光

背景

在前面的几篇关于爬虫的文章中,我们对基础的Requests、lxml两个库做了简要介绍,但是重所周知,Scrapy才是爬虫界的扛把子,想要爬取企业外部数据,肯定是无法逃避的。

Scrapy

为了方便小伙伴们根据自己的业务需求选择适用的爬虫工具,我对目前常用的几种做了对比,如下表所示:

常用爬虫工具对比

另外,有需要的伙伴可以简单回顾下之前的两篇文章,链接如下:

Python数据分析之爬虫第四练:如何避免爬取到重复的数据?Python数据分析之爬虫第六练:五分钟掌握XPath使用窍门

需要注意的是,头条有个不太友好的地方,通过链接进行访问的页面会存在代码块没有换行的问题,最好还是通过个人主页查找相应的文章浏览。

现在网上很多资料可能伙伴们看起来都觉得从开始到放弃只要3秒钟的节奏,但其实真正的操练下,也还是有一套快速了解和上手的路径的,以下enjoy~~~

Scrapy简介

Scrapy是一个为了爬取网站信息,提取结构性数据而编写的应用框架。Scrapy用途广泛,可用于数据挖掘、监测和自动化测试等。Scrapy是全世界爬虫专家的秘密。他们知道如何使用它以节省工作时间,提供出色的性能,并且使他们的主机费用达到最低限度。

Scrapy的工作原理如下图所示:

Scrapy工作原理

第1步:爬虫使用URL构造一个请求,提交给引擎。如要伪装成浏览器,或者设置代理IP,先在爬虫中间件中设置,再发送给引擎。

第2步:引擎将请求提交给调度器,调度器根据请求的优先级确定执行顺序。

第3步:引擎从调度器获取即将要执行的请求。

第4步:引擎通过下载器中间件,将请求发送给下载器下载页面。

第5步:页面完成下载后,下载器会生成一个响应对象并将其发送给引擎。下载后的数据会保存于响应对象中。

第6步:引擎接收来自下载器的响应对象后,通过爬虫中间件,将其发送给爬虫进行处理。

第7步:爬虫将抽取到的一条数据实体和新的请求发送给引擎。

第8步:引擎将从爬虫获取到的实体发送给项目管道,项目管道实现数据持久化等功能。同时将新的请求发送给调度器,再从第2步开始重复执行,直到调度器中没有更多的请求,引擎关闭该网站。

一个简单的爬虫

1 需求分析

假设我们现在需要爬取起点中文网畅销排行榜的数据,数据内容包括:小说名称、作者、小说类型和连载状态。

目标页面

大家可以先回顾下,我们在lxml那篇文章中讲过的网页XPath信息复制获取的便捷途径,如上图所示。

我们也可以通过下面的代码和页面数据对比进行验证。

# 导入爬虫和正则工具包import requests as reqimport refrom lxml import etree# UA代表访问网站的浏览器是哪种浏览器,可以通过在地址栏中输入“about:version”获取# “\”是行连接符,headers = {'User-Agent':          'Mozilla/5.0 (Windows NT 10.0; Win64; x64) \           AppleWebkit/537.36 (KHTML, like Gecko) \           Chrome/100.0.4896.127 Safari/537.36'}  qidianurl = ';  # 目标网址:起点中文网qidianpage = req.get(qidianurl, headers=headers).textqidianhtml = etree.HTML(qidianpage)  # 解析获取到的html文件  bookname1 = qidianhtml.xpath('//*[@id="book-img-text"]/ul/li[1]/div[2]/h2/a/text()')  # 小说名称bookauthor1 = qidianhtml.xpath('//*[@id="book-img-text"]/ul/li[1]/div[2]/p[1]/a[1]/text()')  # 作者booktype1 = qidianhtml.xpath('//*[@id="book-img-text"]/ul/li[1]/div[2]/p[1]/a[2]/text()')  # 类型bookstatus1 = qidianhtml.xpath('//*[@id="book-img-text"]/ul/li[1]/div[2]/p[1]/span/text()')  # 连载状态print('The book name is:%s。\n' % bookname1)print('The book author is:%s。\n' % bookauthor1)print('The book type is:%s。\n' % booktype1)print('The book status is:%s。\n' % bookstatus1)

2 创建Scrapy项目

在创建项目之前,肯定是先要安装Scrapy库,安装方法与其它的库一致,也是通过pip install scrapy实现,只不过需要注意的是在Jupyter环境中需要在前面加个!,以表示执行的是shell命令。

!pip install scrapy 

安装完成后,就可以创建爬虫项目,Jupyter中的创建方式如下:

!scrapy startproject SHLQidianSpider

其中,最后面的“SHLQidianSpider”是我的爬虫项目名称,大家可以根据自己的需要修改。创建成功后,会出现下面的信息:

Scrapy项目创建成功信息

需要注意的是最后的提示内容,后续步骤需要在爬虫项目的根目录下执行,而不是Jupyter的当前目录,否则会出现报错。如果适用的是CMD命令行,直接cd到对应目录即可,下图是一个简单的示例,大家根据自己的实际路径进行修改。

CMD进入爬虫项目根目录

3 编码爬虫代码

创建完项目之后,在项目的根目录下执行生成爬虫的命令,如下所示:

scrapy genspider SHL_qidian_hot_spider_20220511 example.com

这可以在"

/Work/SHLQidianSpider/SHLQidianSpider/spiders "目录(一定要注意位置)中创建一个python脚本,我已经命名为“

SHL_qidian_hot_spider_20220511.py”,并且内容已经修改为如下的内容:

#-*-coding:utf-8-*-from scrapy import Requestfrom scrapy.spiders import Spiderclass HotSalesSpider(Spider):    #定义爬虫名称    name = 'hot'    #起始的URL列表:起点畅销榜前2页    start_urls = [";,                 ";]         #解析函数    def parse(self, response):        #使用xpath定位到小说内容的div元素        list_selector = response.xpath("//div[@class='book-mid-info']")        #依次读取每部小说的元素,从中获取名称、作者、类型和形式        for one_selector in list_selector:            #获取小说名称            name = one_selector.xpath("h2/a/text()").extract()[0]            #获取作者            author = one_selector.xpath("p[1]/a[1]/text()").extract()[0]            #获取类型            type = one_selector.xpath("p[1]/a[2]/text()").extract()[0]            #获取形式(连载/完本)            form = one_selector.xpath("p[1]/span/text()").extract()[0]            #将爬取到的一部小说保存到字典中            hot_dict = {                "name":name,   # 小说名称                "author":author,  # 作者                "type":type,      # 类型                "form":form  # 形式                }                  #使用yield返回字典            yield hot_dict

在我的Jupyter中的路径如下图,大家根据自己的实际部署情况自行修改即可。

脚本创建目录位置

当然,我们也可以直接在上述目录下直接创建python脚本,不需要通过genspider命令生成。

4 运行爬虫

在爬虫项目的根目录下运行爬虫脚本,运行结果如下图所示:

运行结果

同时,在我们爬虫脚本中设定的输出文件中,也生成了对应的文件。

生成的数据文件

5 迭代优化

最后就是大家根据自己的实际需求进行代码迭代优化了,如在此中遇到问题,可在评论区留言反馈,我们一起交流。

一起练习吧

最后,依旧是一起练习环节,希望小伙伴们能够分享一个自己的实操案例,GO GO GO~~~

Python DA

标签: #pythonscrapy参数