假设想抓数据,就须要有爬虫程序,业内叫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. 3Ddungeon-------三维搜索-----偷个懒 把 亡命逃窜 的代码修改了一下 拿来用了

    题 很简单  就是给一个   三维的迷宫然后 开你起始地点 S 问你能不能到达 出口 E 能的话 需要多长时间 ? #include<stdio.h> #include<string ...

  2. 【DP悬线法】奶牛浴场

    虽然还是悬线法,但是这道题可不能轻易地套模板了,而是要换一种思路,横着扫一遍,竖着扫一遍,时间复杂度依旧是O(n^2),然而空间复杂度有一定的优化 如果用原来的方法,显然时间空间都会炸(如果你想用ma ...

  3. C# 多线程系列(一)

    线程是怎样工作的 1.多线程由一个线程调度器来进行内部管理,一个功能是CLR常常委托给操做系统. 一个线程调度器确保所有激活的线程在执行期间被合适的分配,等待或者阻塞的线程(比如,一个独占锁或者等待用 ...

  4. Java实现九宫格

    import java.util.Scanner; public class Sudoku { public static void main(String[] args) { System.out. ...

  5. VC常用代码之创建进程

    作者:朱金灿 来源:http://blog.csdn.net/clever101 创建进程是编程开发的常用操作.Windows中的创建进程采用API函数CreateProcess实现.下面是一个使用例 ...

  6. 【Oracle】OGG(Oracle GoldenGate)简介及搭建过程

    GoldenGate公司简介 GoldenGate公司专注于数据同步领域,是实现数据同步技术的领导者.至2007年,在全球35个国家售出超过2000个许可证,客户分布在政府.银行.电信.证券.传媒.医 ...

  7. JavaScript自动计算价格和全选

    JavaScript自动计算价格和全选,价格自增加减,复选框,反选,全选. 如图: 如图: CSS代码 @charset "gb2312"; /* CSS Document */ ...

  8. Windows Server 2008 R2 搭建DNS服务器(转)

    Windows Server 2008 R2 搭建DNS服务器将本机IP设为首选DNS服务器的地址在dos 下分别输入 nslookup www.mydns.com 和 nslookup 192.16 ...

  9. 【转载】JSP 中EL表达式用法详解

    EL 全名为Expression Language EL 语法很简单,它最大的特点就是使用上很方便.接下来介绍EL主要的语法结构: ${sessionScope.user.sex} 所有EL都是以${ ...

  10. Docker 导入镜像报错:open /var/lib/docker/tmp/docker-import-743441288/redis-3.0.7/json: no such file or directory

    下载好了redis的tar包,然后导入redis镜像是报错open /var/lib/docker/tmp/docker-import-743441288/redis-3.0.7/json: no s ...