假设想抓数据,就须要有爬虫程序,业内叫crawler或者spider。

有各种语言版本号的开源爬虫。c++, Java,  php,在github上搜一下,以"spider c++"为keyword,有245个开源爬虫,以"spider java"为keyword。有48个。

那python呢?156个。





爬虫技术在业界已经非常成熟了。有非常多开源框架,在它们的帮助下写爬虫能够非常快,几个小时就能写一个不错的东东用。

爬虫技术也会非常复杂。假设要做分布式抓取和全文检索,一般使用Nutch。





最有名的Python爬虫框架是Scrapy,这个名字也蛮有意思的,预计是Spider。Crawler,python各取部分字符组合起来的。它的官方主页在http://scrapy.org/。

1. 安装Scrapy

安装Scrapy非常easy,linux系统的话,一条语句就能够了。"sudo pip install Scrapy"。

通常python在Linux各发行版上都是默认安装的。pip是python的包管理工具,运行install命令后。它会从网上下载最新版本号的Scrapy安装。安装完成。在命令行输入命令"scrapy version"。会打印scrapy的版本号。表明成功安装。

2. 生成项目文件夹

假设要抓取大众点评网,须要先创建项目。选择一个空文件夹,比方在我的电脑上是/tmp/scrapy-test。在命令行输入"scrapy startproject crawdp",startproject是scrapy的一个命令。执行后,在/tmp/scrapy-test文件夹会出现一个新文件夹crawdp。它包括scrawdp项目所须要的一切东东,如源码和配置文件。

执行"tree crawdp",能够看到整个文件夹结构。

那么,"startproject""创建项目"这个高大上字眼背后的真相是什么呢?事实上不复杂,就是创建一个项目名的文件夹和它的几个子文件夹,然后复制几个指定的文件到这些文件夹,再把这些文件中的几个特定字符串替换成项目名。这块的代码在scrapy源码的scrapy/command/commands文件夹下的startproject.py文件中。而在"tree crawdp"看到的文件。它们的原型在scrapy/templates/project/module文件夹下,如settings.py.tmpl文件,把它里面的字符串"$project_name"用"crawdp"替换,再把文件名称改成settings.py,就是crawdp的settings.py文件。





像settings.py.tmpl这种文件。又称为模板文件。把模板里的变量用字符串替换掉。叫渲染(render)。在web server的开发中也相同使用这种技术,前端工程师设计html文件,里面包括形如"$project_name"之类的变量,保存成模板文件,而服务器在执行的时候,用执行时产生的字符串替换掉模板里的变量,再把替换后的内容发给浏览器,就是我们看到的网页,所以叫动态页面。





3. 第一个spider

開始写第一个spider,这是一个很easy的spider,仅仅有13行代码。

在/tmp/scrapy-test/crawdp/crawdp/spiders文件夹下,创建文件cityid_spider.py。内容例如以下:

-----------------------------------------

from scrapy.spider import BaseSpider

from scrapy.selector import HtmlXPathSelector





class CityidSpider(BaseSpider):

    name = "cityid_spider"

    start_urls = ["http://www.dianping.com/shanghai/food"]





    def parse(self, response):

        hxs = HtmlXPathSelector(response)

        xs = hxs.select('//ul[@class=\"nc_list\"]/li/a/@href')

        x = xs[0]

        cityid = x.extract().split('/')[3]

        print "\n\n\ncityid = %s\n\n\n" % cityid

-----------------------------------------

返回到/tmp/scrapy-test/crawdp/文件夹,在这个文件夹下运行"scrapy crawl cityid_spider",能够看到打印出来的结果是"cityid = 1",在默认配置下,顺带会打印非常多log信息,所以我在这句加了几个换行符。让它显示得清楚一点。





注意,这里有几个关键点:

a. cityid_spider.py这个文件,必须放在/tmp/scrapy-test/crawdp/crawdp/spiders文件夹下,放在别的地方,scrapy找不到。

b. 源码里。name = "cityid_spider"这句必须有。这里指定了spider的名字,scrapy靠名字识别不同的spider。

c. 必须在/tmp/scrapy-test/crawdp/下运行"scrapy crawl cityid_spider",在别的文件夹下不行。

其它的,能够把class CityidSpider类名换成别的,没关系,也能够cityid_spider.py文件名称换成别的名字,也没关系。不影响效果。

这个spider是一切spider的基本型,更复杂的spider都是在它的基础上逐渐加入很多其它功能做出来的。





4. 这个spider是干什么的

在大众点评网,每一个城市都有一个数字代号,比方上海是1,北京是2。深圳是7。它家的总部在上海。所以上海是1号。假设想抓很多其它城市的餐厅,就须要知道城市代号。

上海的城市代号,能够从http://www.dianping.com/shanghai/food抓取。在浏览器打开http://www.dianping.com/shanghai/food,在左側的“商区”以下,有“陆家嘴”,在它上面点击右键。选择“审查元素”,假设你用的是chrome,浏览器会开一个窗体,用高亮色定位到陆家嘴相应的html元素。这个元素包括一个超级链接。叫"/search/category/1/10/r801"
。那么上海的cityid就是超级链接里的category后面"1",而这个链接。是嵌套在一个固定的层次式的html元素里。也就是形如代码里形如"//ul[@class=\"nc_list\"]/li/a/@href"的结构。这样的写法叫xpath。

