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

教你学习使用python爬虫框架Scrapy爬女神

时间:2023-03-16 17:07:08 科技观察

Scrapy,一个由Python开发的快速、高阶的屏幕抓取和网页爬虫框架,用于爬取网站和提取结构化数据。Scrapy用途广泛,可用于数据挖掘、监控和自动化测试。Scrapy的魅力在于它是一个任何人都可以根据自己的需要轻松修改的框架。它还提供了各种类型爬虫的基类,如BaseSpider、sitemap爬虫等,最新版本提供了对web2.0爬虫的支持。抓是抓住的意思。这个Python爬虫框架叫做Scrapy,大概意思是一样的。我们称之为:小划痕。Scrapy使用Twisted异步网络库来处理网络通信。整体架构大致如下:Scrapy主要包含以下组件:引擎(Scrapy)用于处理整个系统的数据流处理,触发事务(框架核心)调度器(Scheduler)用于接受请求引擎并将它们推入队列,并在引擎再次请求时返回。可以想象成一个URLs(URLs或者爬取网页的链接)的优先级队列,决定下一个要爬取的URL是什么,去除重复的URL下载器(Downloader)用于下载网页内容并返回网页内容对蜘蛛(Scrapy下载器建立在twisted之上,一种高效的异步模型)爬虫(Spiders)爬虫主要用于从特定的网页中提取你需要的信息,即所谓的实体(Item)。用户也可以从中提取链接,让Scrapy继续抓取下一页。项目管道(Pipeline)负责处理爬虫从网页中提取的实体。主要功能是持久化实体,验证实体的合法性,清除不必要的信息。.当页面被爬虫解析后,会被发送到项目管道,数据会按照几个特定的??顺序进行处理。下载器中间件(DownloaderMiddlewares)是Scrapy引擎和下载器之间的一个框架,主要处理Scrapy引擎和下载器之间的请求和响应。蜘蛛中间件(SpiderMiddlewares)是介于Scrapy引擎和爬虫之间的一个框架。它的主要工作是处理蜘蛛的响应输入和请求输出。调度器中间件(SchedulerMiddewares)是Scrapy引擎和调度器之间的中间件,将Scrapy引擎的请求和响应发送给调度器。Scrapy的运行过程大致如下:引擎从调度器中取出一个链接(URL)供下一个爬虫引擎将URL封装成一个请求(Request)传给下载器下载器下载资源并封装将其打包成响应包(Response),爬虫解析Response,解析出实体(Item),交给实体管道做进一步处理。解析出来的是一个链接(URL),然后这个URL交给调度器等待抓取和安装。因为python3并没有完全支持Scrapy,所以为了完美运行Scrapy,我们使用python2.7来编写运行Scrapy。注意:windows平台需要依赖pywin32,请根据自己的系统32/64位选择下载安装,https://sourceforge.net/projects/pywin32/其他可能依赖的安装包:lxml-3.6.4-cp27-cp27m-win_amd64.whl,VCForPython27.msi百度下载后基本可以使用1.创建工程,运行命令:2.自动创建目录结果:文件描述:scrapy.cfg配置信息该项目主要提供了Scrapy命令行工具的基本配置信息。(真正的爬虫相关配置信息在settings.py文件中)items.py设置结构化数据的数据存储模板,如:Django的Modelpipelines数据处理行为,如:通用结构化数据持久化settings.py配置文件,如:递归层数、并发数、延迟下载等spiders目录,如:创建文件,写爬虫规则注意:创建爬虫文件时,以网站域名命名3、写爬虫在中新建一个xiaohuar_spiderspiders目录.py文件示例代码:备注:爬虫文件需要定义一个类,继承自scrapy.spiders.Spider。名称必须定义,这是爬虫的名称。如果没有名字,就会报错。因为源码是这样定义的:3.编写函数parse。这里要注意函数名不能改,因为Scrapy源码中默认回调函数的函数名是parse;4.定义要爬取的url,放在列表中,因为可以爬取多个url,Scrapy源码是一个For循环,从上到下爬取这些url,使用生成器迭代发送url到下载器下载url的html。源码截图:4.运行进入p1目录,运行命令格式:scrapycrawl+爬虫名-nolog,即不显示日志浪费时间,好在scrapy内部支持更简单的查询语法,帮助我们在html中查询需要的标签和标签内容以及标签属性。下面一一介绍一下:查询子孙中的某个标签(以div标签为例)://div查询子中的某个标签(以div标签为例):/div查询子孙中的某个标签(以div标签为例)labelwithacertainclass属性的label://div[@class='c1'],即子孙中的label为div且class='c1'的label有一定的class='c1'和自定义属性name='查询标签中alex''slabel://div[@class='c1'][@name='alex']查询一个标签的文本内容://div/span/text()即查询div下面的子孙span标签中的text内容查询某个属性的值(比如查询a标签的href属性)://a/@href样例代码:注意:urllib.urlretrieve(ab_src,file_path)接收到文件路径和要保存的路径,会自动去文件路径下载并保存到我们指定的本地路径。6、网页的递归爬取上面的代码只实现了对一个url的爬取。如果这个url爬取的内容中包含其他url,我们也想爬取,如何实现递归爬取网页呢?示例代码:即通过yield生成器向每个url发送request请求,并执行返回函数parse,从而递归获取校花图片、校花名称学校等信息。注意:可以修改settings.py中的配置文件,指定“递归”层数,如:DEPTH_LIMIT=17,scrapy查询语法中的正则:语法规则:Selector(response=responsequeryobject).xpath('//li[re:test(@class,“item-d*”)]//@href').extract(),即按照re规则匹配,test为匹配,属性名是class,匹配的正则表达式公式是“item-d*”,然后得到标签的href属性。选择器规则Demo获取响应cookie更多选择器规则:http://www.baby98.cn/8。Formatting上面的例子只是简单的图片处理,所以直接在parse方法中处理。如果想获取更多的数据(获取页面的价格、商品名称、QQ等),可以使用Scrapy的items对数据进行格式化,然后交给pipelines处理。即用不同的文件实现不同的功能。items:用户需要爬取哪些数据,用于格式化数据,告诉pipeline需要保存哪些数据。示例items.py文件:即:需要爬取所有url中的公司名称、职位、qq、基本信息info等更多信息。上面的定义模板,以后从request的源码中获取的数据也是按照这个结构获取的,所以在spider中需要进行一些操作:上面代码中:md5加密的目的url是为了避免url太长,也方便保存在缓存或者数据库中。这里代码的关键是:将获取到的数据封装在Item对象中yieldItem对象(parse中一旦执行到yieldItem对象,该对象就会自动交给一个pipeline类处理)多个类in的目的上面的代码是的,可以同时保存在文件和数据库中,保存的优先级可以在配置文件设置中定义。总结:本文对python爬虫框架Scrapy进行了详细的分析和实例讲解