Scrapy爬虫-item的使用

文:郑元春

人生苦短,我用Python。

回顾:上一篇Scrapy爬虫之中,主要说明了原理和Scrapy的组件,并建立了一个最基本的爬虫工程。很多时候,我们并不是像搜索引擎一样需要对很多网页进行爬取,我们一般都是有特殊的爬取目的,通过关注自己感兴趣的数据点,进行数据的爬取,既然是自己“定制”的爬虫,那么对于网页上的非结构化的数据,我们需要存储到本地(或是文本文件,或是数据库表)。如果你后续的工作是对数据进行分析,并且数据有很好的结构信息(指的是不全是文本数据,或是长文本数据),那么就可以直接将数据存储到数据库。

页面数据的建模

网站是从数据库(数据模型)到html的正向显示,爬虫是从html到数据模型的逆向推导。

1.分析网页URL

我们写爬虫的第一步就是详细分析你的网页,尤其是动态网页,首先你需要分析的就是URL地址,现在好多的网站,尤其是基于产品购物的网站(比如淘宝,京东等)他的URL可能会带有好多的URL参数或者是是在动态变化的,因为URL首先会牵扯到重复爬取的问题,虽然Scrapy也有自己的URL去重算法,但还是自己掌握URL的规律吧,这样至少自己能够把握重复性问题了。

《Scrapy爬虫-item的使用》 URL命名规则实例–图片来源:[webdesign.tutsplus.com](webdesign.tutsplus.com)

做过网网站的同学一定知道服务器软件都会有一个URL解析组件,而且根据你的页面展示内容,一般URL都会有自己的命名模式,相同类型的网页都会有同样的命名方式。你需要做的就是将你关注的网页的URL的命名方式自己提炼出来,这样当你写爬虫的时候就能够自己构造URL

2.分析数据获取方式

现在的一个页面大小动辄好几M,除了图片之外,还有大部分的数据是通过异步方式加载的,这些数据是通过浏览器执行javascript从服务器的API动态加载的,所以不管你是通过urllib还是通过scrapy访问的页面抓的数据都是最原始的静态数据,那些动态的数据并不会抓取。

有的爬虫是调用了其他的脚本执行库来实现渲染页面,但是那是需要时间的,对于需要爬大量页面的需求来说有点不切实际(同时,那部分的代码我还没有研究)。其实对于需要的动态数据我们可以直接构造Request来获取就行了,完全不必要渲染。但是这还牵扯到一个问题,那就是你必须自己分析数据的获取形式。这个就比较费时费力了,一个是你需要分析出页面中哪些是通过ajax加载的,哪些是原始html就load下的,这里比较推荐的就是Firefox浏览器了,除了能够“定位”元素位置,通过添加Firefox的其他组件(FireBug+xPath)就更加的得心应手了。

《Scrapy爬虫-item的使用》 简书首页加载的Html

上图是打开简书首页的时候需要加载的部分文件,我这里只打开了[HTML]和[XHR]两个开关,所以JS文件和CSS文件并没有显示出来(显示出来也没有太大的用处).可以看到首页只是加载了一个原始的html’文件。图中两个显示记录,第一个的返回status是301,那是因为我在地址栏中输入了“jianshu.com”,浏览器给重定向到了带有www的页面上。
所以在主页上面显示的所有的数据都是可以抓取的(除了图片外,因为html语言中图片是通过src的方式)。如果你向下滑到底部,点击加载更多的话看到页面并没有刷新就有了数据显示出来,这是通过ajax加载的数据。

《Scrapy爬虫-item的使用》 加载按钮上的事件触发

可以看到加载更多这个按钮上有事件触发。数据是在这里面触发加载的。

《Scrapy爬虫-item的使用》 Snip20160705_69.png

这里只是举个小例子说明页面上的数据是怎么来的,当然还有其他的加载方式。总之,好好利用FireFox的调试工具

3. 对想要的数据建模

4. Scrapy的数据模型–Item

下篇预告:
数据模型写好了,并且也能开始抓取数据了。那么接下来要做的就是将数据写入到数据库中或是文件中,是通过Pipeline实现的。

    原文作者:北静王
    原文地址: https://www.jianshu.com/p/688d7131a41d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