Python网络爬虫项目式教程 课件 项目6、7 使用Scrapy爬虫爬取图片网站、使用分布式爬虫爬取腾讯招聘频道_第1页
Python网络爬虫项目式教程 课件 项目6、7 使用Scrapy爬虫爬取图片网站、使用分布式爬虫爬取腾讯招聘频道_第2页
Python网络爬虫项目式教程 课件 项目6、7 使用Scrapy爬虫爬取图片网站、使用分布式爬虫爬取腾讯招聘频道_第3页
Python网络爬虫项目式教程 课件 项目6、7 使用Scrapy爬虫爬取图片网站、使用分布式爬虫爬取腾讯招聘频道_第4页
Python网络爬虫项目式教程 课件 项目6、7 使用Scrapy爬虫爬取图片网站、使用分布式爬虫爬取腾讯招聘频道_第5页
已阅读5页,还剩245页未读, 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

项目六使用Scrapy爬虫爬取站长站的图片频道

项目要

求本项目是使用Scrapy爬虫框架,实现对网站数据进行爬取,爬取以后对爬取到的数据进行持久化存储。

项目分

析要完成项目任务,需要掌握Scrapy框架的安装和Scrapy的使用。

项目目

标【知识目标】熟悉Scrapy开发环境的安装、Scrapy的使用。【能力目标】会使用Scrapy框架进行网络数据的爬取,并将爬取的数据进行持久化存储。【素质目标】提高学生的发现问题、分析问题、解决问题的能力。

知识导

图任务一Scrapy开发环境搭建--任务演示

任务是完成Scrapy开发环境进行搭建,为Scrapy爬虫开发做好环境准备通过【Win+R】的快捷键可以快速打开Windows系统的“运行”窗口,然后输入“cmd”命令后回车,进入到cmd命令行,然后输入“scrapy”命令后回车。任务一Scrapy开发环境搭建–知识准备Scrapy框架概述常见爬虫框架介绍1.常见爬虫框架介绍1.常见爬虫框架介绍爬虫框架是为解决爬虫问题而设计的具有一定约束性的支撑结构。在此结构上,可以根据具体问题扩展、安插更多的组成部分,从而更快速和方便地构建完整地解决问题的方案。Python常见的爬虫框架如下。Scrapy框架:Scrapy框架是一套比较成熟的Python爬虫框架,是使用Python开发的快速、高级的信息爬取框架,可以快速爬取指定页面并能提取到结构化的数据。Pyspider框架:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。1.常见爬虫框架介绍1.常见爬虫框架介绍爬虫框架是为解决爬虫问题而设计的具有一定约束性的支撑结构。在此结构上,可以根据具体问题扩展、安插更多的组成部分,从而更快速和方便地构建完整地解决问题的方案。Python常见的爬虫框架如下。Scrapy框架:Scrapy框架是一套比较成熟的Python爬虫框架,是使用Python开发的快速、高级的信息爬取框架,可以快速爬取指定页面并能提取到结构化的数据。Pyspider框架:一个国人编写的强大的网络爬虫系统并带有强大的WebUI。采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。1.常见爬虫框架介绍Crawley框架:Crawley也是Python开发出的、基于非阻塞通信(NIO)的Python爬虫框架。它能高速爬取对应网站的内容,支持关系型和非关系型数据库如MongoDB、Postgre、Mysql、Oracle、Sqlite等,支持输出Json、XML和CSV等各种格式。Portia框架:Portia是scrapyhub开源的一款可视化的爬虫规则编写工具,提供可视化的Web页面,用户只需要通过点击标注页面上需要抽取的数据,不需要任何编程知识即可完成规则的开发(但是动态网页需要自己编写JS解析器)。使用Python语言开发的爬虫框架有很多,但是实现方式和原理大同小异,我们只需要深入掌握一种框架,对别的框架做简单了解即可。1.

Scrapy框架概述2.Scrapy框架概述Scrapy框架

