使用 scrapy 框架抓取 monster.com

Scrape monster.com using scrapy framework

如何为 monster.com 创建一个抓取器来抓取所有页面。对于 "next page" link,monster.com 调用了 javascript 函数,但 scrapy 无法识别 javascript

这是我的代码,它不适用于分页:

import scrapy
class MonsterComSpider(scrapy.Spider):
    name = 'monster.com'
    allowed_domains = ['www.monsterindia.com']
    start_urls = ['http://www.monsterindia.com/data-analyst-jobs.html/']

    def parse(self, response):
        urls = response.css('h2.seotitle > a::attr(href)').extract()

        for url in urls:
            yield scrapy.Request(url =url, callback = self.parse_details)

    #crawling all the pages

        next_page_url = response.css('ul.pager > li > a::attr(althref)').extract()
        if next_page_url:
           next_page_url = response.urljoin(next_page_url) 
           yield scrapy.Request(url = next_page_url, callback = self.parse)            


    def parse_details(self,response):
        yield {         
        'name' : response.css('h3 > a > span::text').extract()
        }

您的代码抛出异常,因为 next_page_url 是一个 list 并且 response.urljoin 方法需要一个字符串。下一页 link 提取应该是这样的:

next_page_url = response.css('ul.pager > li > a::attr(althref)').extract_first()

(即将 extract() 替换为 extract_first()

编辑:

next_page_url 提取还有另一个问题。所有逻辑都是正确的,分页有效,但下一页 link 仅适用于第一页。它需要第一页 a,但在第二页上,还有 上一页 页 link。修改下一页url提取为:

next_page_url = response.css('ul.pager').xpath('//a[contains(text(), "Next")]/@althref').extract_first()

现在它可以正确地对所有页面进行分页。