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. Gerrit使用简介

    Gerrit,一种免费.开放源代码的代码审查软件,使用网页界面. Gerrit,一种免费.开放源代码的代码审查软件,使用网页界面.利用网页浏览器,同一个团队的软件程序员,可以相互审阅彼此修改后的程序代 ...

  2. kernel thread vs user thread

    The most important difference is they use different memory, the kernel mode thread can access any ke ...

  3. soap1.1与soap1.2区别

  4. 实现多线程sokect

    上一篇文章说到怎样写一个最简单的Java Socket通信,但是在上一篇文章中的例子有一个问题就是Server只能接受一个Client请求,当第一个Client连接后就占据了这个位置,后 续Clien ...

  5. VIM的修炼等级

    用vim 快两年了 看过教程也不少,总的来说还是得自己多练习,当自己觉得有需要的时候,再添加功能.这里分享个看过的最好的教程,出自贴吧的某个朋友,写的很好 零 学会盲打 壹 配置文件先从最简开始,在 ...

  6. LeetCode OJ-- Substring with Concatenation of All Words ***

    https://oj.leetcode.com/problems/substring-with-concatenation-of-all-words/ 找S中子串,每个元素都在T中出现了,且所有T中元 ...

  7. html5---音频视频基础一

    //html5 音频和视频 :标签 a: audio,video b: source :视频容器 a:容器文件,类似于压缩了一组文件 -音频轨道 -视频轨道 -元数据:封面,标题,字幕等 -格式:.a ...

  8. Android Studio中删除所有的断点

    直接上图,我相信你们能看的懂,骚年们. 第1个图:Run–>>View Breakpoints.. 第2个图:现在可以看到所有的断点了,在左侧栏全选,然后点"-",就全 ...

  9. 暂停时间 以及dict 循环

    暂停时间 #!/usr/bin/python # -*- coding: UTF-8 -*- import time myD = {1: 'a', 2: 'b'} for key, value in ...

  10. hdu 3062 Party 2-SAT

    题目链接:HDU - 3062 有n对夫妻被邀请参加一个聚会,因为场地的问题,每对夫妻中只有1人可以列席.在2n 个人中,某些人之间有着很大的矛盾(当然夫妻之间是没有矛盾的),有矛盾的2个人是不会同时 ...