2 u011616965 u011616965 于 2016.03.03 10:16 提问

scrapy爬虫不能自动爬取所有页面 10C

学习scrapy第三天,在爬取wooyun白帽子精华榜的时候,不能爬取所有的页面。

items.py

# -*- coding: utf-8 -*-

# Define here the models for your scraped items
#
# See documentation in:
# http://doc.scrapy.org/en/latest/topics/items.html

import scrapy


class WooyunrankautoItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    '''
    以下信息分别为
    注册日期
    woyun昵称
    精华漏洞数
    精华比例
    wooyun个人主页
    '''
    register_date = scrapy.Field()
    nick_name     = scrapy.Field()
    rank_level    = scrapy.Field()
    essence_count = scrapy.Field()
    essence_ratio = scrapy.Field() 

pipelines.py

# -*- coding: utf-8 -*-

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html

import sys
import csv

class WooyunrankautoPipeline(object):

    '''
    process the item returned from the spider
    '''

    def __init__(self):

        reload(sys)
        if sys.getdefaultencoding()!="utf-8":
            sys.setdefaultencoding("utf-8")

        file_obj = open("wooyunrank.csv","wb")
        fieldnames = ["register_date","nick_name","rank_level","essence_count","essence_ratio"]
        self.dict_writer = csv.DictWriter(file_obj,fieldnames=fieldnames)
        self.dict_writer.writeheader()

    def process_item(self,item,spider):
        self.dict_writer.writerow(item)
        return item 

spider.py

 #!/usr/bin/python  
# -*- coding:utf-8 -*- 

import sys
from scrapy.spider import Spider
from scrapy.selector import Selector
from wooyunrankauto.items import WooyunrankautoItem
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors import LinkExtractor

class WooyunSpider(CrawlSpider):
    '''
    爬取wooyun漏洞精华榜单
    '''
    name = "wooyunrankauto"

    # 爬取速度为1s
    download_delay = 2
    allowed_domains = ["wooyun.org"]
    start_urls = [
        "http://wooyun.org/whitehats/do/1/page/1"
    ]
    rules=[
        Rule(LinkExtractor(allow=("/whitehats/do/1/page/\d+")),follow=True,callback='parse_item')
    ]

    # def __init__(self):
    #   reload(sys)
    #   if sys.getdefaultencoding()!="utf-8":
    #       sys.setdefaultencoding("utf-8")

    def parse_item(self,response):
        sel = Selector(response)
        infos = sel.xpath("/html/body/div[5]/table/tbody/tr")
        items = []
        for info in infos:
            item = WooyunrankautoItem()
            item["register_date"] = info.xpath("th[1]/text()").extract()[0]
            item["rank_level"]    = info.xpath("th[2]/text()").extract()[0]
            item["essence_count"] = info.xpath("th[3]/text()").extract()[0]
            item["essence_ratio"] = info.xpath("th[4]/text()").extract()[0]
            item["nick_name"]     = info.xpath("td/a/text()").extract()[0]
            items.append(item)
        return items

上面的spider.py只能爬取1,2,3,4,5页(日志中显示爬取六次,第一页被重复爬取了)
但是浏览第5页的时候,6,7,8,9页也会出现啊,这里为什么没有爬取到6,7,8,9

第二个版本的spider.py

    def parse_item(self,response):
        sel = Selector(response)
        infos = sel.xpath("/html/body/div[5]/table/tbody/tr")
        items = []
        for info in infos:
            item = WooyunrankautoItem()
            item["register_date"] = info.xpath("th[1]/text()").extract()[0]
            item["rank_level"]    = info.xpath("th[2]/text()").extract()[0]
            item["essence_count"] = info.xpath("th[3]/text()").extract()[0]
            item["essence_ratio"] = info.xpath("th[4]/text()").extract()[0]
            item["nick_name"]     = info.xpath("td/a/text()").extract()[0]
            items.append(item)
            return item

这个版本可以爬取所有页面,但是每个页面有20条信息,我只能取到第一条信息(循环第一条的时候就返回了,这里可以理解)但是为什么这里就可以爬取所有页面

