Python 爬行爬行器未爬行~规则问题

Python 爬行爬行器未爬行~规则问题,python,web-scraping,scrapy,scrapy-spider,Python,Web Scraping,Scrapy,Scrapy Spider,我与正在编程的蜘蛛有问题。我试图递归地从我大学的网站上删除这些课程,但是我在规则和链接抽取器方面遇到了很大的麻烦 # -*- 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

我与正在编程的蜘蛛有问题。我试图递归地从我大学的网站上删除这些课程,但是我在
规则
链接抽取器
方面遇到了很大的麻烦

# -*- 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提取器复制示例,但它说它已被弃用,不使用它

免责声明


虽然这是一个大学网站,但这不是家庭作业。这是为了娱乐和学习。我真的被卡住了。

我认为你不需要两条规则,你可以声明一条,然后按照链接和解析每个页面来做

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

我使用
parse_start_url
作为回调,以包含
start_url
变量的url

xpath
命令中,它返回一个包含标记之间所有文本的列表,但有趣的是第一个,所以获取它并去掉空格

带有以下
项.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
版本。我不知道它是否与您的匹配,所以您可能需要调整一些导入。

我认为您不需要两个规则,您可以声明一个规则,然后按照链接进行操作并解析每个页面

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

我使用
parse_start_url
作为回调,以包含
start_url
变量的url

xpath
命令中,它返回一个包含标记之间所有文本的列表,但有趣的是第一个,所以获取它并去掉空格

带有以下
项.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
版本。我不知道它是否与您的相匹配,因此您可能需要调整一些导入。

您应该考虑的一些事项:

  • 调试: Scrapy有几种方法可以帮助确定为什么您的蜘蛛没有按照您希望/期望的方式运行。在剪贴簿上签出;这可能是文档中最重要的页面

  • 你把你的蜘蛛弄糊涂了: 再次参考,您将发现以下内容

  • 警告

    在编写爬网爬行器规则时,避免使用
    parse
    作为回调,因为
    CrawlSpider
    使用
    parse
    方法本身来实现其逻辑。 因此,如果重写
    parse
    方法,爬网爬行器将不再运行 工作

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

  • 检查蜘蛛的行为:
    您可能需要修改您的物品装载代码;我怀疑你得到的名单不是你想要的

  • 您应该考虑以下几点:

  • 调试: Scrapy有几种方法可以帮助确定为什么您的蜘蛛没有按照您希望/期望的方式运行。在剪贴簿上签出;这可能是文档中最重要的页面

  • 你把你的蜘蛛弄糊涂了: 再次参考,您将发现以下内容

  • 警告

    在编写爬网爬行器规则时,避免使用
    parse
    作为回调,因为
    CrawlSpider
    使用
    parse
    方法本身来实现其逻辑。 因此,如果重写
    parse
    方法,爬网爬行器将不再运行 工作

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

  • 检查蜘蛛的行为:
    您可能需要修改您的物品装载代码;我怀疑你得到的名单不是你想要的

  • 家庭作业问题是完全可以接受的,因此,我们甚至有一个标签,只要他们遵循规定的指导方针。我认为,能够正确地提出关于SO的问题是一项非常有价值的技能,因为你毕业后可能会回到这里,所以获得一些帮助没有什么错(当然,你的教授可能会有不同的感觉)。你想用你的第一条规则捕捉什么?家庭作业问题是完全可以接受的,所以,我们甚至有一个标签,只要它们遵循设定的指导原则。我认为,能够正确地提出关于SO的问题是一项非常有价值的技能,因为你毕业后可能会回到这里,所以获得一些帮助没有什么错(当然,你的教授可能会有不同的感觉)。你想用你的第一条规则捕捉什么?好像什么也抓不到。非常感谢。您是否介意将XPath链接再细分一点
    //div[@class=“pagination”]/ul/li[position()=last()]
    我不完全理解
    [position()=last()]
    @plotplot:它的意思是
    li[-1]
    ,但是
    xpath
    的方式。非常感谢。您是否介意将XPath链接再细分一点
    //div[@class=“pagination”]/ul/li[position()=last()]
    我不完全理解
    [position()=last()]
    @plotplot:它的意思是
    li[-1]
    ,但是
    xpath
    的方式。