当前位置: 首页 > 科技观察

使用Scrapy网络爬虫框架试试菜刀

时间:2023-03-13 11:42:12 科技观察

前言这次来玩玩Python中非常牛逼的爬虫框架——Scrapy。Scrapy介绍标准介绍Scrapy是一个为爬取网站数据和提取结构化数据而编写的应用程序框架。它非常有名和强大。所谓框架,就是已经集成了各种功能(高性能异步下载、队列、分发、分析、持久化等)的高度通用的项目模板。对于框架的学习,重点是学习框架的特点和各个功能的使用方法。也就是说,只要你是搞爬虫的,都可以用这个,因为里面集成了一些很棒的工具,爬虫性能非常高。预留多个挂钩,方便扩展。真的是居家爬虫的最佳选择。选择。windows下安装scrapy命令pipinstallscrapy。默认直接pipinstallscrapy可能会失败。如果您不更改源,请尝试添加临时源安装。这里使用的是清华源。常见安装问题可以参考这篇文章:Windows下安装Scrapy方法及常见安装问题总结-Scrapy安装教程。命令pipinstallscrapy-ihttps://pypi.tuna.tsinghua.edu.cn/simplescrapy创建爬虫项目命令scrapystartproject<项目名称>示例:为囧事百科创建爬虫项目(记得cd到干净的目录下)scrapystartprojectqiushibaike注:这个时候,我们已经创建了一个爬虫项目,但是爬虫项目是进入爬虫项目的文件夹。如果要进入这个项目,必须cd到这个目录下。如上图,先cd,然后创建spider项目目录结构分析此时,我们进入了项目,结构如下,有一个与项目名称同名的文件夹以及一个scrapy.cfg文件scrapy.cfg#scrapy配置,特殊情况下使用该配置qiushibaike#Projectnamewithsamenamefolderitems.py#datastoragetemplate,自定义要保存的字段middlewares.py#Crawlermiddlewarepipelines。py#写数据持久化代码settings.py#配置文件,比如:控制爬取速度,多少并发等__init__.pyspiders#Crawler目录,爬虫文件一个一个,写数据分析代码__init__.py嗯,也许你这个时候不明白这些目录是什么意思,但是不要慌张,用过之后你可能就明白了,不要慌张。创建蜘蛛通过上面的操作,假设你已经成功安装了scrapy并进入了创建的项目,那么我们就创建一个蜘蛛来爬取维基百科中的段子。创建蜘蛛命令scrapygenspider<蜘蛛名称><网页起始url>示例:创建笑话蜘蛛scrapygenspiderduanziww.com注意:网页起始url可以随意写改,但必须在蜘蛛中此时文件夹下多了一个duanzi.py文件代码解释如下。在爬取数据之前,准备创建蜘蛛之后,需要配置一些东西。你不能直接抓取。默认是不能抓取。只需要简单配置,打开settings.py文件,找到ROBOTSTXT_OBEY和USER_AGENT变量ROBOTSTXT_OBEY配置等于False不符合机器人协议,默认只有搜索引擎站点会允许抓取,比如百度,必应等。个人爬取需要忽略这个,否则USER_AGENT配置的User-Agent是爬取不到的,是最基本的请求必须带的参数。如果这个参数不正常,一定不能爬取。User-AgentMozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/78.0.3904.108Safari/537.36获取尴尬百科笑话和链接的小测试准备就绪,开始吧!!!这里要有xpath的语法基础,其实很简单。没有基础的记得百度。:Reviewelements按住crtl+f搜索内容,这里写xpath,不再赘述页面规则通过review工具,我们可以看到包含article的class标签是一篇一篇文章,也许你认为xpath可能会这样写代码//div[@class='article']但是你会发现一个都查不出来,因为是包含关系,所以需要用到contains关键字。我们需要这样写xpath代码//div[contains(@class,"article")]但是你会发现这样定位太多了,不是每个段落的div,所以我们需要多包含几个,所以就是每个段落的div//div[contains(@class,"article")andcontains(@class,"block")]上面已经成功定位了每个段落,在此基础上定位到每个段落下面的a标签段落。根据review元素发现每个段落都有class="contentHerf"的a标签就是每个段落的详情页,要定位的a标签的href确实是详情页的urlxpath代码//div[contains(@class,"article")andcontains(@class,"block")]//a[@class="contentHerf"]这样我们就把a标签一个一个定位好了,至少它在console上操作是没有问题的,那么,我们用Python代码来操作代码defparse(self,response):a_href_list=response.xpath('//div[contains(@class,"article")andcontains(@class,"block")]//a[@class="contentHerf"]/@href').extract()print(a_href_list)启动爬虫命令scrapycrawl<爬虫名称>[--nolog]注意:如果不加--nolog参数,表示一系列日志,一般用于调试。添加这个参数就是只输入打印内容我拿到了每个段子的链接,但是发现有些段子不完整,需要进入详情页才能看到段子的内容,所以我们用爬虫来操作它。让我们定义标题和内容。根据元素审核,标题的xpath为://h1[@class="article-title"]内容的xpath为://div[@class="content"]确定xpath定位后标题和内容,我们在用python代码实现。注意:但是先解决一个问题,详情页属于二次调用,所以我们也需要调用第二次,然后写代码code#详情页defdetail(self,response):title=response.xpath('//h1[@class="article-title"]/text()').extract()content=response.xpath('//div[@class="content"]//text()').extract()print("title:")print(title)print("content")print(content)defparse(self,response):a_href_list=response.xpath('//div[contains(@class,"article")andcontains(@class,"block")]//a[@class="contentHerf"]/@href').extract()print(a_href_list)base_url="https://www.qiushibaike.com"fora_hrefina_href_list:url=f"{base_url}{a_href}"yieldscrapy.Request(url=url,callback=self.detail)结果但是你会发现每一个好像都是列表的形式,好像不行.我们稍微修改一下代码,这样我们得到的就是普通的文本,如下图:上面的命令总结创建一个爬虫项目scrapystartproject创建一个蜘蛛scrapygenspider启动爬虫,不带--nolog参数表示一系列日志,一般用于调试,加这个参数表示只输入打印内容scrapycrawl<爬虫名称>[--nolog]入门级操作后最后,相信你大概知道scrapy是如何工作的。但是你可能还是一头雾水,不明白本质,但是先开始才是根本,然后听我继续讲下去。微笑着告诉别人,今天的我比昨天好,以后也一样。