可能是我对scrapy理解还不深入,这里实在不知道什么问题了,我想自动爬取所有页面(而且不会重复爬取),每个页面有20条信息,应该就是20个item。

1个回答

caozhy
caozhy   Ds   Rxr 2016.03.07 05:53

用fiddler调试看下,你得到的html完整不完整,是不是有ajax的加载

u011616965
u011616965 我测试过了,把JS关闭之后 访问第五页以后的东西,会显示以后的页面的
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Scrapy研究探索(五)——自动多网页爬取(抓取某人博客所有文章)
首先,在教程(三)()中
网络爬虫之Scrapy实战三:爬取多个网页CrawlSpider
本文介绍了scrapy中CrawlSpider的用法
Python Scrapy 学习----自动爬取网页
使用scrapy框架写爬虫时一般会在start_urls中指定我们需要爬虫去抓取的网页的url,但是如何让我们的爬虫像搜索引擎中使用的爬虫一样具备自动多网页爬取的功能呢?本文通过自动抓取个人csdn博客的所有文章标题、阅读人数、创建时间来进行一个简单的说明。文中使用了两种不同的方法来实现。 首先我们来分析cdsn中博客中文章的url,如图所示可以发现不同的文章页面的url只有url末尾对应的一
Scrapy ——自动多网页爬取(抓取某人博客所有文章)(四)
首先创建project: [python] view plain copy   scrapy startproject CSDNBlog   一. items.py编写 在这里为清晰说明,只提取文章名称和文章网址。 [python] view plain copy   #
scrapy爬虫起步(3)-- 利用规则实现多页面抓取
第一篇 scrapy爬虫起步(2)–从script调用scrapy实现了一个简单的爬虫程序,只抓取start_urls里的网页信息。用以实验的页面是社科相关的小组,这只是社科小组下面的第一页地址,如果需要抓取该分组下所有的小组,就需要继续访问其它页。利用scrapy的规则匹配来自动实现。先贴代码吧:# coding=utf-8 __author__ = 'Jeffee Chen'from scrap
Scrapy定向爬虫教程(二)——提取网页内容
本节内容在这一小结,我将介绍如何使用Scrapy通过Selector选择器从网页中提取出我们想要的内容,并将这些内容存放到本地文件。 我们的目标网页是http://www.heartsong.top/forum.php?mod=viewthread&tid=8,一个有七层楼的帖子。我们要获取到每一层楼的下列信息: * 所属主题帖的标题 * 所属主题帖的url * 这一楼层的作者 * 这一楼
scrapy实现递归爬取
使用scrapy踩的坑之如何使用scrapy实现递归爬取 在使用scrapy爬取一个网站上所有的图片时,所遇到的一点坑,因为自己对scrapy不是很熟,所以最后是解决了一部分问题,但是还有一部分没有搞懂。以及对网上一些DEMO的不理解。
爬取下拉加载的动态网页信息
爬取的网站:http://blog.csdn.net/1024.html 需要爬取的信息如图: 打开页面源代码,发现并没有需要的信息,想起之前爬过的以json格式加载的网易评论,便开始点击查看元素,筛选之后,知道只有蓝色标注那个网址有所需要的内容
scrapy爬虫第一阶段——爬取多级url
实验需要爬取一族pm2.5数据,纠结了几天爬虫,总算取得阶段性胜利,至少够项目用了 总结一下思想,就是首先设一个start url作为入口,爬到需要的url后将其链接传递到下一级parse,以此类推 原理再研究,会用先: class DmozSpider(scrapy.spiders.Spider):     name = "dmoz0" //爬虫名称,在每次调用爬虫时需要   
Scrapy定向爬虫教程(三)——爬取多个页面
本节内容本部分所实现的功能是,批量的爬取网页信息,不再是像以前那样只能下载一个页面了。也就是说,分析出网页的url规律后,用特定的算法去迭代,达到把整个网站的有效信息都拿下的目的。 因为本部分讲完后,功能已经到了可以使用的地步,所以我把本部分的结果独立出来,把项目上传到了github,小伙伴可以下载参考,地址https://github.com/kongtianyi/heartsong。教程余下的