scrapy 的三个入门应用场景
说明:
本文参照了官网的 dmoz 爬虫例子。
不过这个例子有些年头了,而 dmoz.org 的网页结构已经不同以前。所以我对xpath
也相应地进行了修改。
概要:
本文提出了scrapy 的三个入门应用场景
- 爬取单页
- 根据目录页面,爬取所有指向的页面
- 爬取第一页,然后根据第一页的连接,再爬取下一页...。依此,直到结束
对于场景二、场景三可以认为都属于:链接跟随(Following links)
链接跟随的特点就是:在 parse 函数结束时,必须 yield 一个带回调函数 callback 的 Request 类的实例
本文基于:windows 7 (64) + python 3.5 (64) + scrapy 1.2
场景一
描述:
爬取单页内容
示例代码:
import scrapy
from tutorial.items import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for div in response.xpath('//div[@class="title-and-desc"]'):
item = DmozItem()
item['title'] = div.xpath('a/div/text()').extract_first().strip()
item['link'] = div.xpath('a/@href').extract_first()
item['desc'] = div.xpath('div[@class="site-descr "]/text()').extract_first().strip()
yield item
场景二
描述:
- ①进入目录,提取连接。
- ②然后爬取连接指向的页面的内容
其中①的yield scrapy.Request的callback指向②
官网描述:
...extract the links for the pages you are interested, follow them and then extract the data you want for all of them.
示例代码:
import scrapy
from tutorial.items import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
'http://www.dmoz.org/Computers/Programming/Languages/Python/' # 这是目录页面
]
def parse(self, response):
for a in response.xpath('//section[@id="subcategories-section"]//div[@class="cat-item"]/a'):
url = response.urljoin(a.xpath('@href').extract_first().split('/')[-2])
yield scrapy.Request(url, callback=self.parse_dir_contents)
def parse_dir_contents(self, response):
for div in response.xpath('//div[@class="title-and-desc"]'):
item = DmozItem()
item['title'] = div.xpath('a/div/text()').extract_first().strip()
item['link'] = div.xpath('a/@href').extract_first()
item['desc'] = div.xpath('div[@class="site-descr "]/text()').extract_first().strip()
yield item
场景三
描述:
- ①进入页面,爬取内容,并提取下一页的连接。
- ②然后爬取下一页连接指向的页面的内容
其中①的yield scrapy.Request的callback指向①自己
官网描述:
A common pattern is a callback method that extracts some items, looks for a link to follow to the next page and then yields a Request with the same callback for it
示例代码:
import scrapy
from myproject.items import MyItem
class MySpider(scrapy.Spider):
name = 'example.com'
allowed_domains = ['example.com']
start_urls = [
'http://www.example.com/1.html',
'http://www.example.com/2.html',
'http://www.example.com/3.html',
]
def parse(self, response):
for h3 in response.xpath('//h3').extract():
yield MyItem(title=h3)
for url in response.xpath('//a/@href').extract():
yield scrapy.Request(url, callback=self.parse)
说明:
第三个场景未测试!
scrapy 的三个入门应用场景的更多相关文章
- Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子
Selenium WebDriver + Grid2 + RSpec之旅(三) ----入门小例子 第一个例子都是比较简单的博客园登录界面,就像学习编程语言时候都是从Hello,World!开始. 1 ...
- git和github新手安装使用教程(三步入门)
git和github新手安装使用教程(三步入门) 对于新手来说,每次更换设备时,github的安装和配置都会耗费大量时间.主要原因是每次安装时都只关心了[怎么做],而忘记了记住[为什么].本文从操作的 ...
- scrapy框架(三)
scrapy框架(三) CrawlSpider类 创建CrawlSpider # 创建项目后 $ scrapy genspider -t crawl spider_name website_doma ...
- 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳
学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 JERRY_Z. ~ 2020 / 10 / 25 转载请注明出处!️ 目录 学会Git玩转GitHub(第三篇) 入门详解 - 精简归纳 ...
- 转:Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)
Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.(本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,所 ...
- Scrapy安装、爬虫入门教程、爬虫实例(豆瓣电影爬虫)
Scrapy在window上的安装教程见下面的链接:Scrapy安装教程 上述安装教程已实践,可行.(本来打算在ubuntu上安装Scrapy的,但是Ubuntu 磁盘空间太少了,还没扩展磁盘空间,所 ...
- 『Scrapy』爬虫框架入门
框架结构 引擎:处于中央位置协调工作的模块 spiders:生成需求url直接处理响应的单元 调度器:生成url队列(包括去重等) 下载器:直接和互联网打交道的单元 管道:持久化存储的单元 框架安装 ...
- 爬虫 (5)- Scrapy 框架简介与入门
Scrapy 框架 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量,用户只需要定制开发几个模块就可以轻松的实现一个爬虫,用来抓取网页 ...
- Jmeter(三) - 从入门到精通 - 测试计划(Test Plan)的元件(详解教程)
1.简介 上一篇中宏哥已经教你如何通过JMeter来创建一个测试计划(Test Plan),那么这一篇我们就将JMeter启动起来,创建一个测试计划(Test plan),然后宏哥给大家介绍一下测试计 ...
随机推荐
- IOS 杂笔-13(appearance的巧妙使用)
在我们查看原生api时,我们不难发现,有些api的后面有着->UI_APPEARANCE_SELECTOR 那么我可以很高兴的说我们可以通过appearance对象来统一设置.十分巧妙. 例如: ...
- IIS下打印报表到Excel
阅读本文之前,请先看上一篇文章<.NET下Excel报表的打印>. 上一篇文章<.NET下Excel报表的打印>介绍了关于报表打印到Excel文件中的方法.若要把项目通过IIS ...
- iOS开发过程中,触控板的使用技巧
1.在Storyboard鼠标右键可以直接拖线的,如果你用的是外接的第三方鼠标,没必要按着 control 键再用鼠标左键拖线 如果是触控板的话,双指按下去就可以直接拖线,带3Dtouch功能的触控板 ...
- 2、IOS开发--iPad之仿制QQ空间 (初始化HomeViewController子控件视图)
1.先初始化侧边的duck,效果图: 实现步骤: 2.然后初始化BottomMenu,效果: 步骤: 其实到这里,会出现一个小bug,那就是: 子控件的位置移高了,主要原因是: 逻辑分析图: 问题解决 ...
- 【AdaBoost算法】基于OpenCV实现人脸检测Demo
一.关于检测算法 分类器训练: 通过正样本与负样本训练可得到分类器,opencv有编译好的训练Demo,按要求训练即可生成,这里我们直接使用其已经训练好的分类器检测: 检测过程: 检测过程很简单,可以 ...
- [windows]禁止指定用户使用远程桌面服务登录
windows2003下禁止用户远程登录的方法如下: 1.打开控制面板 > 管理工具 > 本地安全策略 2.安全策略-->本地策略-->用户权限分配-->通过终端服务拒绝 ...
- Effective Java 55 Optimize judiciously
Principle Strive to write good programs rather than fast ones. Strive to avoid design decisions that ...
- 问题解决——使用CriticalSection后 0xXXXXXXXX处最可能的异常: 0xC0000005: 写入位置 0x00000014 时发生访问冲突
================声明===================== 本文原创,转载请保持文章的完整性(含本声明),并显要的著名作者和出处. 本文链接:http://blog.csdn.ne ...
- diff, cmp, patch
diff 以行为单位比较两个文件之间的差异,经常用来查看同一个文件的新旧版本的差异,通常用在文本文件的比较,可以使用重定向'>'制作补丁文档,通常以.patch结尾 \(diff [-bBi] ...
- nginx根据IP限制访问
nginx有两个模块可以控制访问 HttpLimitZoneModule 限制同时并发访问的数量 HttpLimitReqModule 限制访问数据,每秒内最多几个请求 http{ ## ...