python - 为什么我的 Scrapy 抓取工具只返回第二页结果?

标签 python regex screen-scraping scrapy

我的大学即将开学,因此我决定为“评价我的教授”构建一个网络爬虫,以帮助我找到学校评价最高的老师。抓取刀工作得很好......但仅限于第二页!无论我如何尝试,我都无法让它正常工作。

这是我从中抓取的 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/

相关文章:

python - 为什么 Python 中的 float 对象没有分母属性,而 int 有?

python - 我试图在两次之间循环,从 8 :00 to 17:00 for every 15 mins

python - 测试代码是否从 py.test session 中执行

javascript - 以 Peg.js 方式表示正则表达式

java - 如何使用 HTML Parser 获取 HTML 页面中所有标签的完整信息

python - 带有 readPlist 和 AttributeError 的 DeprecationWarning

c - gRegex 不解析“字符

sql - 使用 SED 匹配 sql 转储中的电子邮件并替换它们

html - 我应该使用什么语言/工具来解析 HTML?