Scrapy是用Python实现的一个为了爬取网站数据,提取结构性数据而编写的应用框架。该框架主要由ScrapyEngine(引擎大脑)、Scheduler(调度器)、Downloader(下载器)等部分组成,如图所示。ScrapyEngine(引擎大脑):负责Spider、ItemPipeline、Downloader、Scheduler中间的通讯、信号、数据传递等,它负责发号施令。Scheduler(调度器):它负责接受引擎发送过来的Request请求,并按照一定的方式进行整理排列、入队,作一些必要的去重处理等,当引擎需要时,交还给引擎。2.Scrapy框架概述各模块执行过程如下:(1)引擎打开一个网站,找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。(2)引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。(3)引擎向调度器请求下一个要爬取的URL。(4)调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。(5)一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。(6)引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。(7)Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。引擎将(Spider返回的)爬取到的Item给ItemPipeline,将(Spider返回的)Request给调度器。(8)(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。2.Scrapy框架概述各模块执行过程如下:(1)引擎打开一个网站,找到处理该网站的Spider并向该spider请求第一个要爬取的URL(s)。(2)引擎从Spider中获取到第一个要爬取的URL并在调度器(Scheduler)以Request调度。(3)引擎向调度器请求下一个要爬取的URL。(4)调度器返回下一个要爬取的URL给引擎,引擎将URL通过下载中间件(请求(request)方向)转发给下载器(Downloader)。(5)一旦页面下载完毕,下载器生成一个该页面的Response,并将其通过下载中间件(返回(response)方向)发送给引擎。(6)引擎从下载器中接收到Response并通过Spider中间件(输入方向)发送给Spider处理。(7)Spider处理Response并返回爬取到的Item及(跟进的)新的Request给引擎。引擎将(Spider返回的)爬取到的Item给ItemPipeline,将(Spider返回的)Request给调度器。(8)(从第二步)重复直到调度器中没有更多地request,引擎关闭该网站。2.Scrapy框架概述任务一Scrapy开发环境搭建--任务实施1.在Windows10的中安装Scrapy

众所周知,Scrapy是一个高级的python爬虫框架,功能极其强大,拥有它就可以快速编写出一个爬虫项目,拥有它就可以搭建分布式架构。那么,请问这么强大的框架要怎么拥有?这就需要来安装Scrapy。首先在Windows资源管理器中的地址栏中输入%homepath%然后回车即可进入当前用户的家目录,如图所示。任务一Scrapy开发环境搭建--任务实施接下来在Windows当前用户家的目录下,创建一个pip文件夹,然后创建一个pip.ini文件,修改文件内容为如下:[global]index-url=/pypi/simple/[install]trusted-host=注意:记得一定是pip.ini,如果没有开后缀的同学,记得把文件后缀打开,再修改文件的后缀为ini即可。可以使用如下命令,对pip进行一下升级。python-mpipinstall--upgradepip任务一Scrapy开发环境搭建--任务实施下面安装scrapy框架,主要有以下6个步骤。这里都是在Windows的CMD命令上进行全局安装。(1)wheel的安装安装wheel可以通过以下命令进行,如图所示。

pipinstallwheel任务一Scrapy开发环境搭建--任务实施(2)1xml的下载及安装首先打开网址“/~gohlke/pythonlibs/#lxml”,然后在打开网页以后,按下键盘的“CTRL+F”,在弹出的输入框中输入“lxml”,然后回车,如图所示。任务一Scrapy开发环境搭建--任务实施(2)1xml的下载及安装lxml的安装主要分为以下几个步骤进行:1)这里下载的文件保存在“D:\soft\scrapy”目录中,如图所示。任务一Scrapy开发环境搭建--任务实施(2)1xml的下载及安装2)按下键盘的“Win+R”组合键,在弹出的窗口中输入“cmd”,进入CMD命令行窗口,如图所示。任务一Scrapy开发环境搭建--任务实施3)在命令行窗口中输入“cdD:\soft\scrapy”,进入到lxml的保存目录,如图所示。任务一Scrapy开发环境搭建--任务实施4)输入命令“pipinstalllxml-4.5.2-cp37-cp37m-win_amd64.whl”然后回车,进行安装,如图所示。任务一Scrapy开发环境搭建--任务实施5)安装以后,使用“piplist”查看是否进行了成功安装,如图所示。任务一Scrapy开发环境搭建--任务实施(3)PyOpenss1的下载及安装首先打开“/project/pyOpenSSL/#files”网址,选择.whl文件进行下载,如图所示。任务一Scrapy开发环境搭建--任务实施其安装就比较简单了,主要有以下两个步骤:1)在命令行窗口中输入“cdD:\soft\scrapy”,进入到pyOpenSSl的保存目录,任务一Scrapy开发环境搭建--任务实施2)输入命令“pipinstallpyOpenSSL-19.1.0-py2.py3-none-any.whl”然后回车,进行安装,如图所示。任务一Scrapy开发环境搭建--任务实施3)检查是否成功安装,使用命令“piplist”,如图。任务一Scrapy开发环境搭建--任务实施(4)Twisted的下载及安装首先打开“/~gohlke/pythonlibs/#twisted“网址,选择.whl文件进行下载,然后在弹出的对话框中输入“Twisted”如图所示。任务一Scrapy开发环境搭建--任务实施其安装就比较简单了,主要有以下两个步骤:1)在命令行窗口中输入“cdD:\soft\scrapy”,进入到Twisted的保存目录,如图所示。任务一Scrapy开发环境搭建--任务实施2)输入命令“pipinstallTwisted-20.3.0-cp37-cp37m-win_amd64.whl”然后回车,进行安装,如图所示。任务一Scrapy开发环境搭建--任务实施3)检查Twistedl是否安装成功,使用命令“piplist”,如图。任务一Scrapy开发环境搭建--任务实施(5)Pywin32的下载及安装首先打开“/~gohlke/pythonlibs/#pywin32“网址,选择.whl文件进行下载,然后在弹出的对话框中输入“Pywin32”如图所示。任务一Scrapy开发环境搭建--任务实施注意:Pywin32的安装文件也可以通过网址下面的这个地址进行下载:/project/pywin32/#files其安装主要有以下两个步骤:1)在命令行窗口中输入“cdD:\soft\scrapy”,进入到Pywin32的保存目录,如图所示。

任务一Scrapy开发环境搭建--任务实施2)输入命令“pipinstallpywin32-228-cp37-cp37m-win_amd64.whl”然后回车,进行安装,如图所示。任务一Scrapy开发环境搭建--任务实施3)检查Pywin32是否安装成功,使用命令“piplist”,如图所示。任务一Scrapy开发环境搭建--任务实施(6)Scrapy的安装只有确保安装了wheel、lxml、PyOpenss1、Twisted、Pywin32成功安装后,才能安装Scrapy。安装scrapy可以使用如下命令进行,如图所示。pipinstallscrapy任务一Scrapy开发环境搭建--任务实施检查Scrapy是否安装成功,使用命令“piplist”,如图所示。任务一Scrapy开发环境搭建--任务实施5)安装以后,使用“piplist”查看是否进行了成功安装,如图所示。任务一Scrapy开发环境搭建--任务拓展有了开发环境以后,我们可以着手使用Scrapy创建爬虫项目了,这里首先演示如何在Windows下创建一个简单的爬虫工程。这里对百度官网的title信息进行爬取,爬取的地址为“/”。首先创建Scrapy项目,在CMD下切换到“D:\spiler”的目录,本项目以“baiduDemo”为项目名称,创建项目命令如下:scrapystartprojectbaiduDemo执行命令以后,出现如下对话框,如图所示。任务一Scrapy开发环境搭建--任务拓展创建项目后,可以在“D:\spiler”文件家内,找到名为为“baiduDemo”的文件夹,切换到“baiduDemo”的文件夹内,执行执行如下命令,如图所示。scrapygenspiderbaidu任务一Scrapy开发环境搭建--任务拓展这样,我们就创建了一个名字叫“baidu”的爬虫项目了,使用Pycharm软件打开“baiduDemo”文件夹,其目录结构如下图所示。任务一Scrapy开发环境搭建--任务拓展项目文件说明如下:.spiders(文件夹):编写爬虫规则,实现数据爬取和数据清晰处理。Items.py:数据定义和实例化,用于暂存清洗后的数据。middlewares.py:是中间间文件,使用代理IP、使用请求头、携带Cookie都可以在该文件下设置。pipelines.py:执行保存数据的操作,数据对象来源于items.py。setting.py:整个框架配置文件。scrapy.cfg:项目部署文件。这里按照一般步骤给出使用scrapy开发爬虫的步骤:(1)配置setting.py文件找到setting.py文件,发现该文件的大部分内容已经被注释掉,这里我们需要开启管道文件和请求头以及不要遵守爬虫协议,找到对应的位置,将注释取消掉。任务一Scrapy开发环境搭建--任务拓展01ROBOTSTXT_OBEY=False02#数据持久化存储要用到的函数03ITEM_PIPELINES={04'baiduDemo.pipelines.BaidudemoPipeline':300,05}06#设置请求头07DEFAULT_REQUEST_HEADERS={08'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',09'Accept-Language':'en',10}01行表示不要遵守爬虫协议;任务一Scrapy开发环境搭建--任务拓展(2)配置items.py文件在该文件中,要爬取一个内容,需要定义一个对象来对应,比如这里要爬取百度的网页标题title,那么代码可以写成如下。01classBaidudemoItem(scrapy.Item):02#definethefieldsforyouritemherelike:03#name=scrapy.Field()04title=scrapy.Field()05desc=scrapy.Field()06pass任务一Scrapy开发环境搭建--任务拓展(3)配置pipelines.py文件Scrapy已经生成类BaiduPipeline和相关说明。数据存储主要在类方法process_item()中执行,本项目以将数据存储到文本文件为例进行介绍,代码如下。01classBaidudemoPipeline:02defprocess_item(self,item,spider):03fp=None04defopen_spider(self,spider):#重写父类方法

