我正在编程的蜘蛛问题。我试图以递归方式从我大学的网站上删除这些课程,但我在使用Rule
和LinkExtractor
时遇到了很大的麻烦。
# -*- 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提取器复制示例,但它表示已弃用并且不使用它。
声明
虽然这是一个大学网站,但这不是作业。这是为了娱乐和学习。我真的很困难。
答案 0 :(得分:3)
你应该考虑的一些事情:
<强>调试:强> Scrapy有几种方法可以帮助确定您的蜘蛛不按照您想要/期望的方式行事的原因。查看scrapy文档中的Debugging Spiders;这可能是文档中最重要的页面。
您的蜘蛛令人困惑: 再次参考scrapy docs,您将找到以下
警告强>
编写爬网蜘蛛规则时,请避免使用
parse
作为回调CrawlSpider
使用parse
方法本身来实现其逻辑。 因此,如果您覆盖parse
方法,则抓取蜘蛛将不再存在 工作
为非默认回调使用其他名称。
答案 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
版本。我不知道它是否与你的匹配,所以也许你需要调整一些进口。