scrapy spider的parse方法能够返回两种值:BaseItem。或者Request。通过Request能够实现递归抓取。

假设要抓取的数据在当前页,能够直接解析返回item(代码中带**凝视的行直接改为yield item);

假设要抓取的数据在当前页指向的页面,则返回Request并指定parse_item作为callback。

假设要抓取的数据当前页有一部分,指向的页面有一部分(比方博客或论坛,当前页有标题、摘要和url,详情页面有完整内容)这样的情况须要用Request的meta參数把当前页面解析到的数据传到parse_item,后者继续解析item剩下的数据。

要抓完当前页再抓其他页面(比方下一页),能够返回Request,callback为parse。

有点奇怪的是:parse不能返回item列表,但作为callback的parse_item却能够。不知道为啥。

另外。直接extract()得到的文字不包括<a>等子标签的内容。可改为d.xpath('node()').extract()。得到的是包括html的文本。再过滤掉标签就是纯文本了。

没找到直接得到html的方法。

from scrapy.spider import Spider
from scrapy.selector import Selector from dirbot.items import Article import json
import re
import string
from scrapy.http import Request class YouyousuiyueSpider(Spider):
name = "youyousuiyue2"
allowed_domains = ["youyousuiyue.sinaapp.com"] start_urls = [
'http://youyousuiyue.sinaapp.com',
] def load_item(self, d):
item = Article()
title = d.xpath('header/h1/a')
item['title'] = title.xpath('text()').extract()
print item['title'][0]
item['url'] = title.xpath('@href').extract()
return item def parse_item(self, response):
item = response.meta['item'] sel = Selector(response)
d = sel.xpath('//div[@class="entry-content"]/div')
item['content'] = d.xpath('text()').extract()
return item def parse(self, response):
"""
The lines below is a spider contract. For more info see:
http://doc.scrapy.org/en/latest/topics/contracts.html @url http://youyousuiyue.sinaapp.com
@scrapes name
""" print 'parsing ', response.url
sel = Selector(response)
articles = sel.xpath('//div[@id="content"]/article')
for d in articles:
item = self.load_item(d)
yield Request(item['url'][0], meta={'item':item}, callback=self.parse_item) # ** or yield item sel = Selector(response)
link = sel.xpath('//div[@class="nav-previous"]/a/@href').extract()[0]
if link[-1] == '4':
return
else:
print 'yielding ', link
yield Request(link, callback=self.parse)

具体代码见:https://github.com/junglezax/dirbot

參考:

http://doc.scrapy.org/en/latest/intro/tutorial.html

http://www.icultivator.com/p/3166.html

scrapy递归抓取网页数据的更多相关文章

  1. java抓取网页数据,登录之后抓取数据。

    最近做了一个从网络上抓取数据的一个小程序.主要关于信贷方面,收集的一些黑名单网站,从该网站上抓取到自己系统中. 也找了一些资料,觉得没有一个很好的,全面的例子.因此在这里做个笔记提醒自己. 首先需要一 ...

  2. Asp.net 使用正则和网络编程抓取网页数据(有用)

    Asp.net 使用正则和网络编程抓取网页数据(有用) Asp.net 使用正则和网络编程抓取网页数据(有用) /// <summary> /// 抓取网页对应内容 /// </su ...

  3. 使用HtmlAgilityPack批量抓取网页数据

    原文:使用HtmlAgilityPack批量抓取网页数据 相关软件点击下载登录的处理.因为有些网页数据需要登陆后才能提取.这里要使用ieHTTPHeaders来提取登录时的提交信息.抓取网页  Htm ...

  4. web scraper 抓取网页数据的几个常见问题

    如果你想抓取数据,又懒得写代码了,可以试试 web scraper 抓取数据. 相关文章: 最简单的数据抓取教程,人人都用得上 web scraper 进阶教程,人人都用得上 如果你在使用 web s ...

  5. c#抓取网页数据

    写了一个简单的抓取网页数据的小例子,代码如下: //根据Url地址得到网页的html源码 private string GetWebContent(string Url) { string strRe ...

  6. 使用JAVA抓取网页数据

    一.使用 HttpClient 抓取网页数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 ...

  7. 【iOS】正則表達式抓取网页数据制作小词典

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/xn4545945/article/details/37684127 应用程序不一定要自己去提供数据. ...

  8. 01 UIPath抓取网页数据并导出Excel(非Table表单)

    上次转载了一篇<UIPath抓取网页数据并导出Excel>的文章,因为那个导出的是table标签中的数据,所以相对比较简单.现实的网页中,有许多不是通过table标签展示的,那又该如何处理 ...

  9. Node.js的学习--使用cheerio抓取网页数据

    打算要写一个公开课网站,缺少数据,就决定去网易公开课去抓取一些数据. 前一阵子看过一段时间的Node.js,而且Node.js也比较适合做这个事情,就打算用Node.js去抓取数据. 关键是抓取到网页 ...

随机推荐

  1. nodeJS(2)深了解: nodeJS 项目架构详解(app.js + Express + Http)

    简略了解:nodeJS 深了解(1): Node.js + Express 构建网站预备知识 环境: 环境: win7 + nodeJS 版本(node): 新建 nodeJS 项目: 名称为: te ...

  2. 简单的实现web聊天界面,一对一

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. webpack最佳入门实践系列(2)

    3.插件 在前端迅速发展的今天,许多没有太多技术含量并且感觉是在浪费时间的事情,就可以交给构建工具来做,例如:我们去手动创建index.html,手动引入打包好的js文件等操作,都可以叫个webpac ...

  4. Maven 的基本用法

    一.Maven 的安装 二.Maven的常用构建命令 1.mvn -v 查看maven版本 2.mvn compile 编译 3.mvn test 测试 4.mvn package 打包 5.Mvn  ...

  5. ofbiz数据库表结构设计(3)- 订单ORDER

    对于订单来说,主要的表就是ORDER_HEADER和ORDER_ITEM.ORDER_HEADER就是所谓的订单头,一条记录代表一条订单. ORDER_PAYMENT_PREFERENCE是订单的支付 ...

  6. pat 团体天梯赛 L3-009. 长城

    L3-009. 长城 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 邓俊辉(清华大学) 正如我们所知,中国古代长城的建造是为了抵御外 ...

  7. Python实现简单的Web服务器 解析

    代码来源https://www.shiyanlou.com/courses/552,对它进行理解,注释 #-*- coding:utf-8 -*- import BaseHTTPServer clas ...

  8. hdu 4528(搜索好题)

    小明系列故事——捉迷藏 Time Limit: 500/200 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total S ...

  9. springBoot 打成jar包

    1.一种方式通过cmd 窗口进行打包 配置maven 环境变量 进入到项目中  运行 mvn clean 然后运行mvn package 进行打包 2.通过idea 进行打包 (1)pom 中安装打包 ...

  10. IT人为了自己父母和家庭,更得注意自己的身体和心理健康

    我前一阵在一家互联网公司,工作节奏是995,忙的时候,要晚上10点才能离开公司,有时候周六还得加班.自己感觉身体状况有所下降,且听说其它一个组,在体检后多少都查出问题来,细思极恐. 有时候确实忙,那么 ...