爬行蜘蛛不爬行〜规则问题

时间:2015-06-20 16:31:23

标签: python web-scraping scrapy scrapy-spider

我正在编程的蜘蛛问题。我试图以递归方式从我大学的网站上删除这些课程,但我在使用RuleLinkExtractor时遇到了很大的麻烦。

# -*- coding: utf-8 -*-
import scrapy
from scrapy.spider import Spider
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor

from ..items import BotItem

class UlsterSpider(CrawlSpider):
    name = "ulster"
    allowed_domains = ["ulster.ac.uk"]
    start_urls = (
        'http://www.ulster.ac.uk/courses/course-finder?query=&f.Year_of_entry|E=2015/16&f.Type|D=Undergraduate',
    )

    rules = (
        Rule(LinkExtractor(allow=("index\.php", )), callback="parse"),
        Rule(LinkExtractor(restrict_xpaths='//div[@class="pagination"]'), follow=True),
    )

    def parse(self, response):
        item = BotItem()

        for title in response.xpath('//html'):
            item['name'] = title.xpath('//*[@id="course_list"]/div/h2/a/text()').extract()
            yield item 

我的蜘蛛布局如下。第16-18行是规则。我试图做的是按照课程下面的分页来删除标题。但是,它不会跟随。如果有人能指出我正确的方向,那将是一个很大的帮助。我曾尝试使用SGML提取器复制示例,但它表示已弃用并且不使用它。

声明

虽然这是一个大学网站,但这不是作业。这是为了娱乐和学习。我真的很困难。

2 个答案:

答案 0 :(得分:3)

你应该考虑的一些事情:

  1. <强>调试: Scrapy有几种方法可以帮助确定您的蜘蛛不按照您想要/期望的方式行事的原因。查看scrapy文档中的Debugging Spiders;这可能是文档中最重要的页面。

  2. 您的蜘蛛令人困惑: 再次参考scrapy docs,您将找到以下

  3.   

    警告

         

    编写爬网蜘蛛规则时,请避免使用parse作为回调   CrawlSpider使用parse方法本身来实现其逻辑。   因此,如果您覆盖parse方法,则抓取蜘蛛将不再存在   工作

    为非默认回调使用其他名称。

    1. 检查蜘蛛的行为:
      您可能想要修改项目加载代码;我怀疑你得到的清单不是你想要的。

答案 1 :(得分:2)

我认为您不需要两个规则,您可以声明一个并执行此操作以跟踪链接并解析每个页面。

在规则中,我将xpath限制为列表的最后一个链接,因为否则您可能会多次解析某些链接。

我使用parse_start_url作为回调来包含start_urls变量的网址。

xpath命令中,它返回一个包含标签之间所有文本的列表,但有趣的是第一个,所以得到它并剥离空白。

跟随items.py

import scrapy

class BotItem(scrapy.Item):
    name = scrapy.Field()

蜘蛛:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from ..items import BotItem
from scrapy.linkextractors import LinkExtractor


class UlsterSpider(CrawlSpider):
    name = "ulster"
    allowed_domains = ["ulster.ac.uk"]
    start_urls = ( 
        'http://www.ulster.ac.uk/courses/course-finder?query=&f.Year_of_entry|E=2015/16&f.Type|D=Undergraduate',
    )   

    rules = ( 
        Rule(
            LinkExtractor(restrict_xpaths='//div[@class="pagination"]/ul/li[position() = last()]'), 
            follow=True, 
            callback='parse_start_url'),
    )   

    def parse_start_url(self, response):
        item = BotItem()

        for title in response.xpath('//*[@id="course_list"]/div/h2/a'):
            item['name'] = title.xpath('text()')[0].extract().strip()
            yield item

您可以像以下一样运行它:

scrapy crawl ulster -o titles.json

产量:

[{"name": "ACCA - Association of Chartered Certified Accountants"},
{"name": "Accounting"},
{"name": "Accounting"},
{"name": "Accounting and Advertising"},
{"name": "Accounting and Human Resource Management"},
{"name": "Accounting and Law"},
{"name": "Accounting and Management"},
{"name": "Accounting and Managerial Finance"},
{"name": "Accounting and Marketing"},
{"name": "Accounting with Finance"},
{"name": "Advertising"},
{"name": "Advertising and Human Resource Management"},
{"name": "Advertising with Computing"},
{"name": "Advertising with Drama"},
{"name": "Advertising with Human Resource Management"},
{"name": "Advertising with Psychology"},
...]

更新:请注意,我使用的是上一个scrapy版本。我不知道它是否与你的匹配,所以也许你需要调整一些进口。