scrapy分页抓取网页( Scrapy从基本原理上来讲很简单的可以直接用正则表入党积极分子)

优采云 发布时间: 2021-10-23 02:19

  scrapy分页抓取网页(

Scrapy从基本原理上来讲很简单的可以直接用正则表入党积极分子)

  

  Scrapy轻松定制网络爬虫随机爬取有一定目的,爬取时采集一些信息。例如,谷歌有很多爬虫采集互联网上的信息以及它们之间的链接。例如,一些别有用心的爬虫会在互联网上采集信息。foob​​arcom 或者 foo[at]bar[dot]com 之类的东西,除了一些专门针对某个网站的自定义爬虫,比如前段时间JavaEye的Robbin写了几篇专门对付恶意的文章 原文链接爬虫的博客好像过期了,不会给了。还有诸如小众软件或者LinuxToy网站经常被整个站点爬下来改名挂掉。其实,爬虫的基本原理非常简单。只要能访问网络和分析网页,*敏*感*词*现值系数表达式,所以做一个最简单的网络爬虫其实是一件很简单的事情,但是要实现一个高质量的蜘蛛却是非常困难的。爬虫的两个部分。首先是下载网页。有很多问题。乘法。口头算术。100个问题。七年级。有理数。混合操作。应用问题 真心话大冒险刺激问题。您需要考虑如何最大限度地利用本地带宽。如何调度不同站点的Web请求,以减轻其他服务器的负担。高性能 WebCrawler 系统中的 DNS 查询也将成为需要优化的瓶颈。有一些规则需要遵守,比如robotstxt,获取网页后的分析过程也很复杂。互联网上有很多奇怪的事情。有各种带有各种错误的 HTML 页面。分析所有这些几乎是不可能的。另外,随着AJAX的流行,如何获取Javascript动态生成的内容也成为了一个大问题。此外,互联网上还有各种有意或无意出现的SpiderTraps。如果一味的跟着超链接走,就会掉入陷阱。比如这个网站,据说谷歌之前宣称互联网上UniqueURL的数量已经达到1万亿,所以这个人很自豪的宣布第二万亿。但实际上,像谷歌这样需要成为通用爬虫的人并不多。通常我们构建一个爬虫来爬取某个特定的或者某个像网站 所谓知己知彼,我们可以对需要爬取的网站结构提前做一些分析,它变得容易多了。通过分析和选择有价值的链接进行跟踪,我们可以避免许多不必要的链接。或者SpiderTrap if 网站如果结构允许选择合适的路径,我们就可以按照一定的顺序爬取感兴趣的东西。这样,连URL重复的判断都可以省略。例如,如果我们想通过观察爬下 Pongba 的 blogmindhackscn 中的博客文字,很容易发现我们对其中两个页面感兴趣。1 文章 列表页面,如首页或URL被分页的页面。通过Firebug可以看到文章的每一个链接都在一个h1下。需要注意的是,Firebug 的 HTML 面板中看到的 HTML 代码可能与 ViewSource 中看到的有些不同。如果网页中的 DOM 树是通过 Javascript 动态修改的,则前者是修改后的版本,已经通过了 Firebug。规则、素材编码规则、三大议事规则、文件编号规则、乒乓球比赛规则、不规则动词,例如属性有引号等,后者通常是你的蜘蛛爬取的原创内容。如果您使用正则表达式分析页面或者使用的 HTMLParser 和 Firefox 之间是否存在一些差异,则需要特别注意。另外,在一个带有 wp-pagenavi 类的 div 中还有指向不同列表页面的链接。2文章内容页面每个博客都有这样一个页面,比如20080911machine-learning-and-ai-resources收录了完整的文章内容。这就是我们感兴趣的。所以我们从首页开始,利用wp-pagenavi中的链接获取其他文章列表页面,特别是我们定义了一个只链接到followNextPage的路径,这样我们就可以通过它是为了从头到尾避免判断重复爬行的麻烦。另外,列表页面上那些到具体文章链接对应的页面,就是我们真正要保存的数据页面。用它实用的脚本语言写一个adhoc Crawler来完成这个任务并不难,但是今天的主角是Scrapy,它是一个用Python编写的CrawlerFramework,简单轻量而且非常方便,官网说已经实际生产中使用,所以不是玩具级别的东西。但是,目前还没有 Release 版本。可以直接使用他们的 Mercurial 仓库抓取源码进行安装。不过这个东西也可以直接安装。使用它随时更新文档也很方便。我不会重复。Scrapy 使用 Twisted,一个异步网络库来处理网络通信。架构清晰,收录各种中间件接口,可以灵活完成各种需求。整体架构如下图所示。绿线是数据流向。首先,调度器会将其交给下载器进行下载,并从初始 URL 下载。然后,将其交给Spider进行分析。Spider分析的结果有两种。一是需要进一步爬取的链接。一个页面链接,这些东西会被发回Scheduler,另外一个是需要保存的数据,它们被发送到ItemPipeline,这是对数据进行后处理,详细分析,过滤,存储,等。此外,它可以安装在数据流通道中。各种中间件的必要处理好像很处理好像很处理好像很 调度程序会将其交给下载程序进行下载并从初始 URL 下载。然后,将其交给Spider进行分析。Spider分析的结果有两种。一是需要进一步爬取的链接。一个页面链接,这些东西会被发回Scheduler,另外一个是需要保存的数据,它们被发送到ItemPipeline,这是对数据进行后处理,详细分析,过滤,存储,等。此外,它可以安装在数据流通道中。各种中间件的必要处理好像很处理好像很处理好像很 调度程序会将其交给下载程序进行下载并从初始 URL 下载。然后,将其交给Spider进行分析。Spider分析的结果有两种。一是需要进一步爬取的链接。一个页面链接,这些东西会被发回Scheduler,另外一个是需要保存的数据,它们被发送到ItemPipeline,这是对数据进行后处理,详细分析,过滤,存储,等。此外,它可以安装在数据流通道中。各种中间件的必要处理好像很处理好像很处理好像很 Spider分析的结果有两种。一是需要进一步爬取的链接。一个页面链接,这些东西会被发回Scheduler,另外一个是需要保存的数据,它们被发送到ItemPipeline,这是对数据进行后处理,详细分析,过滤,存储,等。此外,它可以安装在数据流通道中。各种中间件的必要处理好像很处理好像很处理好像很 Spider分析的结果有两种。一是需要进一步爬取的链接。一个页面链接,这些东西会被发回Scheduler,另外一个是需要保存的数据,它们被发送到ItemPipeline,这是对数据进行后处理,详细分析,过滤,存储,等。此外,它可以安装在数据流通道中。各种中间件的必要处理好像很处理好像很处理好像很 它可以安装在数据流通道中。各种中间件的必要处理好像很处理好像很处理好像很 它可以安装在数据流通道中。各种中间件的必要处理好像很处理好像很处理好像很

  

  很简单实用,就像Rails一样。首先新建一个项目scrapy-adminpystart项目blog_crawl会创建一个blog_crawl目录,整个项目有scrapy-ctlpy控制脚本,代码全部放在子目录blog_crawl下,以便能够爬取mindhackscn。在spiders目录下新建一个mindhacks_spiderpy来定义我们的spider如下 fromscrapyspiderimportBaseSpiderclassMindhacksSpiderBaseSpiderdomain_name"mindhackscn"start_urls["httpmindhackscn"]defparseselfresponsereturn[]SPIDERMindhacksSpider 我们的MindhacksSpider继承自BaseSpider,通常直接继​​承自BaseSpider的特性,通常是直接从more-trichSpiderscrapids继承 这样更方便。但是为了展示数据是如何解析的,这里使用了BaseSpider。变量 domain_name 和 start_urls 很容易理解它们的含义和解析方法 二重积分的计算方法 84 消毒液的配比方法 愚人节 全人法 *敏*感*词*流量表编制方法 求和的七种方法序号是我们需要定义的回调函数,默认请求在得到响应后会调用这个回调函数。我们需要解析这里的页面返回两个结果。需要进一步爬取的链接和需要保存的数据让我觉得有点奇怪,它的接口定义中的两个结果居然混在了一个列表中。不清楚为什么在这里。到底是不是要努力把他们分开?简而言之,让我们写一个空函数,只返回一个空列表。另外,我们定义了一个全局变量 SPIDER,在 Scrapy 导入这个模块的时候会实例化,并且会被 Scrapy 引擎自动找到。可以先运行爬虫,试试scrapy-ctlpycrawlmindhackscn。会有一堆输出。可以看到爬取了httpmindhackscn,因为这是初始URL,但是因为我们在parse函数中没有返回需要进一步爬取的URL,所以只爬取了整个爬取过程。主页结束了。下一步是分析页面。Scrapy 提供了一个非常方便的 Shell。需要 IPython 才能让我们做实验。使用以下命令启动 Shellscrapy-ctlpyshell httpmindhackscn。它将启动爬虫并抓取命令行指定的页面。进入shell并按照提示操作。我们有很多现成的变量可以使用。其中之一是 hxs,它是 HtmlXPathSelectormindhacks 的 HTML 页面。是比较规范的波形梁钢护栏护理文件编写规范。操作流程规范。*敏*感*词*验收规范。医疗文件书写规范可以非常方便和直接。使用 XPath 进行分析。通过Firebug可以看到每个博客文章的链接都在h1下,所以用这样的XPath表达式壳牌测试在文献[1] hxsxh1ahrefextractOut [1] [uhttpmindhackscn20090706why任您应该-DO-IT-yourselfuhttpmindhackscn20090517seven年合njuuhttpmindhackscn20090328effective学习和-memorizationuhttpmindhackscn20090315preconception-explaineduhttpmindhackscn20090309first原理-OF-programminguhttpmindhackscn20090215why-你,应该启动 - 博客 - nowuhttpmindhackscn20090209writing就是更好-thinkinguhttpmindhackscn20090207better解释的 - 冲突 - 在亲密-relationshipuhttpmindhackscn20090207independence-dayuhttpmindhackscn20090118escape从 - 您-肖申克的,第一部分]这正是我们所需要的URL。另外,我们可以在一个div中找到下一页的链接和其他几个页面的链接,但是下一页的链接没有title属性所以XPath写成div[class" 但看起来这是一个unicodeescape字符,因为编码原因不清楚。最终解析函数判断如下: defparseselfresponseitems[]hxsHtmlXPathSelectorresponsepostshxsxh1ahrefextractitemsextend[selfmake_requests_from_urlreplacecallbackselfparse_postforurlinposts]page_avilink"xsxdiv[class] 但看起来这是一个unicodeescape字符,因为编码原因不清楚。最终解析函数判断如下: defparseselfresponseitems[]hxsHtmlXPathSelectorresponsepostshxsxh1ahrefextractitemsextend[selfmake_requests_from_urlreplacecallbackselfparse_postforurlinposts]page_avilink"xsxdiv[class]

  

  npage_linksiflinkxtextextract[0]uxbburllinkxhrefextract[0]itemsappendselfmake_requests_from_urlurlreturnitems 前半部分是解析需要爬取的博客正文的链接。后半部分是给出下一页的链接。需要注意的是,这里返回的列表不是字符串格式。网址结束。Scrapy希望得到的是Request对象,它可以承载比字符串格式的URL更多的东西,比如cookies或者回调函数。可以看到我们在创建博客正文的Request时替换了回调函数。因为默认的回调函数parse是专门用来解析文章对于列表这样的页面的,所以parse_post定义如下:defparse_postselfresponseitemBlogCrawlItemitemurlunicoderesponseurlitemrawresponsebody_as_unicodereturn[item] 返回一个BlogCrawlItem并将捕获的数据放入其中非常简单。在这里我可以做一些分析,比如通过XPath解析文本和标题,但我倾向于稍后再做。这些东西,例如 ItemPipeline 或以后的 Offline 阶段。BlogCrawlItem 是 Scrapy 自动为我们定义的一个空类,继承自 ScrapedItem。在itemspy中,我添加了一些fromscrapyitemimportScrapedItemclassBlogCrawlItemScrapedItemdef__init__selfScrapedItem_self_self_self_returnBlog url_self_self_self_self_self_returnBlog_url_def__str__self_self_self_return_self_self_self_return_Blog def__str_returnself_self_str 函数,所以当你看到所有的数据时,会显示__str_returnself_self_self_str函数,控制台日志会疯狂地输出内容。即输出爬取的网页内容-bb,让数据取到最后,只留下 存储数据的功能,通过添加Pipeline来实现。由于Python在标准库中自带Sqlite3支持,所以我使用Sqlite数据库来存储数据。更换pipelinespy的用下面的代码内容:622324252627282930313233selfinitializesignalsengine_starteddispatcherconnectselffinalizesignalsengine_stoppeddefprocess_itemselfdomainitemselfconnexecuteinsertintoblogvaluesitemurlitemrawunicodedomainreturnitemdefinitializeselfifpathexistsselffilenameselfconnsqlite3connectselffilenameelseselfconnselfcreate_tableselffilenamedeffinalizeselfifselfconnisnotNoneselfconncommitselfconncloseselfconnNonedefcreate_tableselffilenameconnsqlite3connectfilename34353637connexecute“ 总结一下,一个高质量的爬虫是一个极其复杂的项目,但是如果你有一个好的工具,做一个专用的爬虫就容易多了。Scrapy 非常容易。轻量级的爬虫框架大大简化了爬虫开发的流程。另外,Scrapy的文档也很详细。如果你觉得我的介绍不够清楚,推荐阅读他的教程。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线