05print("开始爬虫")06self.fp=open('./baidu.txt','w',encoding='utf-8')07defprocess_item(self,item,spider):08title=item['title']09desc=item['desc']10self.fp.write("标题"+":"+title+",描述:"+desc+'\n')11returnitem12defclose_spider(self,spider):13print("结束爬虫")14self.fp.close()#关闭文件流任务一Scrapy开发环境搭建--任务拓展(4)piders文件夹中的baidu.py文件中书写爬虫规则01importscrapy02fromscrapy.selectorimportSelector03frombaiduDemo.itemsimportBaidudemoItem04classBaiduSpider(scrapy.Spider):05name='baidu'06allowed_domains=['']07start_urls=['/']08defparse(self,response):09sel=Selector(response)10item=BaidudemoItem()11item['title']=sel.xpath('/html/head/title/text()')[0].extract()12item['desc']=sel.xpath('/html/head/meta')13#print(title)14#print(desc)15yielditem任务一Scrapy开发环境搭建--任务拓展(5)pipelines.py文件中书写保存数据的代码该文件是将获得的数据进行持久化存储的文件,这里,将爬取的数据保存到文本文件为例,对应的代码如下:01classBaidudemoPipeline:02fp=None03defopen_spider(self,spider):#重写父类方法04print("开始爬虫")05self.fp=open('./baidu.txt','w',encoding='utf-8')06defprocess_item(self,item,spider):07title=item['title']08desc=item['desc']09self.fp.write("标题"+":"+title+'\n')10returnitem11defclose_spider(self,spider):12print("结束爬虫")13self.fp.close()#关闭文件流任务一Scrapy开发环境搭建--任务拓展(6)配置启动文件start.py配置该文件的目的,是让pycham直接可以运行scrapy爬虫项目,直接运行start.py文件,就执行了整个爬虫项目,对应的代码如下:01fromscrapyimportcmdline02cmdline.execute(['scrapy','crawl','baidu'])01行表示从scrapy中导入cmdline;02行调回cmdline.execute()方法执行爬虫程序,这里’baidu’表示爬虫的名字。任务一Scrapy开发环境搭建--任务拓展运行该文件,结果如下图所示。任务二

