scrapy爬虫框架介绍

 

一为什么选择scrapy

 

  通过这一篇博客,我致力于对scrapy进行简单的介绍和简单的网页WEB数据抓取能力.Scrapy是一个健壮的web框架,用于从各种数据源抓取数据。

  作为一个普通的web用户,您经常会发现自己希望能够通过Excel之类的电子表格程序从正在浏览的网站上获取数据(参见第3章基本爬行),以便在脱机或执行计算时访问这些数据。

  作为开发人员,您常常希望能够组合来自各种数据源的数据,但是您很清楚检索或提取这些数据源的复杂性。Scrapy可以帮助您完成简单和复杂的数据提取活动。

  

  1.处理残缺的HTML

    您可以直接从Scrapy使用Beautiful Soup或lxml,但是Scrapy提供了选择器——lxml之上的高级XPath(主要)接口。它能够有效地处理损坏的HTML代码和混乱的编码。

 

  2.社区

    拥有一个强大的社区,在stack overflow上面 http://stackoverflow.com/questions/tagged/scrapy,基本能够在几分钟内解决你提出的问题.更多的社区信息可以访问 http://scrapy.org/community/.

 

  3.由社区维护的组织良好的代码

    scrapy是一个标准化的大妈格式和框架,您可以编写名为spider和pipeline的Python小模块,并且可以自动地从将来对引擎本身的任何改进中获益。所以,不管有谁加入你的团队,都不必经历理解自定义爬行器特性的学习曲线。

 

 

二.scrapy需要注意的事项

  在某些情况下,不负责任的web抓取可能是恼人的,甚至是非法的。需要避免的两件最重要的事情是拒绝服务攻击(DoS),比如行为和侵犯版权。

 

  一个典型的web爬虫程序可能每秒下载几十个页面。这是普通用户产生流量的十倍多。这可能会让网站所有者感到不安。使用节流将生成的流量减少到可接受的类似用户的级别。监控响应时间,如果您看到响应时间在增加,请减少爬行的强度。

  在版权方面,很明显,看看你浏览的每一个网站的版权公告,确保你明白什么是允许的,什么是不允许的。为网站管理员提供一种方法来表达他们希望被排除在您的爬虫之外,这是很好的。

 

三.理解HTML和XPATH

  为了解析来自web页面的信息,你必须要理解更多关于它的框架.

  1.HTML

  让我们花一些时间来理解从用户在浏览器上键入URL:

    1.在浏览器上键入URL。URL的第一部分(域名,如gumtree.com)用于在web上找到合适的服务器,URL和其他数据(如cookie)形成一个请求,该请求被发送到该服务器。

    2.服务器通过向浏览器发送HTML页面进行响应。注意,服务器还可能返回其他格式,如XML或JSON,但目前我们主要关注HTML。

    3.HTML被转换成浏览器中的一个内部树表示:文档对象模型(Document Object Model, DOM)。

    4.根据一些布局规则,将内部表示呈现为您在屏幕上看到的可视表示。

 

  2.XPath

  使用XPath选择和过滤HTML元素.文档的层次结构以元素开始,您可以使用元素名称和斜杠来选择文档的元素。例如,以下是从http://example.com/页面返回的各种表达式:

$x('/html')
  [ <html>...</html> ]
$x('/html/body')
  [ <body>...</body> ]
$x('/html/body/div')
  [ <div>...</div> ]
$x('/html/body/div/h1')
  [ <h1>Example Domain</h1> ]
$x('/html/body/div/p')
  [ <p>...</p>, <p>...</p> ]
$x('/html/body/div/p[1]')
  [ <p>...</p> ]
$x('/html/body/div/p[2]')
  [ <p>...</p> ]

  您还可以选择属性。http://example.com/上唯一的属性是链接的href,您可以使用字符@访问该链接,如下所示:

  

$x('//a/@href')
  [ href="http://www.iana.org/domains/example" ]

 

  

你也能够永选择器text():

$x('//a/text()')
  [ "More information..." ]

 

 


  实际上,您经常需要在XPath表达式中使用类。在这些情况下,您应该记住,由于一些称为CSS的样式元素,您经常会看到HTML元素在它们的class属性上声明多个类。

  这意味着,例如,在导航系统中,您将看到一些div的类属性设置为“link”,而另一些div的类属性设置为“link active”。后者是当前处于活动状态的链接,因此可用特殊颜色(通过CSS)显示或突出显示。

  在进行抓取时,您通常会对包含特定类的元素感兴趣,即前面示例中的“link”和“link active”。contains() XPath函数允许您选择包含某个类的所有元素。

 

    

//table[@class="infobox"]//img[1]/@src
//div[starts-with(@class,"reflist")]//a/@href
//*[text()="References"]/../following-sibling::div//a

 

 

  如果它们的HTML以使XPath表达式无效的方式更改,我们将不得不返回爬行器并纠正它们。这通常不会花费很长时间,因为更改通常很小。然而,这肯定是我们宁愿避免的事情。一些简单的规则可以帮助我们降低您的表达式无效的几率:

  

//*[@id="myid"]/div/div/div[1]/div[2]/div/div[1]/div[1]/a/img
//div[@class="thumbnail"]/a/img
//*[@id="more_info"]//text()
//[@id="order-F4982322"]

  尽管id是惟一的,但是上面的XPath表达式非常糟糕。还要记住,即使id是惟一的,您也会发现许多HTML文档并不是惟一的。

 

四.基础爬虫

 

  1.安装scrapy

      scrapy是通过python语言作为基础的,所以在scrapy安装以前,是要先安装python的,这里我就不多说python的安装了,网上有很多教程。

      这里我是通过Anaconda进行python包的版本控制,这样非常的方便管理python的各种包依赖版本问题。

      当安装了Anaconda后,就可以安装scrapy,scrapy也是python的一个包,所以命令如下:pip install scrapy安装。

  2.创建scrapy项目

      scrapy startproject 项目名(demo)

 

                               

 

  3.简单爬取网页(http://jandan.net)为例

 

    1.创建jiandanSpider,作为项目主要入口

    

 

 

 

 

 

     2.item

                   

 

    3.pipeline

 

 

     4.setting

    

 

 

 

    5.测试

    进入项目目录cmd

    使用命令:scrapy crawl jiandan,可以再E盘看到我们抓取下来的图片:

    

 

 

 

 

 

posted on 2019-05-08 13:41  流星划过天际  阅读(614)  评论(5编辑  收藏  举报