文案1scrapy教程入门篇_第1页
文案1scrapy教程入门篇_第2页
文案1scrapy教程入门篇_第3页
文案1scrapy教程入门篇_第4页
文案1scrapy教程入门篇_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

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

文档简介

scrapy-发布Xiong3月07,Scrapy教程01-33461安装scrapy...............scrapy-发布Xiong3月07,Scrapy教程01-33461安装scrapy....................................................................Scrapy特性一览...............................2Scrapy教程02-778899创建Scrapy工程...............................定义我们的Item...............................第一个....................................................................................................导出抓取数据..............................................................下一步.....................................3Scrapy教程03-SpiderCrawlSpider.................................XMLFeedSpider...............................SitemapSpider..............................................................4Scrapy教程04-Selector...................................................................................................................................XPath相对路 ..............................XPath建议..................................Scrapy教程05-Item5定义Item...................................ItemFields.................................Item使用示 ...............................ItemLoader.....................ItemLoader.................................输入/输出处理器...............................自定义Item ............................在Field定义中声明输入/..................ItemLoader............................................................Scrapy教程06-Item6编写自己的Pipeline.............................ItemPipeline示例..............................ItemPipeline.......................Feedexports.................................请求和响应..................................7Scrapy教程07-发送email...................................同一个进程运行多个Spider分布式爬虫..................................................................Scrapy教程08-8使用FilesPipeline..............................使用ImagesPipeline...............................................................................................Scrapy教程09-9部署到Scrapyd................................部署到ScrapyCloud.............................Scrapy教程10-10.1脚本运行Scrapy...............................10.2同一进程运行多个 .........................10.3定义规则表10.4定义文章 ...............................10.5ArticleSpider..............................10.6编写pipeline.......................10.7修改run.py启动脚 ...........................Scrapy教程11-11.1重写start_requests.........................11.2使用FormRequest..............................11.3重写_requests_to_follow..........................11.4................................11.5完整源 ..................................Scrapy教程12-12.1scrapy-splash简介..............................12.2安装docker..................................12.3安装Splash...............................12.3安装Splash..................................安装scrapy-配置scrapy-使用scrapy-.......................................................................................12.7使用实 ..................................131Scrapy教程01-入门Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。其最初是为了页面抓取(更确切来说,网络抓取)所设计的,也可以应用在获取API所返回的数据(比如WebServices)或者通用的网络爬虫。Scrapy也能帮你实现高阶的爬虫框架,比如爬取时的网站认证、内容的分析处理、重复抓1.1安装python2.7root由于scrapypython2上,所以先更新centospythonPython2.7.11,具体方法请googleyuminstallpython-develyuminstalllibffi-develyuminstallopenssl-devel然后安装pyopensslpipinstall安装yuminstallpython-lxmlyuminstalllibxml2-develyuminstalllibxslt-安装service-pipinstallservice-安装pipinstall安装pipinstallscrapy-测试scrapy1.2简单示创建一个pythonpipinstallservice-安装pipinstall安装pipinstallscrapy-测试scrapy1.2简单示创建一个python源文件,名为stackoverflow.pyimportclassStackOverflowSpider(scrapy.Spider):name='stackoverflow' defparse(self,forhrefinresponse.css('.question-summaryh3a::attr(href)'):full_url=response.urljoin(href.extract())yieldscrapy.Request(full_url,kdefparse_question(self,yield .vote-count-.'body':response.css('.question.post-text').extract()[0],'tags':response.css('.question.post-tag::text').extract(),'link':response.url,}scrapyrunspiderstackoverflow_spider.py-otop-stackoverflow-"body":"...LONGHTMLHERE "/questions/11227809/why-is-processing-,"body":"...LONGHTMLHERE "/questions/11227809/why-is-processing-,→sorted-array-faster-than-an-unsorted-"tags":["java","c++","performance","title":"Whyisprocessingasortedarrayfasterthananunsorted"votes":{"body":"...LONGHTMLHERE "/questions/1260748/how-do-i-remove-a-"tags":["git","git-"title":"HowdoIremoveaGit"votes": 当你运行scrapyrunspidersomefile.py这条语句的时候,Scrapy会去寻找源文件spiderstart_urlsURL,爬虫会通过它来构建初始的请求,返回response后再调用默认的回调方法parse并传入这个responseparse回调方法中通过使用css接的href属性值,然后yield另外一个请求,并注册parse_question回调方法,在Scrapy的一个好处是所有请求都是被调度并异步处理,就算某个请求出错也不影响其CSVScrapy的一个好处是所有请求都是被调度并异步处理,就算某个请求出错也不影响其CSV,或者是将其存储到FTP、AmazonS3上。你还可以通过pipeline将它们存储到数据库1.3Scrapy特性一 Scrapy的皮毛。 CSSXPathHTML/XML源码中选择并提shellCSSXPath表达式,这个在调试你的蜘蛛程序时可扩展,允许你使用signals和友好的API(middlewares,extensions,和••••••cookiesandsessionHTTPfeatureslikecompression,authentication,cachinguser-agentspoofingcrawldepthrestrictionandmore7.还有其他好多好东东,比如可重复利用蜘蛛来爬取Sitemaps••••••cookiesandsessionHTTPfeatureslikecompression,authentication,cachinguser-agentspoofingcrawldepthrestrictionandmore7.还有其他好多好东东,比如可重复利用蜘蛛来爬取Sitemaps和XML/CSV订阅,一个跟爬取元素关联的媒体管道来自动下载图片,一个缓存DNS解析器等等。2Scrapy教程02-完整示Scrapy,我选择爬取虎嗅网首页ScrapyItemspiderItem对象编写一个ItemPipline来存储提取出来的Item对象•••Scrapy使用Python2.1创建Scrapy工scrapy将会创建init#部署配置文#Python模块,你所有的代码都放这里#Item定义文#pipelines定义文#配置文init#所有爬虫spider都放这个文件夹下2.2定义我们的init#所有爬虫spider都放这个文件夹下2.2定义我们的scrapy.Itemscrapy.Field的属性,我们准备importclasstitle=scrapy.Field()link=##标链desc=#简#Item有点麻烦,但是定义完之后你可以得到许多好处,这样你就可以使用Scrapy中其他有用的组件和帮助类。2.3第一个蜘蛛就是你定义的一些类,Scrapy使用它们来从一个domain(或domain组)爬取信URL下载列表,以及怎样跟踪链接,如何解析页面内容来提取Item。定义一个Spider,只需继承scrapy.Spider•••name:Spiderstart_urls:初始化下载链接parse(Response对象,该对象也是这个方法的唯一参数。它Item(Item对象链接URL(返回Request对象。coolscrapy/spiders文件夹下面新建huxiu_spider.py#!/usr/bin/env#-*-encoding:utf-8-*-Topic:sampleDesc:fromcoolscrapy.itemsimportimportclassHuxiuSpider(scrapy.Spider):name="huxiu"allowed_domains=[""]start_urls=[]defparse(allowed_domains=[""]start_urls=[]defparse(self,forselinresponse.xpath('//div[@class="mod-info-,→div[@class="mob-item=item['title']=sel.xpath('h3/a/text()')[0].extract()item['link']=sel.xpath('h3/a/@href')[0].extract()url=response.urljoin(item['link'])item['desc']=sel.xpath('div[@class="mob-2.4运行爬在根目录执行下面的命令,其中huxiu是你定义的spiderscrapycrawl2.5处理链parse()方法中返回一个Request对象,然后注册一个回调函数来解析新闻详情。fromcoolscrapy.itemsimportimportclassHuxiuSpider(scrapy.Spider):name="huxiu"allowed_domains=[""]start_urls=[]defparse(self,forselinresponse.xpath('//div[@class="mod-info-,→div[@class="mob-item=item['title']=sel.xpath('h3/a/text()')[0].extract()item['link']=sel.xpath('h3/a/@href')[0].extract()url=response.urljoin(item['link'])item['desc']=sel.xpath('div[@class="mob-#yieldscrapy.Request(url,)defparse_article(self,#yieldscrapy.Request(url,)defparse_article(self,detail=response.xpath('//div[@class="article-wrap"]')item=HuxiuItem()item['title']=detail.xpath('h1/text()')[0].extract()item['link']=response.urlitem['posttime']='div[@class="article-author"]/span[@class="article-→yielditem2.6导出抓取数 scrapycrawlhuxiu-o写ItemPipeline。2.7保存数据到数据Itemjson格式的文件,不过最常见的做法还是编写Pipeline将其存储到数据库中。我们在coolscrapy/pipelines.py定义#-*-coding:utf-8-importredisimportjsonimportloggingfromcontextlibimportfromscrapyimportscrapy.exportersimportscrapy.pipelines.imagesimportscrapy.exceptionsimportsqlalchemy.ormimportfromcoolscrapy.modelsimportNews,db_connect,create_news_table,class"""保存文章到数据库def self.Session=def self.Session=defopen_spider(self,"""Thismethodiscalledwhenthespiderisdefprocess_item(self,item,spider):a=litem["url],[_withsession_scope(self.Session)assession:defclose_spider(self,上面我使用了python中的SQLAlchemy然后在setting.py中配置这个PipelineITEM_PIPELINES=}#linuxpipinstallMySQL-DATABASE={'drivername':'host':'port':'username':'password':'mysql','database':'spider','query':{'charset':'utf8'}}scrapycrawl2.8下一scrapy最基本的功能,还有很多高级特性没有讲到。接下来会通过多个例子向你展示scrapy的其他特性,然后再深入讲述每个特性。3Scrapy教程03Spider详 先初始化请求URL列表,并指定下载后处理response的回调函数。初次请求3Scrapy教程03Spider详 先初始化请求URL列表,并指定下载后处理response的回调函数。初次请求URL通过start_urls指定,调用start_requests()产生Request对象,然后注册parse方法作为回调在parse回调中解析response并返回字典,Item对象,Request对象或它们的迭代在回调函数里面,你通过使用选择器(同样可以使BeautifulSoup,lxml或其他工具)解析页面内容,并生成解析后的结果Item。最后返回的这些Item通常会被持久化到数据库中(使用ItemPipeline)或者使用Feedexports将其保存到文件中。Scrapy里面为不同的使用目的实现了一些常见的Spider。下面我们把它们列出来。3.1适合你的需求,可以先继承它然后覆盖相应的方法,或者自定义Spider也行。它除了从scrapy.Spider类继承的属性外,还有一个新的属性rules,它是一个Rule对象列表,每个Rule对象定义了某个规则,如果多个Rule匹配一个连接,那么使用fromcoolscrapy.itemsimportimportfromscrapy.spidersimportCrawlSpider,fromscrapy.linkextractorsimportclassLinkSpider(CrawlSpider):name="link"allowed_domains=[""]start_urls=[]rules=#提取匹配正则式'/group?f=index_group'链接(但是不能匹配#并且会递归爬取(如果没有定义callback,默认nw=(x_',),#提取匹配'/article/\d+/\d+.html'的链接,并使用parse_item来解析它们下载的内容,不递 rw('/article/\d+/\d+.htl',)),rw('/article/\d+/\d+.htl',)),)defparse_item(self,('Hi,thisisanitempage!%response.url)detail=response.xpath('//div[@class="article-wrap"]')item=item['title']=detail.xpath('h1/text()')[0].extract()item['link']=response.urlitem['posttime']='div[@class="article-author"]/span[@class="article-→yielditem3.2XML订阅蜘蛛,用来爬取XML形式的订阅内容,通过某个指定的节点来遍历。可使用iternodes,xml,和html三种形式的迭代器,不过当内容比较多的时候推荐使用iternodes,默认也是它,可以节省内存提升性能,不需要将整个DOM再解析。而使用htmlRemovingXML有格式错误的内容。处理XML fromcoolscrapy.itemsimportimportfromscrapy.spidersimportname="xml"namespaces=[('atom','/2005/Atom')]allowed_domains=["github.io"]start_urls[]iterator= #缺省的iternodes,貌似对于有namespace的xml不itertag=defparse_node(self,response,#('Hi,thisisa<%s>node!',item=item['title']=node.xpath('atom:title/text()')[0].extract()item['link']=node.xpath('atom:link/@href')[0].extract()item['id']=node.xpath('atom:id/text()')[0].extract() item['updated']=node.xpath('atom:updated/text()')[0].extract()item['updated']=node.xpath('atom:updated/text()')[0].extract()return3.3这个跟上面的XMLFeedSpider点一个节点的迭代。每次迭代行的时候会调用fromcoolscrapy.itemsimportfromscrapy.spidersimportclassCSVSpider(CSVFeedSpider):name="csv"allowed_domains=start_urls=['/feed.csv']delimiter=';'quotechar=headers=['id','name',defparse_row(self,response,row):('Hi,thisisarow!:rrow)item=BlogItem()item['id']=item['name']=return3.4站点地图蜘蛛,允许你使用Sitemaps发现URL后爬取整个站点。还支持嵌套的站点地图以及从robots.txt中发现站点URL4Scrapy教程04Selector详1.BeautifulSoup是python中一个非常流行的抓取库,它还能合理的处理错误格式的lxml是一个基于ElementTree的XML解析库(同时还能解析HTML),不过PythonScrapy实现了自己的数据提取机制,它们被称为选择器,通过XPath或CSS表达式在HTML文档中来选择特定的部分XPath是一用来在XML中选择节点的语言,同时可以用在HTML上面。Scrapy实现了自己的数据提取机制,它们被称为选择器,通过XPath或CSS表达式在HTML文档中来选择特定的部分XPath是一用来在XML中选择节点的语言,同时可以用在HTML上面。CSSHTMLScrapy选择器构建在lxml的API少多了,因为lxml可以用于很多其他领域。API请查看SelectorAPI,4.1关于选择/html/head/title:选择<title>节点html文档的<head>/html/head/title/text():选择上面的<title>节点的内容//td://div[@class=”mine”]:选择所有拥有属性class="mine"的div•••Scrapycssxpathxpath():xpathcss():cssextract():返回被选择元素的unicodere():返回通过正则表达式提取的unicode•••4.2使用选择下面我们通过Scrapyshell演示下选择器的使用,假设我们有如下的一个网页///en/latest/_static/selectors-sample1.html,内容如<basehref='http://e/'<eExale><div<ahref='image1.html'>Name:Myimage1<br/><imgsrc='image1_thumb.jpg'<ahref='image2.html'>Name:Myimage2<br/><imgsrc='image2_thumb.jpg' <a<a<a<a<a<a345首先我们打开 /en/latest/_static/selectors-运>>>response.xpath('//title/text()')[<Selector(text)xpath=//title/text()>]>>>response.css('title::text')[<Selector(text)xpath=//title/text()>]结果可以看出,xpath()和css()方法返回的是SelectorList实例,是一个选择器列>>>response.css('img').xpath('@src').extract()必须使用.extract()才能提取最终的数据,如果你只想获得第一个匹配的,可以使>>>response.xpath('//div[@id="images"]/a/text()').extract_first()u'Name:Myimage1' None,还可选择默认 response.xpath('//div[@id="not-,→'not-'not-而CSS选择器还可以使用CSS3>>>response.css('title::text').extract()[u'Examplewebsite']>>>response.xpath('//base/@href').extract()>>>response.>>>response.xpath('//base/@href').extract()>>>response.css('base::attr(href)').extract()>>>response.xpath('//a[contains(@href,"image")]/@href').extract()>>>response.css('a[href*=image]::attr(href)').extract()>>>response.xpath('//a[contains(@href,>>>response.css('a[href*=image]img::attr(src)').extract()4.3嵌套选择xpath(和css(>>>links=response.xpath('//a[contains(@href,>>>[u'<ahref="image1.html">Name:Myimage1<br><imgu'<ahref="image2.html">Name:Myimage2<br><imgu'<ahref="image3.html">Name:Myimage3<br><imgu'<ahref="image4.html">Name:Myimage4<br><imgu'<ahref="image5.html">Name:Myimage5<br><img>>>forindex,linkinargs=(index,link.xpath('@href').extract(),>>>forindex,linkinargs=(index,link.xpath('@href').extract(),print'Linknumber%dpointstourl%sandimage%s%Linknumber0pointstourl[u'image1.html']andimage[u'image1_thumb.jpg']Linknumber1pointstourl[u'image2.html']andimage[u'image2_thumb.jpg']Linknumber2pointstourl[u'image3.html']andimage[u'image3_thumb.jpg']Linknumber3pointstourl[u'image4.html']andimage[u'image4_thumb.jpg']Linknumber4pointstourl[u'image5.html']andimage[u'image5_thumb.jpg']4.4使用正则表达Selector有一个re方法通过正则表达式提取数据,它返回的是unicode字符串列>>>response.xpath('//a[contains(@href,"image")]/text()').re(r'Name:\s*(.*)')[u'Myimage1',u'Myimageu'Myimageu'Myimageu'Myimage u'Myimage4.5XPath相对路XPath时候,不要使用/开头的,因为这个会相对文档根节点开始算起,>>>divs=>>>forpin #extractsall<p>print#或者下面这个直接使用p也可>>>forpinprint4.6XPath建使用text避免使用.//text(),直接使用>>>sel.xpath("//a[contains(.,'Next[u'<ahref="#">Click使用text避免使用.//text(),直接使用>>>sel.xpath("//a[contains(.,'Next[u'<ahref="#">Clickheretogotothe<strong>Next//node[1]和(//node)[1]//node[1]:选择所有位于第一个子节点位置的node(//node)[1]:nodenode通过class查找时优先考虑>>fromscrapyimport>>>sel=Selector(text='<divclass="heroshout"><timedatetime="2014-07-,→19:00">Special [u'2014-07-2319:00']5Scrapy教程05-Item详 Item提供了类字典的API,并且可以很方便的声明字段,很多ScrapyItem5.1定义定义Item非常简单,只需要继承scrapy.Item类,并将所有字段都定义为scrapy.Field类型即可importclassProduct(scrapy.Item):name=scrapy.Field()price=scrapy.Field()stock=last_updated=r)5.2ItemField对象可用来对每个字段指定元数据。例如上面last_updated的序列化函数指定为str,可任意指定元数据,不过每种元数据对于不同的组件意义不一样。5.35.2ItemField对象可用来对每个字段指定元数据。例如上面last_updated的序列化函数指定为str,可任意指定元数据,不过每种元数据对于不同的组件意义不一样。5.3Item使用示你会看到Item的使用跟Python中的字典API创建>>>product=Product(name='DesktopP',)>>>printproductProduct(name='DesktopPC',price=1000)>>>product['name']DesktopPC>>>product.get('name')DesktopPC>>>product['price']>>>product['last_updated']Traceback(mostrecentcalllast):KeyError:>>>product.get('last_updated','notset')notset>>>product['lala']#gettingunknownTraceback(mostrecentcallKeyError:>>>product.get('lala','unknownfield')'unknownfield'>>>'name'inproduct#isnamefield>>>'last_updated'inproduct#islast_updated>>>'last_updated'in #islast_updated>>>'lala'inproduct.fields>>>'last_updated'in #islast_updated>>>'lala'inproduct.fields#islalaadeclared>>>product['last_updated']=>>>product['last_updated']>>>product['lala']='test'#settingunknownTraceback(mostrecentcallKeyError:'Productdoesnotsupportfield:>>>product.keys()['price','name']>>>[('price',1000),('name','Desktop5.4ItemItemLoaderItem的相当便利的方法。Item为抓取的数据提供了容器,而ItemLoader可以让我们非常方便的将输入填充到容器中。fromscrapy.loaderimportfrommyproject.itemsimportdefparse(self,l=ItemLoader(item=Product(),response=response)l.add_xpath('name','//div[@class="product_name"]')l.add_xpath('name','//div[@class="product_title"]')l.add_xpath('price','//p[@id="price"]')l.add_css('stock',l.add_value('last_updated','today')#youcanalsouseliteralreturn注意上面的name字段是从两个xpath5.5输入/输出处理ItemLoader对每个Field都有一个输入处理器和一个输出处理器。输入处理器在数据被接受到时执行,当数据收集完后调用ItemLoader.load_item()时再执行输出处l=5.5输入/输出处理ItemLoader对每个Field都有一个输入处理器和一个输出处理器。输入处理器在数据被接受到时执行,当数据收集完后调用ItemLoader.load_item()时再执行输出处l=ItemLoader(Product(),some_selector)l.add_xpath('name',xpath1)#(1)l.add_xpath('name',xpath2)#(2)l.add_css('name',css)#(3)l.add_value('name','test')#returnl.load_item()#1.xpath1name字段的输入处理器中,在输入处理器处理完后生成结果放在ItemLoader里面(这时候没有赋值给item)xpath2数据被提取出来,然后传输给(1)name字段的处理器,然后处理结果被附加到(1)的结果后面跟2一样3一样,不过这次是直接的字面字符串值,先转换成一个单元素的可迭代对象上4步的数据被传输给namename自定义Itemfromscrapy.loaderimportfromcessorsimportTakeFirst,MapCompose,classdefault_output_processor=name_in=MapCompose(unicode.title)name_out=Join()price_in=#通过_in和_out后缀来定义输入和输出处理器并且还可以定义默认的 default_input_processor和ItemLoader.default_input_processor.5.7在Field定义中声明输入/输出处理还有个地方可以非常方便的添加输入/Field5.7在Field定义中声明输入/输出处理还有个地方可以非常方便的添加输入/FieldimportfromcessorsimportJoin,MapCompose,fromw3lib.htmlimportdefifreturnclassProduct(scrapy.Item):name=)pricescrapy.Field(input_processor=MapCompose(remove_tags,filter_price),output_processor=TakeFirst(),)ItemLoader中定义的field_in和Filed(input_processor和output_processor关键字ItemLoaderTips:一般来讲,将输入处理器定义在ItemLoader的定义中field_in,然后将输出处理器定义在Field元数据中5.8ItemLoader上下 上下文被所有输入/输出处理器共享,比如你有一个解析长度的defparse_length(text,loader_context):unit=loader_context.get('unit','m')#...lengthparsingcodegoeshere...returnparsed_lengthloader=ItemLoader(product) loader=ItemLoader(product,)classlength_out=MapCompose(parse_length,内置的处理IdentityTakeFirstJoin将结果连起来,默认使用空格’‘Compose内置的处理IdentityTakeFirstJoin将结果连起来,默认使用空格’‘ComposeMapCompose跟上面的Compose类似,区别在于内部结果在函数中的传递方式.它的输入值是可迭代的,首先将第一个函数依次作用于所有值,产生新的可迭代输入,作为第二个函数的输入,最后生成的结果连起来返回最终值,一般用在输SelectJmes使用json6Scrapy教程06-Item当一个item被蜘蛛爬取到之后会被发送给ItemPipeline,然后多个组件按照顺序处理itemItemPipelinePython类。他itemitem到底是否还要继续往下传输,使用ItemPipelineHTML(item是否包含某些字段重复性检查(然后丢弃•••编写自己的定义一个Python类,然后实现方法process_item(self,item,spider)即可,返回一个字典或Item,或者抛出DropItem异常丢弃这个Item。 spider)crawler)•••ScrapyItemPipeline示fromscrapy.exceptionsimportclassPricePipeline(object):vat_factor=1.15defprocess_item(self,item,fromscrapy.exceptionsimportclassPricePipeline(object):vat_factor=1.15defprocess_item(self,item,ififitem['price']=item['price']*returnraiseDropItem("Missingpricein%s"%将item写入jsonPipelineitemjsonimportclassdefinitself.file=open('items.jl',defprocess_item(self,item,spider):return将item存储到MongoDB这个例子使用pymongoitemMongoDB中。MongoDB的地址和数据库名在配置中指定,这个例子主要是向你展示怎样使用from_crawler()方法,以及如importclassMongoPipeline(object):collection_name='scrapy_items'definit(self,mongo_uri,mongo_db):self.mongo_uri=mongo_urisel.mongo_b=from_crawler(cls,returnsel.mongo_b=from_crawler(cls,return(mong_=crale..get'MNG_DATBS,'items'))open_spider(self,self.client=o.ngCe(sel.mong_r)self.db=self.client[self.mongo_db]close_spider(self,spider):process_item(self,item,spider):returnitemitemididscrapy.exceptionsimportclassdefinit(self):self.ids_seen=set()defprocess_item(self,item,ifitem['id']inraiseDropItem("Duplicateitemfound:%s"%return6.3激活一个ItemPipeline组你必须在配置文件中将你需要激活的Pipline组件添加到ITEM_PIPELINESITEM_PIPELINES='myproject.pipelines.PricePipeline': }0-6.4Feed这里顺便提下Feedexports,一般有的爬虫直接将爬取结果序列化到文件中,并保存到某个存储介质中。只需要在settings里面设置几个即可:*# 6.4Feed这里顺便提下Feedexports,一般有的爬虫直接将爬取结果序列化到文件中,并保存到某个存储介质中。只需要在settings里面设置几个即可:*# /FEED_EXPORT_FIELDS=["foo","bar","baz"]#这个在导出csv的时候有6.5请求和响Scrapy使用Request和Response对象来爬取网站。Request对象被蜘蛛生成,然后被传递给下载器,之后下载器处理这个Request后返回Response对象,然后返回给生成Request的这个蜘蛛。Request对象生成的时候会通过关键字参数callback指定回调函数,Response对象被当做第一个参数传入,有时候我们想传递额外的参数,比如我们构建某个Item的时候,需要两步,第一步是链接属性,第二步是详情属性,可以指定Request.metadefparse_page1(self,response):item=MyItem()item['main_url']=response.urlrequest=request.meta['item']=itemreturndefparse_page2(self,response):item=response.meta['item']item['other_url']=response.urlreturnitemScrapyRequest子类,你还可以继承它自定义自己的请FormRequest这个专门为formreturn(,frma={'name':'JohnD,'age':'27'},importclassLoginSpider(scrapy.Spider):name=''start_urls=importclassLoginSpider(scrapy.Spider):name=''start_urls=defparse(self,formdata={':'john','password':'secret'},)defafter_login(self,#checkloginsucceedbeforegoingif"authenticationfailed"inresponse.body:self.logger.error("Loginfailed")Response一个scrapy.http.Response对象代表了一个HTTP相应,通常是被下载器下载后得到,并交给Spider做进一步的处理。Response也有很多默认的子类,用于表示各种不在基本HtmlResponse此类是TextResponseHTML的metahttp-equiv属性实现了编码自动发现XmlResponse此类是TextResponseXML声明实现编码自动••7教程07-内置服Scrapy使用PythonLOG_ENABLED=trueLOG_ENCODING="utf-8"LOG_LEVEL=logging.INFOLOG_FILE="log/spider.log"LOG_STDOUT=TrueLOG_FORMAT="%(asctime)s[%(name)s]%(levelname)s:%(message)s"LOG_DATEFORMAT="%Y-%m-%d%H:%M:%S"importlogger=logging.getLogger(name)logger.warning("Thisisawarning")如果在Spider里面使用,那就更简单了,因为loggerimportclassname=importlogger=logging.getLogger(name)logger.warning("Thisisawarning")如果在Spider里面使用,那就更简单了,因为loggerimportclassname=start_urls=defparse(self,('Parsefunctioncalledons,7.1发送Scrapy发送email基于Twistednon-blockingIOmailer=milr.send(to=["sne@e"],subject="Somesubject",␣,→body",配MAIL_FROM='scrapy@localhost'MAIL_HOST='localhost'MAIL_PORT=25MAIL_USER=""MAIL_PASS=""MAIL_TLS=FalseMAIL_SSL=False7.2同一个进程运行多个importfromscrapy.crawlerimportclass#Yourfirstspiderclass#class#Yourfirstspiderclass#Yoursecondspiderprocess=CrawlerProcess()process.start()#thescriptwillblockhereuntilallcrawlingjobs7.3分布式爬 spider,最简单的方式就是启动多个Scrapydspider分如果你想多个机器运行同一个spider,可以将url分片后交给每个机器上面的spider。比如你把URL分成3份m然后运行3个Scrapyd实例,分别启动它们,并传递partcurl,→spider=spider1-dcurl,→spider=spider1-dcurl,→spider=spider1-d7.4防止被封的策一些网站实现了一些策略来禁止爬虫来爬取它们的网页。有的比较简单,有的相当复杂,如果你需要详细了解可以咨询商业支持useragent池。也就是每次发送的时候随机从池中选择不一样的浏览器头信禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识设置download_delay下载延迟,数字设置为5如果有可能的话尽量使用禁止Cookie,某些网站会通过Cookie识别用户身份,禁用后使得服务器无法识设置download_delay下载延迟,数字设置为5如果有可能的话尽量使用GooglecacheIP池,例如免费的Torproject或者是付费的Crwlera••••8Scrapy教程08-文件与图Scrapy为我们提供了可重用的itempipelines为某个特定的Item去下载文件。通常来说你会选择使用FilesPipeline或ImagesPipeline。(文件系统目录中,AmazonS3中)ImagesPipeline为处理图片提供了额外的功能:JPGRGB••URL列表,然后将包含相同媒体的相应关联到这个队列上来,从而防止了多个item共享这个媒体时重复下载。8.1使用Files在某个Spider中,你爬取一个item后,将相应的文件URL放入file_urls字itemitem当这个item到达FilesPipeline时,在file_urls字段中的URL列表会通过就被处理。而这个item会一直在这个pipeline中被锁定,直到所有的文件下载当文件被下载完之后,结果会被赋值给另一个files字段。这个字段包含一个关于下载文件新的字典列表,比如下载路径,源地址,文件校验码。files里面的顺序和file_url顺序是一致的。要是某个写文件下载出错就不会出现在这个files8.2使用ImagesImagesPipeline跟FilesPipeline的使用差不多,不过使用的字段名不一样,image_urls保存图片URL地址,images8.2使用ImagesImagesPipeline跟FilesPipeline的使用差不多,不过使用的字段名不一样,image_urls保存图片URL地址,images使用ImagesPipeline的好处是你可以通过配置来提供额外的功能,比如生成文件缩ImagesPipeline使用Pillow来生成缩略图以及转换成标准的JPEG/RGB格式。因此你需要安装这个包,我们建议你使用Pillow而不是PIL。8.3使用例#同时使用图片和文件管ITEM_PIPELINES='scrapy.pipelines.images.ImagesPipeline': }FILES_STORE='/path/to/valid/dir'#文件存储路径IMAGES_STORE='/path/to/valid/dir'#图片存储路径#90daysofdelayforfilesexpirationFILES_EXPIRES=90#30daysofdelayforimagesIMAGES_EXPIRES=#图片缩略IMAGES_THUMBS='small':(50,'big':(270,}#图片过滤器,最小高度和宽IMAGES_MIN_HEIGHT=IMAGES_MIN_WIDTH=44i4Item返回时,有file_urls或image_urls,并且存在相应的images字段或importclass#...otheritemfieldsimage_urls=scrapy.Field()images=scrapy.Field()8.4自定义媒体image_urls=scrapy.Field()images=scrapy.Field()8.4自定义媒体管如果你还需要更加复杂的功能,想自定义下载媒体逻辑,请参考扩展媒体管不管是扩展FilesPipeline还是ImagesPipeline都只需重写下面两个get_media_requests(self,item,info),返回一个Requestitem_completed(self,results,item,info),当上门的回调这个方法,然后填充files或images下面是一个扩展ImagesPipelinepath字段,而不是默认的images•importfromscrapy.pipelines.imagesimportfromscrapy.exceptionsimportclassdefget_media_requests(self,item,info):forimage_urlinitem['image_urls']:yieldscrapy.Request(image_url)defitem_completed(self,results,item,info):image_paths=[x['path']forok,xinresultsifok]ifnotimage_paths:raiseDropItem("Itemcontainsnoimages")item['image_paths']=image_pathsreturn9Scrapy教程09-部本篇主要介绍两种部署爬虫的方案。如果仅仅在开发调试的时候在本地部署跑起来是ScrapydScrapyCloud9.1部署到Scrapyd是一个开源软件,用来运行蜘蛛爬虫。它提供了HTTPAPI要部署爬虫到Scrapyd,需要使用到scrapyd-client部署工具集,下面我演示下部署的步Scrapyddaemon要部署爬虫到Scrapyd,需要使用到scrapyd-client部署工具集,下面我演示下部署的步Scrapyddaemonspiderspider创建一个进程执行scrapycrawlmyspider,同时Scrapyd还能以多进程方式启动,通过配置max_proc和max_proc_per_cpu选项安pippipinstall在ubuntuapt-g

温馨提示

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

评论

0/150

提交评论