一个网站的诞生02--用Scrapy抓取数据

如果想抓数据,就需要有爬虫程序,业内叫crawler或者spider。

有各种语言版本的开源爬虫,c++, Java,  php,在github上搜一下,以"spider c++"为关键字,有245个开源爬虫,以"spider java"为关键字,有48个。那python呢?156个。

爬虫技术在业界已经很成熟了,有很多开源框架,在它们的帮助下写爬虫可以很快,几个小时就能写一个不错的东东用。爬虫技术也会很复杂,如果要做分布式抓取和全文检索,一般使用Nutch。

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

1. 安装Scrapy

安装Scrapy很简单,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,这是一个非常简单的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抓取数据

时间: 2024-11-05 09:47:21

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

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

分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘.监测和自动化测试. 官方主页: http://www.scrapy.org/ 中文文档:Scrapy 0.22 文档 GitHub项目主页:https://github.com/scrapy/scrapy Scrapy 使用了 Twisted 异步网络库来处理网络通讯.整体架构大致如下(注:图片来自

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

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

一个网站的诞生01--缘由

大概在半年前,我觉得需要做一个网站,寻找新奇有趣的餐厅. 喜欢美食的人,在中意餐厅吃久了,总想找新餐厅换换口味,试试新菜和新的食材. 寻找新餐厅并不容易,甚至是艰难.由于众所周知的原因,网上流传的餐厅文,美食文,常常不可信,编排越精美,越可能是软广---大家天天都很忙,很少有闲心做这么精美的文宣.我跟这些美食文找过,失望大于希望,成功率不到一半.而且,魔都太大,打听到的餐厅,总要去试吃一下,来来回回总跑上几个小时吧?时间很宝贵,这么做太不划算了! 上海的餐厅大众点评网收集的最齐全,如果我把它上面

一个网站的诞生04--抓取一个餐厅的某个月的全部评论

第一个Spider是抓上海的城市id,顺带抓它的下一级行政区id. 第二个Spider是抓上海的Top一万家餐厅的Shopid. 本文是第三个Spider,根据一个餐厅的Shopid,抓取它在某个月内的全部评论. 三个Spider的累加效果,就是抓取任意一个城市的TopN家餐厅的全部评论.第三个Spider修改一下,还可以做到只抓取某天的评论,只抓取某人的评论,从抓取的角度看就全齐了. 经过前两次的spider热身,这次做个复杂点的. URLhttp://www.dianping.com/sho

一个网站的诞生03--抓取评论数最多的一万家餐厅

在大众点评网上,有很多种方式对餐厅进行排序,比如http://www.dianping.com/search/category/1/10/o10,是上海全市按照评论总数最多对餐厅进行排序,下面有50个分页,也就是上海历年累计评论综述最多的750家餐厅.但只有750家,少了点.上海有18个区,逐区点击的话,每区都会显示前750家餐厅,比如这个http://www.dianping.com/search/category/1/10/r802o10,是浦东新区八佰伴地段的前750家.上海现在有十万家餐

一个网站的诞生06-- ORM

网站上的数据,存在数据库里.一般用Mysql,也有用sqlite,Postgre.操作数据库要会SQL语言,这个有点麻烦,常常需要查手册.此外,每家数据库在实现SQL语言的时候,常常会加料,增加一些自己独有的东西.而且,SQL语言不是面向对象/基于对象,很多抽象更高的东西不能使用. 于是,ORM就出现了. ORM是Object Relation Model,也就是 对象关系映射.简而言之,ORM将将数据库的记录表示成对象.选择一个好的ORM,由它的层面解决数据库和SQL语言问题,可以很开心.程序

一个网站的诞生07-- Tornado Web Server

用Spider抓取数据,然后再做各种处理,然后放到web页面供大家使用. 那么,就需要一个Web Server. 几乎每种语言都有一大堆Web Server开发框架,Python也不例外,比如这里http://www.zhihu.com/question/20706333.廖雪峰同学还有个python的教程http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0014023080708

Scrapy抓取360网站图片

项目名称:抓取360网站图片 目标url:http://image.so.com 项目描述:利用Scrapy的ImagePipeline抓取360网站的图片 要利用Scrapy抓取图片,第一步还是先定义item 1 # -*-coding: utf-8 -*- 2 import scrapy 3 4 class ImageItem(scrapy.Item): 5 image_urls = scrapy.Field() 第二步是在settings.py中打开ImagePipeline,然后定义一下

一个网站的诞生05--如何把网站做到估值过亿

网站的意义,在于创造对用户有价值的东西,估值是网站意义的一个衡量指标,提升估值的手段,也就等价于把网站做得更有用. 如何计算一个网站的估值?国际标准是每个活跃用户的价值是40刀左右,Whatsapp卖了190亿刀,它有4.5亿活跃用户.中国略有差别,微信的估值是40亿~50亿刀,有3亿用户,但中国的用户商业价值不够高,人均GDP太低,所以每个活跃用户的价值是10-15刀,也就是RMB60-90元.如果网站(包括同名App)要想估值过亿,要有一百万的活跃用户.另一种估算方式是,行业第二名的估值是第