我的大学即将开学,因此我决定为“评价我的教授”构建一个网络爬虫,以帮助我找到学校评价最高的老师。抓取刀工作得很好......但仅限于第二页!无论我如何尝试,我都无法让它正常工作。
这是我从中抓取的 URL:http://www.ratemyprofessors.com/SelectTeacher.jsp?sid=2311&pageNo=3 (不是我实际的大学,但具有相同类型的 URL 结构)
这是我的蜘蛛:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from rmp.items import RmpItem
class MySpider(CrawlSpider):
name = "rmp"
allowed_domains = ["ratemyprofessors.com"]
start_urls = ["http://www.ratemyprofessors.com/SelectTeacher.jsp?sid=2311"]
rules = (Rule(SgmlLinkExtractor(allow=('&pageNo=\d',), restrict_xpaths=('//a[@id="next"]',)), callback='parser', follow=True),)
def parser(self, response):
hxs = HtmlXPathSelector(response)
html = hxs.select("//div[@class='entry odd vertical-center'] | // div[@class='entry even vertical-center']")
profs = []
for line in html:
prof = RmpItem()
prof["name"] = line.select("div[@class='profName']/a/text()").extract()
prof["dept"] = line.select("div[@class='profDept']/text()").extract()
prof["ratings"] = line.select("div[@class='profRatings']/ text()").extract()
prof["avg"] = line.select("div[@class='profAvg']/text()").extract()
profs.append(prof)
我尝试过的一些事情包括删除restrict_xpaths关键字参数(导致抓取器在第一个、最后一个、下一个和后退按钮之后移动,因为所有按钮都共享&pageNo=\d URL结构)并更改允许关键字参数(没有变化)。
有人有什么建议吗?这似乎是一个简单的问题,但我已经花了一个半小时试图解决它!任何帮助将不胜感激。
最佳答案
当页面参数不符合预期顺序时,该站点不能很好地处理页面参数。
查看 href
值:
$ curl -q -s "http://www.ratemyprofessors.com/SelectTeacher.jsp?sid=2311&pageNo=2" |grep \"next\"
<a href="/SelectTeacher.jsp?sid=2311&pageNo=3" id="next">c</a>
$ curl -q -s "http://www.ratemyprofessors.com/SelectTeacher.jsp?pageNo=2&sid=2311" |grep \"next\"
<a href="/SelectTeacher.jsp?pageNo=2&sid=2311&pageNo=3" id="next">c</a>
为了避免修改原始 URL,您应该对 SgmlLinkExtractor
类使用参数 canonicalize=False
。此外,您可能希望使用不太具体的 xpath 规则,因为使用当前规则,您无法获取起始 url 的项目。
像这样:
rules = [
Rule(SgmlLinkExtractor(restrict_xpaths='//div[@id="pagination"]',
canonicalize=False),
callback='parser', follow=True),
]
关于python - 为什么我的 Scrapy 抓取工具只返回第二页结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18862071/