一个站点的诞生02--用Scrapy抓取数据
假设想抓数据,就须要有爬虫程序,业内叫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抓取数据的更多相关文章
- 分布式爬虫:使用Scrapy抓取数据
分布式爬虫:使用Scrapy抓取数据 Scrapy是Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据.Scrapy用途广泛,可以用于数据挖掘. ...
- scrapy 抓取数据被禁止的解决方法
在用抓取头条新闻的数据时出现以下问题:禁止抓取,结果数据没有出来 后来经过查询得知需要把settings.py里面 修改为ROBOTSTXT_OBEY = False就可以了, 默认True
- python scrapy 抓取脚本之家文章(scrapy 入门使用简介)
老早之前就听说过python的scrapy.这是一个分布式爬虫的框架,可以让你轻松写出高性能的分布式异步爬虫.使用框架的最大好处当然就是不同重复造轮子了,因为有很多东西框架当中都有了,直接拿过来使用就 ...
- scrapy抓取小说
用scrapy建立一个project,名字为Spider scrapy startproject Spider 因为之前一直用的是电脑自带的python版本,所以在安装scrapy时,有很多问题,也没 ...
- scrapy抓取淘宝女郎
scrapy抓取淘宝女郎 准备工作 首先在淘宝女郎的首页这里查看,当然想要爬取更多的话,当然这里要查看翻页的url,不过这操蛋的地方就是这里的翻页是使用javascript加载的,这个就有点尴尬了,找 ...
- 【爬虫】利用Scrapy抓取京东商品、豆瓣电影、技术问题
1.scrapy基本了解 Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架.可以应用在包括数据挖掘, 信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取(更确切来说,网络抓 ...
- scrapy抓取学院新闻报告
抓取四川大学公共管理学院官网(http://ggglxy.scu.edu.cn)所有的新闻咨询. 实验流程 1.确定抓取目标.2.制定抓取规则.3.'编写/调试'抓取规则.4.获得抓取数据 1.确定抓 ...
- scrapy抓取拉勾网职位信息(一)——scrapy初识及lagou爬虫项目建立
本次以scrapy抓取拉勾网职位信息作为scrapy学习的一个实战演练 python版本:3.7.1 框架:scrapy(pip直接安装可能会报错,如果是vc++环境不满足,建议直接安装一个visua ...
- scrapy抓取中国新闻网新闻
目标说明 利用scrapy抓取中新网新闻,关于自然灾害滑坡的全部国内新闻:要求主题为滑坡类新闻,包含灾害造成的经济损失等相关内容,并结合textrank算法,得到每篇新闻的关键词,便于后续文本挖掘分析 ...
- scrapy抓取斗鱼APP主播信息
如何进行APP抓包 首先确保手机和电脑连接的是同一个局域网(通过路由器转发的网络,校园网好像还有些问题). 1.安装抓包工具Fiddler,并进行配置 Tools>>options> ...
随机推荐
- POJ 2553 Tarjan
题意:如果v点能到的所有点反过来又能到v点,则v点是sink点,排序后输出所有的sink点. 思路:Tarjan缩点,输出所有出度为0的连通块内的点. PS:一定要记得把数组清零!!!!!!!否则自己 ...
- String和八种基本数据类型互相转换
//String转换为对应的八种基本数据类型 String str="100"; //Value out of range. Value:"200" Radix ...
- Nmap linux端口扫描神器
#简介 Nmap亦称为Network Mapper(网络映射)是一个开源并且通用的用于Linux系统/网络管理员的工具.nmap用于探查网络.执行安全扫描.网络核查并且在远程机器上找出开放端口.它可以 ...
- nodejs脚手架express-generator
1.安装生成器 npm install express-generator -g 2. 创建名称为APP的应用: express my-project 3.安装依赖包 cd my-project np ...
- Android fragment的切换(解决REPLACE的低效)
在项目中切换Fragment,一直都是用replace()方法来替换Fragment.但是这样做有一个问题,每次切换的时候Fragment都会重新实列化,重新加载一次数据,这样做会非常消耗性能用用户的 ...
- 如何使windows系统ping通VMware下面的linux系统
引用http://www.linuxidc.com/Linux/2012-11/73749p2.htm 很多人在开始接触Linux或者是嵌入式开发的时候都会遇到一个难题,就是如何在Linux下ping ...
- DeltaFish 校园物资共享平台 第六次小组会议
DeltaFish 校园物资共享平台 第六次小组会议 记录人:娄雨禛 2018.6.3 任务进度(2018.5.28-2018.6.3) 前端 李鑫:商品详情界面设计.总体配色分析 刘鼎乾:卖家页面初 ...
- Python+selenium第一个自动化脚本
第一个自动化脚本(用Python写的) from selenium import webdriver #从selenium导入webdriber driver=webdriber.Firefox() ...
- 我的web前端自学之路-心得篇:我为什么要学习web前端?
时光如流水,转眼间,自己已经是大三的学长了,看着一个个学弟学妹,心中有种莫名的感觉,很怀念大学的前两年时光,但也很憧憬着自己的未来,自己将要去经历很多从未经历的事.我是我们学校信科院的一名学生,在编程 ...
- Spring MVC 中的基于注解的 Controller(转载)
终于来到了基于注解的 Spring MVC 了.之前我们所讲到的 handler,需要根据 url 并通过 HandlerMapping 来映射出相应的 handler 并调用相应的方法 ...