爬行蜘蛛不爬行~规则问题
Crawl spider not crawling ~ Rule Issue
我正在编程的蜘蛛程序出现问题。我正在尝试递归地从我大学的网站上删除课程,但我在使用 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 提取器复制示例,但它说它已被弃用并且不再使用它。
免责声明
虽然这是一个大学网站,但这不是家庭作业。这是为了乐趣和学习。我真的真的卡住了。
我认为您不需要两条规则,您可以声明一条并遵循 links 并解析每个页面。
在规则中,我将 xpath
限制为列表的最后一个 link,否则您可能会多次解析某些 link。
我使用 parse_start_url
作为回调来包含 start_urls
变量的 url。
在xpath
命令中,它returns一个包含标签之间所有文本的列表,但有趣的是第一个,所以得到它并去掉空白。
与以下 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
版本。我不知道它是否与你的匹配,所以也许你需要调整一些导入。
您应该考虑的一些事项:
调试中:
Scrapy 有几种方法可以帮助确定为什么你的蜘蛛不按照你的方式行事 want/expect。查看 scrapy 文档中的 Debugging Spiders;这可能是文档中最重要的页面。
你正在混淆你的蜘蛛:
再次参考scrapy docs,你会发现如下
Warning
When writing crawl spider rules, avoid using parse
as callback, since
the CrawlSpider
uses the parse
method itself to implement its logic.
So if you override the parse
method, the crawl spider will no longer
work.
为非默认回调使用不同的名称。
- 检查蜘蛛的行为:
您可能想要修改您的项目加载代码;我怀疑你得到的列表不是你想要的。
我正在编程的蜘蛛程序出现问题。我正在尝试递归地从我大学的网站上删除课程,但我在使用 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 提取器复制示例,但它说它已被弃用并且不再使用它。
免责声明
虽然这是一个大学网站,但这不是家庭作业。这是为了乐趣和学习。我真的真的卡住了。
我认为您不需要两条规则,您可以声明一条并遵循 links 并解析每个页面。
在规则中,我将 xpath
限制为列表的最后一个 link,否则您可能会多次解析某些 link。
我使用 parse_start_url
作为回调来包含 start_urls
变量的 url。
在xpath
命令中,它returns一个包含标签之间所有文本的列表,但有趣的是第一个,所以得到它并去掉空白。
与以下 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
版本。我不知道它是否与你的匹配,所以也许你需要调整一些导入。
您应该考虑的一些事项:
调试中: Scrapy 有几种方法可以帮助确定为什么你的蜘蛛不按照你的方式行事 want/expect。查看 scrapy 文档中的 Debugging Spiders;这可能是文档中最重要的页面。
你正在混淆你的蜘蛛: 再次参考scrapy docs,你会发现如下
Warning
When writing crawl spider rules, avoid using
parse
as callback, since theCrawlSpider
uses theparse
method itself to implement its logic. So if you override theparse
method, the crawl spider will no longer work.
为非默认回调使用不同的名称。
- 检查蜘蛛的行为:
您可能想要修改您的项目加载代码;我怀疑你得到的列表不是你想要的。