Scrapy爬虫爬取代理ip--任务演示

任务是任务是使用Scrapy框架爬取ip3366网的代理IP,将爬取会来的IP进行持久化存储,方便后期爬虫项目使用代理IP,如图所示。任务二Scrapy爬虫爬取代理ip-—相关知识1.Scrapy选择器XPath在使用Scrapy爬取数据前需要了解Scrapy的选择器。Scrapy通过特定的XPath或CSS表达式来“选择”HTML文件中的某个部分。XPath是一门用来在XML文件中选择节点的语言,也可以用在HTML上。XPath的选择器构建于lxml库之上。(1)绝对定位绝对定位比较简单,其格式为:xxx.find._element_by_xpath(‘绝对路径)具体例子:xxx.find_element_by_xpath(“/html/body/div[x]/form/input”)(2)相对路径相对路径,以“//”开头,具体格式为xxx.find_element_by_xpath(“//标签”)任务二Scrapy爬虫爬取代理ip-—相关知识具体例子://定位第x个input标签,[x]可以省略,默认为第一个xxx.find_element_by_xpath(“//input[x]”)//相对路径的长度和开始位置并不受限制,也可以采取以下方法,[x]依然可以省略的。xxx.find_element_by_xpath(“//div[x]/form[x]/input[x](3)标签属性定位标签属性定位,相对比较简单,要求属性能够定位到唯一一个元素,如果存在多个相同条件的标签,默认只是第一个,具体格式为xxx.find_element_by_xpath(“//标签[@属性=’属性值’]”)任务二Scrapy爬虫爬取代理ip-—相关知识属性判断条件:最常见为id,name,class等等,目前属性的类别没有特殊限制,只要能够唯一标识一个元素都是可以的。具体例子:01xxx.find_element_by_xpath(“//a[@href=’/indrstryMall/hall/industryIndex.html”)02xxx.find_element_by_xpath("//input[@value='确定']")xxx.find_element_by_xpath("//div[@class='submit']/input")当某个属性不足以唯一区别某一个元素时,也可以采取多个条件组合的方式,具体例子如下。任务二Scrapy爬虫爬取代理ip-—相关知识xxx..find_element_by_xpath("//input[@type='name'and@name='kw1']")当标签属性很少,不足以唯一区别元素时,但是标签中间中间存在唯一的文本值,也可以定位,其具体格式如下。xxx.find_element_by_xpath("//标签[contains(text(),'文本值')]")具体例子如下。xxx.find_element_by_xpath("//iunpt[contains(text(),'型号:')]")其他的属性值如果太长,也可以采取模糊方法定位,实例如下。xxx.find_element_by_xpath(“//a[contains(@href,‘logout')]”)任务二Scrapy爬虫爬取代理ip-—相关知识2.CSS选择器CSS选择器也有语法,与xpath的区别是没有用路径形式。这里只介绍爬虫密切相关的选择器,下表列出了CSS经常使用的几个CSS选择器。选择器值说明.class.intro选择class=”intro”的所有元素#id#firstname选择id=”firstname”的所有元素elementp选择所有<p>元素element,elementdiv,p选择所有div元素和所有p元素element,elementdivp选择div元素内部的所有p元素[attribute][target]选择带有target属性的所有元素[attribute=value][target]=_blank]选择target=”_blank”的所有元素任务二Scrapy爬虫爬取代理ip—任务实施

回顾一下写一个爬虫需要做的一些步骤,使用requests库发送网络请求、使用lxml等解析技术对数据进行解析、使用数据库等方法进行存储数据,另外还可以在请求网络的时候进行更换IP、设置请求头等。

每次爬虫都要干这么多活,如果每次都从零开始写则比较浪费时间,所以我们需要一个框架,这个框架帮我们把一些基本的爬虫前奏都准备好了,我们只需要“站在巨人的肩膀上”即可。而Scrapy