执行"scrapy crawl cityid_spider"的时候,spider開始执行,它先检查spider源码里的“start_urls = ["http://www.dianping.com/shanghai/food"]”,依据这个url,从大众点评网上抓取html文件内容。存在response里,然后调用parse函数,从response里用xpath解析出全部符合"//ul[@class=\"nc_list\"]/li/a/@href"的html元素,取第一个。得到一个类似“/search/category/1/10/r801”的字符串,然后将它以'/'为间隔做切割,取第3个。就是"1",就是cityid,这就是parse函数的前四条语句做的事情。





这块写的略有一点不人性化。术语比較多。那么,想做抓取的话,至少要懂一点html,css,web server,xpath。稍微有点基础即可。这些东西在这里就不展开了,找本入门书看看就能够了。

一个站点的诞生02--用Scrapy抓取数据的更多相关文章

  1. 分布式爬虫:使用Scrapy抓取数据

    分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘. ...

  2. scrapy 抓取数据被禁止的解决方法

    在用抓取头条新闻的数据时出现以下问题:禁止抓取,结果数据没有出来 后来经过查询得知需要把settings.py里面 修改为ROBOTSTXT_OBEY = False就可以了, 默认True

  3. python scrapy 抓取脚本之家文章(scrapy 入门使用简介)

    老早之前就听说过python的scrapy.这是一个分布式爬虫的框架,可以让你轻松写出高性能的分布式异步爬虫.使用框架的最大好处当然就是不同重复造轮子了,因为有很多东西框架当中都有了,直接拿过来使用就 ...

  4. scrapy抓取小说

    用scrapy建立一个project,名字为Spider scrapy startproject Spider 因为之前一直用的是电脑自带的python版本,所以在安装scrapy时,有很多问题,也没 ...

  5. scrapy抓取淘宝女郎

    scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找 ...

  6. 【爬虫】利用Scrapy抓取京东商品、豆瓣电影、技术问题

    1.scrapy基本了解 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取(更确切来说,网络抓 ...

  7. scrapy抓取学院新闻报告

    抓取四川大学公共管理学院官网(http://ggglxy.scu.edu.cn)所有的新闻咨询. 实验流程 1.确定抓取目标.2.制定抓取规则.3.'编写/调试'抓取规则.4.获得抓取数据 1.确定抓 ...

  8. scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立

    本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...

  9. scrapy抓取中国新闻网新闻

    目标说明 利用scrapy抓取中新网新闻,关于自然灾害滑坡的全部国内新闻:要求主题为滑坡类新闻,包含灾害造成的经济损失等相关内容,并结合textrank算法,得到每篇新闻的关键词,便于后续文本挖掘分析 ...

  10. scrapy抓取斗鱼APP主播信息

    如何进行APP抓包 首先确保手机和电脑连接的是同一个局域网(通过路由器转发的网络,校园网好像还有些问题). 1.安装抓包工具Fiddler,并进行配置 Tools>>options> ...

随机推荐

  1. facade 模式和gateway模式的区别

    原文:http://stackoverflow.com/questions/4422211/what-is-the-difference-between-facade-and-gateway-desi ...

  2. python3爬取豆瓣排名前250电影信息

    #!/usr/bin/env python # -*- coding: utf-8 -*- # @File : doubanmovie.py # @Author: Anthony.waa # @Dat ...

  3. 前端-Vue学习思维导图笔记

    看不清的朋友右键保存或者新窗口打开哦!喜欢我可以关注我,还有更多前端思维导图笔记有vue结构分析,JS基础,JQ,JS高级,Angular,git等等

  4. 项目平台统一(前后端IDE、代码风格)

    项目平台统一(前后端IDE.代码风格) 记录人:娄雨禛 前端:Webstorm(HTML+CSS+JavaScript) 后端:IntelliJ IDEA(Java) 代码风格:Java风格代码 代码 ...

  5. Ad hoc polymorphism

    与面向对象中的接口类或抽象类中定义的函数组类似: 函数的具体执行依赖与函数医用的类型. In programming languages, ad-hoc polymorphism[1] is a ki ...

  6. We wanted {"required":["value"]} and you sent ["text","value","id","sessionId"]

    重装python pycharm后再次执行以前执行没有问题的Appium脚本报错 We wanted {"required":["value"]} and yo ...

  7. 利用node、express初始化项目

    前端做整站是开发,例如:前端是用了vue创建初始化项目,后端我们不会php.java等,我们只能用node去创建去做后端代码,本文就给大家讲解最基础的从零开始创建一个项目的后端环境. 一般来说前后端代 ...

  8. Python中字典的相关操作

    1. Python类似于Java中的哈希表,只是两种语言表示的方式是不一样的,Python中的字典定义如下: 在Python中是一种可变的容器模型,它是通过一组键(key)值(value)对组成,这种 ...

  9. loadrunner安装方法

    1.loadrunner安装网盘地址:  http://pan.baidu.com/s/1hrP6mDQ 一般会提示:“vc2005_sp1_with_atl_fix_redist 2.确认时提示缺少 ...

  10. 【剑指Offer】28、数组中出现次数超过一半的数字

      题目描述:   数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.   例如:输入如下所示的一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过 ...