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

5分钟快速掌握scrapy爬虫框架

时间:2023-03-23 01:52:19 科技观察

1。scrapy简介scrapy是一个基于事件驱动的Twisted框架,用纯python编写的爬虫框架。很早以前就开始用scrapy爬取网上的图片和文字信息,具体内容我没有记录下来。这段时间因为工作需要,又重新拿起了scrapy爬虫。本文就分享给大家,用过即用。欢迎交流。1.1scrapy框架scrapy框架包括5个主要组件和2个中间件Hooks。ENGIINE:整个框架的控制中心,控制整个爬虫进程。根据不同的条件添加不同的事件(即使用Twisted)SCHEDULER:事件调度器DOWNLOADER:接收爬虫请求,从互联网下载数据SPIDERS:发起爬虫请求,解析DOWNLOADER返回的网页内容,并与数据持久化交互同时,需要开发者编写ITEMPIPELINES:接收SPIDERS解析出来的结构化字段,进行持久化等操作,需要开发者编写MIDDLEWARES:ENGIINE与SPIDERS、ENGIINE与DOWNLOADER之间的一些额外操作,提供给开发者在hooks的形式从上面可以看出,我们只需要实现SPIDERS(抓取什么网站,怎么解析)和ITEMPIPELINES(解析出来的内容怎么处理)。其他一切都由框架为您完成。(图片来自网络,如有侵权联系必删)1.2scrapy数据流下面我们仔细看看组件间的数据流,对于框架内部的运行会更加清晰。(图片来源于网络,如有侵权联系必删)SPIDERS向ENGIINE发送爬虫请求,告诉它任务来了。ENGIINE会把请求加入到SCHEDULER调度队列中,说任务交给你,给我安排SCHEDULER,看一下爬取的请求很多,给ENGIINE挑一个,告诉大哥帮忙转发给下载DOWNLOADERENGIINE:OK,DOWNLOADER你的任务来了DOWNLOADER:开始下载,下载完成,任务结果交给ENGIINEENGIINE会把结果给SPIDERS,你的一个请求已经下载了,让我们快速分析一下蜘蛛:好的,分析产生了一个结果字段。并转发给SPIDERStoITEMPIPELINESITEMPIPELINES:接收字段内容并保存。从第1步到第8步,最终完成了一个请求。你觉得多余吗?Engine夹在中间作为麦克风,可以跳过吗?考虑一下如果你跳过它会发生什么。这里分析一下SCHEDULER的作用:任务调度,控制任务的并发,防止机器无法处理。引擎:它基于Twisted框架。当事件到来时(比如转发请求),通过回调执行对应的事件。我认为ENGIINE通过以事件的形式组织其他组件来统一所有操作,其他组件以低耦合的方式运行;毫无疑问,需要一个框架。2.基础:XPath写爬虫最重要的就是解析网页内容。本部分介绍使用XPath解析网页并提取内容。2.1HTML节点及属性(图片来自网络,如有侵权必删)2.2解析语法a/b:'/'表示xpath中的层级关系,左边a为父节点,b在右边right是子节点a//b:表示a下的所有b,直接或间接[@]:选择某个属性的节点//div[@classs],//a[@x]:选择一个div节点withaclassattribute,selectanodewithaxattributeanode//div[@class="container"]:选择class属性值为container的div节点//a[contains(@id,"abc")]:选择id属性中带有abc的a标签示例response.xpath('//div[@class="taglist"]/ul//li//a//img/@data-original').get_all()#获取所有class属性(css)作为taglistdiv,data-original属性下所有img标签下a下的所有li#data-original这里是图片的url地址formore详情请见http://zvon.org/comp/r/tut-XPath_1.html#Pages~List_of_XPatHS3。安装部署Scrapy是用纯python编写的,它依赖于几个关键的python包(和其他包):用于处理URL和网页编码、扭曲异步网络框架密码学和pyOpenSSL的目的帮助程序,处理各种网络级安全需求#Installpipinstallscrapy4。创建爬虫项目scrapystartprojectsexy#创建一个项目目录后#sexy#│scrapy.cfg#│#└─sexy#│items.py#│middlewares.py#│pipelines.py#│settings.py#│__init__.py#│#├─spiders#││__init__.py#││#│└─__pycache__#└─__pycache__#执行需要到scrapy.cfg同级目录下才能执行scrapycrawlsexy从上面我们知道的想写的是spiders具体的spider类和items.py和pipelines.py(对应ITEMPIPELINES)5.启动scrapy爬虫5.1简单而强大的spider这里实现的功能是从图片网站下载图片,保存到本地,并且url做了脱敏的注意点是在注释中注明该类要继承scrapy.Spider,取一个唯一的名字,将爬取的网站url添加到start_urls列表中,重写parse,使用xpath解析内容的响应,你可以看到当它被执行时解析没有被转发到ITEMPIPELINES,直接处理。这么简单的事情可以这样处理。如果业务比较复杂,建议交给ITEMPIPELINES。后面会给出例子#目录的结果是:spiders/sexy_spider.pyimportscrapyimportosimportrequestsimporttimedefdownload_from_url(url):response=requests.get(url,stream=True)ifresponse.status_code==requests.codes.ok:returnresponse.contentelse:print('%s-%s'%(url,response.status_code))returnNoneclassSexySpider(scrapy.Spider):#如果有多个蜘蛛,名称必须是唯一的name='sexy'allowed_domains=['uumdfdfnt.94demo.com']allowed_urls=['http://uumdfdfnt.94demo.com/']#将要抓取的网站url添加到start_urlsliststart_urls=['http://uumdfdfnt.94demo.com/tag/dingziku/index.html']save_path='/home/sexy/dingziku'defparse(self,response):#解析网站得到图片列表img_list=response.xpath('//div[@class="taglist"]/ul//li//a//img/@data-original').getall()time.sleep(1)#处理图片,具体的业务操作,可以交给items,见5.2items示例forimg_urlinimg_list:file_name=img_url。split('/')[-1]内容=download_from_url(img_url)ifcontentisnotNone:withopen(os.path.join(self.save_path,file_name),'wb')asfw:fw.write(content)#自动下一页(见5.3自动下一页)next_page=response.xpath('//div[@class="pageboth"]/ul/a[text()="nextpage"]/@href').get()ifnext_pageisnotNone:next_page=response.urljoin(next_page)yieldscrapy.Request(next_page,callback=self.parse)5.2这里给出items和pipeline的例子来说明后面两个item的作用:提供一个字段存储,spider会把数据存储在这里pipeline:会从items中取数据,进行业务操作,比如5.1中保存图片;并存入数据库等待我们重写上面的例子items.py其实就是定义字段scrapy.Field()importscrapyclassSexyItem(scrapy.Item):#definethefieldsforyouritemherelike:#name=scrapy.Field()img_url=scrapy.Field()spiders/sexy_spider.pyimportscrapyimportos#importitemfrom..itemsimportSexyItemclassSexySpider(scrapy.Spider):#如果有多个蜘蛛,名称必须是唯一的name='sexy'allowed_domains=['uumdfdfnt.94demo.com']allowed_urls=['http://uumdfdfnt.94demo.com/']#将要抓取的网站url添加到start_urlslist开始_urls=['http://uumdfdfnt.94demo.com/tag/dingziku/index.html']save_path='/home/sexy/dingziku'defparse(self,response):#解析网站,获取图片列表img_list=response.xpath('//div[@class="taglist"]/ul//li//a//img/@data-original').getall()time.sleep(1)#处理图片,具体业务可以交给yielditemsforimg_urlinimg_list:items=SexyItem()items['img_url']=img_urlyielditems管道.pyimportosimportrequestsdefdownload_from_url(url):response=requests.get(url,stream=True)ifresponse.status_code==requests.codes.ok:returnresponse:print('%s-%s'%(url,response.status_code))returnNoneclassSexyPipeline(object):def__init__(self):self.save_path='/tmp'defprocess_item(self,item,spider):ifspider.name=='性感':#取出item中的内容img_url=item['img_url']#业务处理file_name=img_url.split('/')[-1]content=download_from_url(img_url)ifcontentisnotNone:withopen(os.path.join(self.save_path,file_name),'wb')asfw:fw.write(content)returnitem重要的配置是在settings.py中开启pipelines类,值表示优先级ITEM_PIPELINES={'sexy.pipelines.SexyPipeline':300,}5.3自动下一页有时候我们不仅需要爬取请求页面中的内容,还需要递归爬取其中的超链接url,尤其是下一页,当t他解析出来的内容和当前页面是一样的比较笨的办法是手动添加到start_urls中。我们都是尝试这个的聪明人。先在页面scrapy.Request(next_page,callback=self.parse)解析下一页的url发起请求,调用parse解析。当然你也可以使用其他的解析方式来完善。有关完整示例,请参见5.1next_page=response。xpath('//div[@class="pageboth"]/ul/a[text()="下一页"]/@href').get()ifnext_pageisnotNone:next_page=response.urljoin(next_page)yieldscrapy。Request(next_page,callback=self.parse)5.4Middleware下载Middleware中间件的作用是提供一些常用的钩子来添加额外的操作。中间件操作在middlewares.py中。可以看出处理请求process_request、响应process_response和异常process_exception主要有3个钩子函数。处理请求process_request:传递给DOWNLOADER响应之前的操作process_response:DOWNLOADER响应ENGIINE之前的操作这里添加一个模拟的浏览器请求,防止爬虫被拦截。重写process_requestfromscrapy.contrib.downloadermiddleware.useragentimportUserAgentMiddlewareimportrandomagents=['Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0;','Mozilla/5.0(Macintosh;IntelMacOSX10.6;rv,2.0.1)Gecko/20100101Firefox/4.0.1','Opera/9.80(Macintosh;IntelMacOSX10.6.8;U;en)Presto/2.8.131Version/11.11','Mozilla/5.0(Macintosh;IntelMacOSX10_7_0)AppleWebKit/535.11(KHTML,likeGecko)Chrome/17.0.963.56Safari/535.11','Mozilla/4.0(compatible;MSIE7.0;WindowsNT5.1;360SE)']classRandomUserAgent(UserAgentMiddleware):defprocess_request(self,request,spider):ua=random.choice(agents)request.headers.setdefault('User-agent',ua,)统一开启settings.py中的下载中间件,值表示优先级DOWNLOADER_MIDDLEWARES={'sexy.middlewares.customUserAgent.RandomUserAgent':20,}5.5可用配置settings.py除了上面提供的pipline配置和中间件配置外,下面介绍几种常用的爬虫机器人c配置规则:ROBOTSTXT_OBEY=False,如果要抓取的网站设置了robots.txt,最好设置为FalseCONCURRENT_REQUESTS:并发请求DOWNLOAD_DELAY:下载延迟,可以适当配置避免抓取网站。有关所有配置详细信息,请参阅https://doc.scrapy.org/en/latest/topics/settings.html6。小结相信通过上面的介绍,你已经可以编写自己的爬虫了。我也完成了记笔记的任务。Scrapy还提供了更详细的细节,参见https://docs.scrapy.org/en/latest/。最后总结如下:scrapy是一个基于事件驱动的Twisted框架的爬虫框架。ENGIINE是核心,负责串接其他组件进行开发。只需要编写spider和itempipeline和中间件,把下载和调度交给框架scrapycrawl。你的爬虫名称,名称必须是start_urls中唯一爬取的url,蜘蛛会自动请求。Parse解析pipline和middleware,记得在settings中开启settings的commonconfiguration,需要的时候阅读文档

最新推荐
猜你喜欢