框架就是这个“巨人的肩膀”。任务二Scrapy爬虫爬取代理ip—任务实施开发Scrapy爬虫一共需要4个步骤:创建项目(scrapystartprojectxxx):创建一个新的爬虫项目;明确目标(修改编写items.py文件):明确您要抓取的目标;制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页;存储内容(pipelines.py):设计管道存储爬取内容。为了练习Scrapy框架,我们准备对云代理网的IP代理进行爬取,下面给出详细的开发步骤。任务二Scrapy爬虫爬取代理ip—任务实施1.新建项目(1)在Pycharm中创建一名为spider02的目录,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施(2)在spider目录上右击,执行“Openinterminal”,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施(3)输入命令“scrapystartprojectip3366Spider”,然后回车,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施这里“scrapystartproject”跟的是项目的名字,我们这里项目名字是“ip3366Spider”。(4)执行结果如下图所示。任务二Scrapy爬虫爬取代理ip—任务实施2.创建爬虫要开发爬虫,得依照Scrapy框架的要求来,具体可以按照以下的的步骤来:(1)进入到对话框中的提示,准备进入“p3366Spider”目录,使用命令“cdip3366Spidert”进入,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施(2)在spiders目录下,创建爬虫项目。创建爬虫项目,应该使用如下命令:scrappygenspider爬虫名字网站域名例如:scrapygenspiderip3366,在终端输入此命令,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施注意:爬虫名字不能和项目名字取成一样,网站域名是允许爬虫采集的域名。Scrapy自动生成了一个名为ip3366.py的文件,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施(3)名为ip3366.py的文件修改其内容找到ip3366.py文件,在该文档中找到如下代码:01importscrapy02classXicidailiSpider(scrapy.Spider):03name='ip3366i'04allowed_domains=[‘www.']05start_urls=['/']06defparse(self,response):07pass任务二Scrapy爬虫爬取代理ip—任务实施重写上面定义的parse()函数,代码如下。

01defparse(self,response):02#提取IP和port03selectors=response.xpath('//tr')#选择所有的tr标签04#循环遍历tr标签下的td标签05forselectorinselectors:06ip=selector.xpath('./td[1]/text()').get()#在当前节点下继续选择ip07port=selector.xpath('./td[2]/text()').get()#在当前节点下选择端口08print(ip)09print(port)任务二Scrapy爬虫爬取代理ip—任务实施(4)找到配置文件settings.py文件,并进行修改,如图6-37所示。找到settings.py文件,在该文件中找到如下代码:ROBOTSTXT_OBEY=True将该代码修改为为如下:ROBOTSTXT_OBEY=False

ROBOTSTXT_OBEY是表示Scrapy是否要遵守爬虫协议,ROBOTSTXT_OBEY=True表示Scrapy的爬虫模式式遵守robots.txt协议的,有很多站点的网站设置了robots.txt协议的,对其中相当一部分内容式禁止爬取的,如果准守此协议的,很多内容爬虫是不会爬取的,为了开发测试方便,我们此时可以先将ROBOTSTXT_OBEY=False,表示暂时不遵守robots.txt协议。任务二Scrapy爬虫爬取代理ip—任务实施为了说明要关闭ROBOTSTXT_OBEY参数的重要性,下面新创建一个名为baidu的爬虫进行说明。具体步骤如下。(1)在Python-project工程中,创建一个目录scrapy,并使用命令“scrapystartprojectprojectbaidu”创建一个爬虫工程,如图所示。

任务二Scrapy爬虫爬取代理ip—任务实施(2)确保在爬虫工程的spiders目录下创建爬虫,执行图的步骤任务二Scrapy爬虫爬取代理ip—任务实施(3)使用命令“scrapygenspiderbaidu”创建爬虫,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施(4)修改配置文件,找到settings.py文件,在“ROBOTSTXT_OBEY=True”增加如下面所示的代码。

01ROBOTSTXT_OBEY=True02LOG_LEVEL='ERROR'03DEFAULT_REQUEST_HEADERS={04'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',05'Accept-Language':'en',06'User-Agent':"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36",07}任务二Scrapy爬虫爬取代理ip—任务实施(5)找到爬虫文件baidu.py,添加以下内容。

01defparse(self,response):02print("response的输出为:")03print(response)04pass任务二Scrapy爬虫爬取代理ip—任务实施

到此,可以运行爬虫程序了,使用命令“scrapycrawlbaidu”,注意输入后敲回车键,观察有无结果输出。此时运行的结果如图所示。任务二Scrapy爬虫爬取代理ip—任务实施此时遵循了百度的robots.txt协议,不能进行数据的爬取,故此时这里的爬虫是没有任何结果输出的。修改配置文件,找到settings.py文件,将命令“ROBOTSTXT_OBEY=True”修改为“ROBOTSTXT_OBEY=False”后,保存该文件。 继续运行程序,此时的结果如图所示:任务二Scrapy爬虫爬取代理ip—任务实施默认请求头问题,找到工程中的settings.py文件中的默认请求头,内容如图。任务二Scrapy爬虫爬取代理ip—任务实施将其注释取消掉,然后添加请求头,代码如下:#Overridethedefaultrequestheaders:01DEFAULT_REQUEST_HEADERS={02'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',03'Accept-Language':'en',04'User-Agent':"Mozilla/5.0(WindowsNT10.0;WOW64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/63.0.3239.132Safari/537.36",05}任务二Scrapy爬虫爬取代理ip—任务实施(6)运行爬虫运行爬虫的方法,可以在命令行键入如下命令:scrapycrawl爬虫名字在终端中首先进入爬虫的目录中,如图所示。我们这里的爬虫的名字是“ip3366”,所以这里命令是“scrapycrawlip3366”,在终端中输入此命令,并回车,如图所示。任务二Scrapy爬虫爬取代理ip—任务实施运行结果为所示。任务二Scrapy爬虫爬取代理ip—任务实施此时打印输出的数据比较多,此时可以使用—nolog,此时的命令是:scrapycrawlip3366–nolog,回车后结果为下图。任务二Scrapy爬虫爬取代理ip—任务实施如果这样设置,此时的响应内容如果出了故障,那么此时我们会看不到任何提示信息,此时我们可以在配置文件可以作如下设置,只输出错误信息,找到settging.py的文件,找到“ROBOTSTXT_OBEY=False”,在该语句下面书写如下信息。01#显示指定类型的日志信息02LOG_LEVEL='ERROR'任务二Scrapy爬虫爬取代理ip—任务拓展上面任务中,我们只是实现了一个页面IP数据的爬取,实际上IP3366.net网站提供的代理IP是分成了很多页面进行呈现的,那么如何问题来了,如何进行分页爬取呢?分页爬取的思想比较简单,就是使用for来逐页爬取。for循环到底什么时候结束呢?这里可以获取当前页中分页部分的下一页是否为空,如果不为空,就可以继续爬取下一个页面的信息,否则,退出整个for循环。根据上面思想,书写如下代码:任务二Scrapy爬虫爬取代理ip—任务拓展01defparse(self,response):02#提取IP和port03selectors=response.xpath('//tr')#选择所有的tr标签04#循环遍历tr标签下的td标签05forselectorinselectors:06ip=selector.xpath('./td[1]/text()').get()#在当前节点下继续选择ip07port=selector.xpath('./td[2]/text()').get()#在当前节点下选择端口08print(ip)09print(port)10#翻页操作11next_page=response.xpath('//*[@id="listnav"]/ul/a[contains(text(),"下一页")]/@href').get()12ifnext_page:13next_page=response.urljoin(next_page)14#print(next_page)15#发出请求16print('***********************')17yieldscrapy.Request(next_page,callback=self.parse)任务三

Scrapy数据的持久化存储-任务演示

本任务将Python网路爬虫爬取回来的数据使用文本存储,使用关系型数据MySQL进行存储,使用非关系型数据库Redis进行存储,从而实现了数据的持久化存储,如图所示。任务三

Scrapy数据的持久化存储-知识准备基于管道的数据存储基于终端命令存储任务三

Scrapy数据的持久化存储-知识准备Scrapy数据的持久化存储主要有基于终端指令和基于管道存储的两种方法。终端指令的持久化存储,只可以将parse方法的返回值存储到磁盘文件。基于管道的数据持久化存储的所有操作都必须写入到管道文件的管道类中,可以写入到本地文件或MySQL等数据库中。1.基于终端命令存储说明:只可以将parse()的返回值存储到本地的文件中,而且存储的文本文件的类型只能为:'json','jsonlines','jl','csv','xml','marshal','pickle'指令:终端输入命令,scrapycrawlxxx-ofilePath优缺点:简洁便携高效,但局限性比较强任务三

Scrapy数据的持久化存储-知识准备01defparse(self,response):#获取响应数据,解析数据02all_ip_list=[]03selectors=response.xpath("//tr")#选择所有的tr标签04#循环遍历tr标签下的td标签05forselectorinselectors:06dict1={}#定义一个空字典07ip=selector.xpath('./td[1]/text()').extract_first()#在当前节点下继续选择ip08port=selector.xpath('./td[2]/text()').extract_first()#在当前节点下选择端口09http=selector.xpath('./td[4]/text()').extract_first()10ifip!=None:11dict1[http]=ip+":"+port12ifnotbool(dict1):13#print("Dictionaryisempty")14pass15else:16all_ip_list.append(dict1)#字典添加到列表中17print(all_ip_list)18returnall_ip_list任务三

Scrapy数据的持久化存储-知识准备2.基于管道的数据存储(1)对数据进行解析ip3366.py文件(爬虫文件)内容如下:01importscrapy#导包02classIp3366Spider(scrapy.Spider):#Ip3366Spider类继承父类Spider03#定义三个属性04name='ip3366'#爬虫名05allowed_domains=['']#爬虫的允许的域名,哪些域名可以爬取,通常被注释掉06start_urls=['/']#起始的url列表,该列表中的所有url会被Scrapy自动发送请求07defparse(self,response):#获取响应数据,解析数据08selectors=response.xpath("//tr")#选择所有的tr标签任务三

Scrapy数据的持久化存储-知识准备2.基于管道的数据存储(1)对数据进行解析09#循环遍历tr标签下的td标签10forselectorinselectors:11dict1={}#定义一个空字典12ip=selector.xpath('./td[1]/text()').extract_first()#在当前节点下选择ip13port=selector.xpath('./td[2]/text()').extract_first()#在当前节点下选择端口14http=selector.xpath('./td[4]/text()').extract_first()15ifip!=None:16dict1[http]=ip+":"+port17ifnotbool(dict1):18pass19else:20pass任务三

Scrapy数据的持久化存储-知识准备(2)在item类中定义相关的属性items.py文件的内容如下:01importscrapy02classIp3366SpiderItem(scrapy.Item):03#definethefieldsforyouritemherelike:04#name=scrapy.Field()05ip=scrapy.Field()#实例化对象属性06port=scrapy.Field()07http=scrapy.Field()08pass任务三

Scrapy数据的持久化存储-知识准备(3)将解析的数据封装存储到item类型的对象01item=Ip3366SpiderItem()02item['ip']=ip03item['port']=port04item['http']=http(4)将item类型的对象提交给管道进行持久化存储的操作item=Ip3366SpiderItem()item['ip']=ipitem['port']=portitem['http']=http

yielditem#将item提交给了管道任务三

Scrapy数据的持久化存储-知识准备(5)在管道类的process_item中要将其接受到的item对象存储的数据进行持久化存储操作01fromitemadapterimportItemAdapter02classIp3366SpiderPipeline:03

#专门用来处理item类型对象04

#该方法可以接受爬虫文件提过过来的item对象05fp=None06

defopen_spider(self,spider):#重写父类方法07

print("开始爬虫")08self.fp=open('./ip3366.txt','w',encoding='utf-8')09defprocess_item(self,item,spider):任务三

Scrapy数据的持久化存储-知识准备10ip=item['ip']11port=item['port']12http=item['http']13self.fp.write(http+":"+ip+":"+port+'\n')14returnitem15defclose_spider(self,spider):16

print("结束爬虫")17

self.fp.close()#关闭文件流任务三

Scrapy数据的持久化存储-任务实施1.基于终端指令的数据存储基于终端指令的数据持久化存储只可以将parse方法的返回值存储到本地的文本文件中。可以考虑使用字典和列表来进行存储,然后将返回值返回就可以。01importscrapy#导包02classIp3366Spider(scrapy.Spider):#Ip3366Spider类继承父类Spider03

#定义三个属性04

name='ip3366'#爬虫名05

allowed_domains=['']#爬虫的允许的域名,哪些领域名可以爬取,通常被注释掉06

start_urls=['/']#起始的url列表,该列表中的所有url会被Scrapy自动发送请求07

defparse(self,response):#获取响应数据,解析数据08

all_ip_list=[]09

selectors=response.xpath("//tr")#选择所有的tr标签10

#循环遍历tr标签下的td标签11

forselectorinselectors:任务三

Scrapy数据的持久化存储-任务实施12dict1={}#定义一个空字典13ip=selector.xpath('./td[1]/text()').extract_first()#在当前节点下继续选择ip14port=selector.xpath('./td[2]/text()').extract_first()#在当前节点下选择端口15http=selector.xpath('./td[4]/text()').extract_first()16ifip!=None:17dict1[http]=ip+":"+port18ifnotbool(dict1):19#print("Dictionaryisempty")20pass21else:22all_ip_list.append(dict1)#字典添加到列表中23print(all_ip_list)24returnall_ip_list任务三

Scrapy数据的持久化存储-任务实施运行结果如图所示:任务三

Scrapy数据的持久化存储-任务实施2.基于管道的数据持久化存储-使用文本存储Scrapy框架中已经为我们专门集成好了高效、便捷的持久化操作功能,我们直接使用即可:items.py:数据结构模板文件,定义数据属性;pipelines.py:管道文件,接受item类型的数据,进行持久化操作;在爬虫文件中获取到数据后,将数据封装到items对象中;通过yield关键字将items对象提交给pipelines管道进行持久化操作;在管道文件中的process_item方法中接收爬虫文件提交过来的item对象,然后编写持久化存储的代码将item对象存储的数据进行持久化存储。综合上面的叙述,基于管道的数据持久化存储的编码流程可以归纳总结为:(1)数据解析(2)在item类中定义相关的属性(3)将解析的数据封装存储到item类型的对象(4)将item类型的对象提交给管道进行持久化存储的操作(5)在管道类的process_item中要将其接受到的item对象存储的数据进行持久化存储操作任务三

Scrapy数据的持久化存储-知识准备(6)在配置文件中手动开启管道下面根据前面对应的6个步骤来书写代码。(1)对数据进行解析ip3366.py文件(爬虫文件)内容如下:01importscrapy#导包02classIp3366Spider(scrapy.Spider):#Ip3366Spider类继承父类Spider03#定义三个属性04name='ip3366'#爬虫名05allowed_domains=['']#爬虫的允许的域名,哪些域名可以爬取,通常被注释掉06start_urls=['/']#起始的url列表,该列表中的所有url会被Scrapy自动发送请求07defparse(self,response):#获取响应数据,解析数据08selectors=response.xpath("//tr")#选择所有的tr标签09#循环遍历tr标签下的td标签10forselectorinselectors:11dict1={}#定义一个空字典任务三

Scrapy数据的持久化存储-知识准备12ip=selector.xpath('./td[1]/text()').extract_first()#在当前节点下选择ip13port=selector.xpath('./td[2]/text()').extract_first()#在当前节点下选择端口14http=selector.xpath('./td[4]/text()').extract_first()15ifip!=None:16dict1[http]=ip+":"+port17ifnotbool(dict1):18pass19else:20pass任务三

Scrapy数据的持久化存储-知识准备(2)在item类中定义相关的属性,items.py文件的内容如下:01importscrapy02classIp3366SpiderItem(scrapy.Item):03#definethefieldsforyouritemherelike:04#name=scrapy.Field()05ip=scrapy.Field()#实例化对象属性06port=scrapy.Field()07http=scrapy.Field()08pass任务三

Scrapy数据的持久化存储-知识准备(3)将解析的数据封装存储到item类型的对象再次回到ip3366.py,增加下面的代码:fromip3366Spider.itemsimportIp3366SpiderItem从ip3366Spider目录下的items文件中导入Ip3366SpiderItem类,得到相关数据类型的属性。01else:02item=Ip3366SpiderItem()03item['ip']=ip04item['port']=port05item['http']=http06yielditem#将item提交给了管道任务三

Scrapy数据的持久化存储-知识准备(4)将item类型的对象提交给管道进行持久化存储的操作yielditem#将item提交给了管道上面代码将item提交给了管道。至此,整个ip3366.py文件的代码整理如下:01importscrapy#导包02fromip3366Spider.itemsimportIp3366SpiderItem03classIp3366Spider(scrapy.Spider):#Ip3366Spider类继承父类Spider04#定义三个属性05name='ip3366'#爬虫名06allowed_domains=['']#爬虫的允许的域名,哪些领域名可以爬取,通常被注释掉07start_urls=['/']#起始的url列表,该列表中的所有url会被Scrapy自动发送请求08defparse(self,response):#获取响应数据,解析数据09all_ip_list=[]10selectors=response.xpath("//tr")#选择所有的tr标签11#循环遍历tr标签下的td标签12forselectorinselectors:13dict1={}#定义一个空字典14ip=selector.xpath('./td[1]/text()').extract_first()#在当前节点下继续选择ip任务三

Scrapy数据的持久化存储-知识准备15port=selector.xpath('./td[2]/text()').extract_first()#在当前节点下选择端口16http=selector.xpath('./td[4]/text()').extract_first()17ifip!=None:18dict1[http]=ip+":"+port19ifnotbool(dict1):20pass21else:22item=Ip3366SpiderItem()23item['ip']=ip24item['port']=port25item['http']=http26yielditem#将item提交给了管道27print(all_ip_list)28#returnall_ip_list任务三

Scrapy数据的持久化存储-知识准备(5)在管道类的process_item中要将其接受到的item对象存储的数据进行持久化存储操作pipelines.py文件此时的内容如下:01fromitemadapterimportItemAdapter02classIp3366SpiderPipeline:03#专门用来处理item类型对象04#该方法可以接受爬虫文件提过过来的item对象05fp=None06defopen_spider(self,spider):#重写父类方法07print("开始爬虫")08self.fp=open('./ip3366.txt','w',encoding='utf-8')09defprocess_item(self,item,spider):10ip=item['ip']11port=item['port']12http=item['http']13self.fp.write(http+":"+ip+":"+port+'\n')14returnitem15defclose_spider(self,spider):16print("结束爬虫")17self.fp.close()#关闭文件流任务三

Scrapy数据的持久化存储-知识准备(6)在配置文件中手动开启管道找到配置文件settings.py,在该文件中查找“ITEM_PIPELINES”,然后将其注释去掉,表示打开管道,该管道默认是没有开启的。01#开启管道02ITEM_PIPELINES={03'ip3366Spider.pipelines.Ip3366SpiderPipeline':300,04}在CMD下运行爬虫程序,使用如下命令:scrapycrawlip3366任务三

Scrapy数据的持久化存储-知识准备运行结果如图所示。任务三

Scrapy数据的持久化存储-知识准备3.基于管道的数据持久化存储-使用MySQL在上面的例子中,在管道文件里将item对象中的数据值存储到了磁盘中,如果将item数据写入MySQL数据库的话,只需要将上述案例中的管道文件修改成如下形式:01classIp3366SpiderPipeline:02#专门用来处理item类型对象03#该方法可以接受爬虫文件提过过来的item对象04fp=None05defopen_spider(self,spider):#重写父类方法06print("开始爬虫")07#创建数据库连接对象08self.conn=pymysql.Connect(host='',port=3306,user='root',password='root',db='ip3366')09defprocess_item(self,item,spider):10ip

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论