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
版本。我不知道它是否与您的相匹配,因此您可能需要调整一些导入。您应该考虑的一些事项:
parse
作为回调,因为
CrawlSpider
使用parse
方法本身来实现其逻辑。
因此,如果重写parse
方法,爬网爬行器将不再运行
工作
为非默认回调使用其他名称
您可能需要修改您的物品装载代码;我怀疑你得到的名单不是你想要的
您应该考虑以下几点:
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
的方式。