网络爬虫
文章平均质量分 58
bluespacezero
这个作者很懒,什么都没留下…
展开
-
向scrapy中的spider传递参数的几种方法
有时需要根据项目的实际需求向spider传递参数以控制spider的行为,比如说,根据用户提交的url来控制spider爬取的网站。在这种情况下,可以使用两种方法向spider传递参数。第一种方法,在命令行用crawl控制spider爬取的时候,加上-a选项,例如:scrapy crawl myspider -a category=electronics然后在spider里这样写:原创 2016-02-26 11:55:37 · 42706 阅读 · 7 评论 -
Scrapy设置之Downloading media
Scrapy提供了一些可重用的Item Pipeline来下载与 Item相关的文件。例如,当在抓取某个商品的信息时,可能也想把它的图片下载下来。这些Pipeline的功能和结构都有些类似(我们把它们叫做Media Pipeline),但最常用的是Images Pipeline和Files Pipeline。这两种Pipeleine都有如下特点:可以避免重复下载。可以指定存储位置,如本地文件系原创 2016-04-10 18:18:27 · 3285 阅读 · 0 评论 -
Scrapy设置之Using proxies and crawlers
Unix系统中,Scrapy的HttpProxyMiddleware中间件可以根据环境变量http_proxy、https_proxy和no_proxy来设置爬虫的代理。也可以在每个请求的meta属性中的proxy键来设置该请求的代理,比如http://some_proxy_server:port。原创 2016-04-10 19:54:39 · 1164 阅读 · 0 评论 -
Scrapy设置之深入
Scrapy使用一些后辍为_BASE的设置项来存储框架扩展的默认值(比如FEED_EXPORTERS_BASE),可以在settings.py文件或者命令行用不加_BASE后辍的设置项来设置它们(比如FEED_EXPORTERS)。Scrapy用DOWNLOADER或者SCHEDULER设置项设置了这些系统必要的组件的类或包的名字。可以从默认的下载器(scrapy.core.downloader.D原创 2016-04-11 12:57:06 · 1820 阅读 · 0 评论 -
Scrapy设置之自定义命令
COMMANDS_MODULE允许开发者自定义命令,假设工程名字为properties,在工程的根目录有一个hi.py文件内容如下:from scrapy.commands import ScrapyCommandclass Command(ScrapyCommand): default_settings = {'LOG_ENABLED': False} def run(self,原创 2016-04-08 12:38:34 · 2038 阅读 · 0 评论 -
解决Scrapy性能问题——案例五(Item并发太多导致溢出)
症状:爬虫对于每个Response都产生了多个Item,系统的吞吐量比期望的要低,并且可能会出现和前一个案例相同的下载器开/关现象。示例:这里我们假设有1000个请求,每个返回的页面有100个Item,响应时间为0.25s,Item在pipeline中的处理时间为3s。分别把CONCURRENT_ITEMS设置成从10到150的值来运行爬虫:for concurrent_items in 10 20原创 2016-04-27 16:13:43 · 8375 阅读 · 0 评论 -
解决Scrapy性能问题——案例六(下载器中请求太少)
症状:增加了CONCURRENT_REQUESTS,但是下载器并没有得到充分的利用,调度器也是空的。示例:首先来运行一个没有这种问题的例子,把响应时间设置成1s,这样可以简化下载器吞吐量的计算:T = N/S = N/1 = CONCURRENT_REQUESTS。$ time scrapy crawl speed -s SPEED_TOTAL_ITEMS=500 \-s SPEED_T_RESP原创 2016-04-28 11:44:25 · 6038 阅读 · 0 评论 -
Scrapy性能调优及检测性能问题的步骤
前面已经说过,Scrapy的瓶颈被设置在下载器这个地方。要获得最高的性能,可以从一个低的CONCURRENT_REQUESTS开始,一直增加这个值,直到达到了以下某个限制:CPU使用率达到80-90%目标网站的延迟显著上升scraper(即爬虫和pipeline)中的所有Response对象占用的总内存大小不超过5MB同时还要保证以下条件:在任何时候都要保证调度器的队列(mqs/dqs)中原创 2016-04-28 11:55:04 · 4900 阅读 · 0 评论 -
Scrapy架构概览
下面的图总结了Scrapy的架构: 你或许已经注意到这个架构主要操作的三种数据类型——Request、Response和Item,而爬虫处于架构的核心位置,它们产生Request,处理Response并且产生Item和更多的Request。每个由爬虫产生的Item都会被一个序列的Item Pipeline用它们的process_item()进行后处理。通常情况下,process_item()方法修原创 2016-04-18 15:31:17 · 1340 阅读 · 0 评论 -
Scrapy之信号
信号提金了一种机制,可以让事件发生时调用该事件的回调函数,例如,当爬虫开启,或者当抓取到了一个Item。你可以通过crawler.signals.connect()方法来把它们和回调函数关联起来。Scrapy共有11个信号,或许理解它们的最简单的方式就是在实例中观察它们。这时创建了一个爬虫的工程,主要目的就是记录了每次的方法调用。爬虫本身比较简单,只是yield了两个Item然后抛出一个异常,并且在原创 2016-04-18 16:15:02 · 3583 阅读 · 0 评论 -
Scrapy之Extension实例——计算吞吐量及时延
Scrapy已经有一个extension是用于测量吞吐量的——Log Stats extension,我们就以它为起点。为了计算时延,我们关联了request_scheduled、response_received和item_scaped信号。我们给每个信号发生时打上时间戳并相减以计算时延,再累积平均以计算平均值。通过观察这三个信号提供给回调函数的参数可以发现,item_scaped只提供了Resp原创 2016-04-19 10:32:38 · 3506 阅读 · 0 评论 -
Scrapy Pipeline之使用REST API
REST是一种用来创建现代web应用的一系列技术的集合。它最主要的优势就是它比SOAP或者其他一些专有的web服务机制要更加简单、更加地轻量级。软件设计者们观察到了在web服务经常提供的CRUD(Create,Read,Update,Delete)功能和基本的HTTP操作(GET,POST,PUT,DELETE)之间的相似性。他们也观察到了很多用于web服务的信息都可以被压缩到一个资源URL上。例如原创 2016-04-19 14:28:58 · 4024 阅读 · 0 评论 -
Scrapy Pipeline之与数据库交互
有很多数据库符合Python Database API规范2.0,例如MySQL,PostgreSQL,Orcale,Microsoft SQL Server和SQLite。它们的驱动是很复杂的并且经过了很多测试,如果再为了Twisted重新实现就太浪费了。你可以在Twisted应用中使用这些数据库客户端,例如,Scrapy就使用了twisted.enterprise.adbapi库。我们会用MyS原创 2016-04-21 14:41:16 · 9618 阅读 · 1 评论 -
Scrapy Pipeline之使用专门的Twisted客户端(以Redis缓存为例)
Scrapy可以和其他使用了专门的Twisted的客户端交互,例如,如果我们想把它和MongoDB一起使用,搜索一下”MongoDB Python”,然后会找到PyMongo,这是个阻塞/同步的库,不应该和Twisted一起使用,除非我们还使用了线程来处理阻塞的操作。如果我们搜索一下”MongoDB Twisted Python”,会找到txmongo,它和Twisted及Scrapy就配合得很好。原创 2016-04-21 16:33:12 · 3379 阅读 · 0 评论 -
Scrapyjs Splash不下载图片来加快响应速度
splash的render.html端点有一个选项是images,是一个整数,可以是1或者0,1代表下载图片,0代表不下载图片,默认值是1,可以通过设置为0,这样在下载网页的时候就可以不下载图片,以加快响应的速度。原创 2016-05-16 20:43:21 · 2209 阅读 · 1 评论 -
Scrapy Pipeline之处理CPU密集型或阻塞型操作
Twisted框架的reactor适合于处理短的、非阻塞的操作。但是如果要处理一些复杂的、或者包含阻塞的操作又该怎么办呢?Twisted提供了线程池来在其他的线程而不是主线程(Twisted的reactor线程)中执行慢的操作——使用reactor.callInThread() API。这就意味着reactor在执行计算时还能保持运行并对事件做出反应。一定要记住线程池中的处理不是线程安全的。这就意味原创 2016-04-22 19:26:54 · 5863 阅读 · 1 评论 -
Splash Scrapyjs Connection was refused by other side: 111: Connection refused.
在爬虫中设置了一个Splash代理来解析JS,有时莫名其妙出现这个错误,一开始以为是ip被对方封了,最后发现是服务器上设置的代理不知为什么停止运行了。重新运行起来就好了。原创 2016-05-18 22:13:13 · 5803 阅读 · 1 评论 -
Scrapy设置之Feeds
Scrapy提供了Feed Exports来保存抓取到的Item,Feed Exports有几种序列化格式和几种存储方式。存储方式:本地文件系统、FTP、S3、标准输出。由FEED_URI选项指定。FEED_URI里面可以有命令参数,例如,ftp://user:password@ftp.example.com/scraping/feeds/%(name)s/%(time)s.json其中,time由原创 2016-04-10 11:42:55 · 3969 阅读 · 0 评论 -
Scrapy设置之Crawling style
Scrapy可以设置优先抓取哪些网页,设置DEPTH_LIMIT可以控制抓取的最大深度,如果设为0则意味着没有限制。把DEPTH_PRIORITY(默认值为0)设置为一个正值后,Scrapy的调度器的队列就会从LIFO变成FIFO,因此抓取规则就由DFO(深度优先)变成了BFO(广度优先):DEPTH_PRIORITY = 1SCHEDULER_DISK_QUEUE = 'scrapy.squeu原创 2016-04-10 10:29:47 · 4506 阅读 · 0 评论 -
解决Scrapy性能问题——案例四(响应太多导致溢出)
症状:下载器几乎是在满负荷工作,然后过一会就关闭了。然后一直重复这样,而scaper占用的内存很多。示例:这里我们和之前的设置是一样的(也使用了treq),但是响应的大小被设置成了120kb的HTML。正如你所看到的,它一共花费了31s而不是20s:$ time scrapy crawl speed -s SPEED_TOTAL_ITEMS=1000 -sSPEED_T_RESPONSE=0.25原创 2016-04-26 20:24:39 · 7030 阅读 · 5 评论 -
使用Scrapy抓取需要登录的网站
经常在爬有些网站的时候需要登录,大多数网站需要你提供一个用户名和密码,在这种情况下,需要先向网站发送一个POST请求。可以使用Scrapy的FormRequest类,这个类和Request类很相似,只是多了一个extra参数,用这个参数可以传递表单数据。要使用这个类,先导入:from scrapy.http import FormRequest然后把start_urls替换成start_reques原创 2016-04-01 16:51:55 · 13367 阅读 · 0 评论 -
scrapy处理JSON API
有时候你会发现你需要的数据在原始的HTML页面上找不到。比如下面这种情况:右击查看元素会看到一个普通的DOM树,但是用scrapy shell或右击选择查看源代码的时候,会发现源代码中没有任何信息。在这种情况下,可以F12打开开发者工具,选择Network界面,在左边的列表里就能看到浏览器为加载此页面而发出的所有请求。这里有三项:static/已经看过了(URL就是),jquery.min.js是一原创 2016-04-07 10:54:38 · 4057 阅读 · 0 评论 -
scrapy用不同规则抓取多个网站(基于csv文件)以及向爬虫传递参数(参数可默认)
大多数情况下每个网站对应一个爬虫,但是也有很多时候需要一个爬虫抓取多个网站,而它们之间的唯一区别只是XPath表达式不同。在这种情况下,对应每个网站编写一个爬虫有些大材小用,只需一个爬虫即可解决。首先创建一个.csv文件 ,按照下图填写一些url和XPath表达式,保存为todo.csv并放到工程的目录(也就是scrapy.cfg文件所在的目录)。Python有一个内建的库专门处理.csv文件,需引原创 2016-04-07 14:45:59 · 8371 阅读 · 2 评论 -
scrapy一些非常实用资料整理,与其他mongdb、django、redis、solr、tor结合使用以及用Python脚本调用等等方法
非常实用的scrapy实战资料整理,包括与各种其他工具的结合使用原创 2016-04-08 12:03:09 · 1422 阅读 · 0 评论 -
Scrapy引擎
并行系统和管道系统很类似,在计算机科学中,我们用队列符号来代表队列和正被处理的元素(图1的左边部分)。排队系统的一个基础的定律就是Little定律,即系统达到平衡时,系统中元素的个数(N)等于系统的吞吐量乘以总的排队时间(S),N = T · S。 对于管道的几何问题也有一个相似的规律(图1的右边部分)。管道的容量(V)等于管道的长度(L)乘以它的截面积(A),V = L · A。如果用长度代表服原创 2016-04-25 14:27:52 · 6038 阅读 · 0 评论 -
Scrapy使用telnet查看组件的利用率
Scrapy运行的有telnet服务,我们可以通过这个功能来得到一些性能指标。通过telnet命令连接到6023端口,然后就会得到一个在爬虫内部环境的Python命令行。要小心的是,如果你在这里运行了一些阻塞的操作,比如time.sleep(),正在运行的爬虫就会被中止。通过内建的est()函数可以打印出一些性能指标。打开第一个命令行,运行以下代码:$ pwd/root/book/ch10/spe原创 2016-04-25 15:20:27 · 3712 阅读 · 0 评论 -
Scrapy设置之Analysis
Analysis: 通过修改这些设置项,可以配置Scrapy通过logs、statistics和telnet来提供性能和调试信息的方式。Logging:根据严重程度的不同,Scrapy有几种级别的日志:DEBUG(最低级别)、INFO、WARNING、ERROR和CRITICAL(最高级别)。除此之外还有一个SILENT级别,这个级别不会有任何日志输出。把LOG_LEVEL设置成某个级别,然后就原创 2016-04-08 22:22:05 · 8046 阅读 · 0 评论 -
Scrapy实战之抓取ajax网站
目标网站为http://www.ccgp-hubei.gov.cn,经检查HTML代码发现这个网页有一个iframe,iframe里面的内容才是网站的真正有用的内容,所以第一步是要先找到真正的URL。以http://www.ccgp-hubei.gov.cn/fnoticeAction!listFNotice.action为例,这个网址的主要结构是一个分页的列表,有上页、下页等等。查看这两个按钮的H原创 2016-04-13 12:27:06 · 6827 阅读 · 1 评论 -
Scrapy设置之Performance概览
性能方面的设置选项可以让我们根据工作量来调整爬虫的性能。CONCURRENT_REQUESTS设置了最多可以同时处理的请求数目,它保护了你机器的输出带宽不超出负载,以防程序在同时爬很多个不同的站点(域名/IP)。不过除非是这种情况,一般而言还是CONRRENT_REQUEST_PER_DOMAIN和CONCURRENT_REQUEST_PER_IP更加有用。如果CONCURRENT_REQUEST_原创 2016-04-09 12:59:01 · 3804 阅读 · 0 评论 -
Scrapy设置之提前终止爬虫
Scrapy的CloseSpider扩展会在满足条件时自动终止爬虫程序。可以设置CLOSESPIDER_TIMEOUT(秒)、CLOSESPIDER_ITEMCOUNT、CLOSESPIDER_PAGECOUNT、CLOSESPIDER_ERRORCOUNT分别代表在指定时间过后、在抓取了指定数目的Item之后、在收到了指定数目的响应之后、在发生了指定数目的错误之后就终止爬虫程序。通常情况下可以在命原创 2016-04-09 13:31:51 · 12012 阅读 · 0 评论 -
Scrapy设置之HTTP缓存与离线工作
Scrapy的HttpCacheMiddleware组件(默认情况下没有启用)提供了一个底层(low-level)的对HTTP请求和响应的缓存。如果启用的话(把HTTPCACHE_ENABLED设置为True),它会缓存每个请求和对应的响应。这个组件有两个可选项:缓存策略和存储位置。缓存策略:Dummy policy(默认):这种策略不考虑服务器返回的HTTP Cache-Control指示,它会原创 2016-04-09 16:01:04 · 7333 阅读 · 0 评论 -
Scrapy性能分析
之前讲过(这里),当Scrapy正常运行时,下载器是瓶颈。在这种情况下,你会看到调度器中有一些请求,下载器中的并发请求数目已经达到最大值,而scraper(爬虫和pipeline)的负载比较轻,正在处理的Response对象数目也不会一直增长。主要有三个设置项来控制下载器的容量:CONCURRENT_REQUESTS,CONCURRENT_REQUESTS_PER_DOMAIN和 CONCURRE原创 2016-04-25 20:16:38 · 16111 阅读 · 0 评论 -
Scrapy与Twisted
Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码。在任何情况下,都还要写阻塞的代码。阻塞的代码包括:访问文件、数据库或者Web产生新的进程并需要处理新进程的输出,如运行shell命令执行系统层次操作的代码,如等待系统队列Twisted提供了允许执行上面的操作但不会阻塞代码执行的方法。至于Twisted异步代码与多线程代码的比较可以原创 2016-04-11 17:57:47 · 6905 阅读 · 2 评论 -
解决Scrapy性能问题——案例一(CPU饱和)
症状:有时你增加并发水平,但是性能没有增长。下载器的利用也很充分,但是似乎每个请求的平均时间都很长。在Unix/Linux上使用top命令或者在Power Shell上使用ps或者在Windows上面使用任务管理器时,发现发现CPU的负载很高。示例:假设你运行了以下的命令:$ for concurrent in 25 50 100 150 200; do time scrapy crawl原创 2016-04-26 14:39:16 · 7528 阅读 · 0 评论 -
解决Scrapy性能问题——案例二(含有阻塞的代码)
症状:系统非常慢,与期望的相差很大,并且当你修改CONCURRENT_REQUESTS的值的时候,速度并没有发生变化。下载器看起来几乎是空的(比CONCURRENT_REQUESTS的值要小),scraper中只有少量一些Response对象。示例:你可以使用这两个设置项(爬虫代码见这里):SPEED_SPIDER_BLOCKING_DELAY和SPEED_PIPELINE_BLOCKING_DEL原创 2016-04-26 16:11:26 · 6340 阅读 · 0 评论 -
解决Scrapy性能问题——案例三(下载器中的“垃圾”)
症状:系统的吞吐量比较期望的要小,并且下载器中的Request对象有时看起来比CONCURRENT_REQUESTS还要多。示例:我们使用0.25秒的下载延迟来模仿下载1000个网页,默认的并发水平是16个,根据前面的公式,大概需要花19s的时间。我们在一个pipeline中使用crawler.engine.download()来发起一个额外的HTTP请求到 一个假的API,这个请求的响应需要1s的原创 2016-04-26 18:21:32 · 3743 阅读 · 0 评论 -
Scrapyjs Splash KeyError 'splash'
在爬虫中使用了response.meta['splash']['args']['url']的方法来获取原始的请求的url,在本地运行时一切正常,但是一部署到服务器上面就出现KeyError 'splash'这样的错误。通过在爬虫中加上日志,记录下response.meta中的内容:logger.info("response.meta: %s", response.meta),可以在日志中看到:[my原创 2016-05-18 23:02:54 · 1643 阅读 · 0 评论