【问题标题】:Web scraping with pagination doesn't return all results使用分页进行网页抓取不会返回所有结果
【发布时间】:2022-02-16 03:17:55
【问题描述】:

我正在尝试抓取 Indeed.com,但遇到了分页问题。 这是我的代码:

import scrapy
class JobsNySpider(scrapy.Spider):
    name = 'jobs_ny'
    allowed_domains = ['www.indeed.com']
    start_urls = ['https://www.indeed.com/jobs?q=analytics&l=New%20York%2C%20NY&vjk=7b2f6385304ffc78']

    def parse(self, response):
        jobs = response.xpath("//td[@id='resultsCol']")
        for job in jobs:
            yield {
                'Job_title': job.xpath(".//td[@class='resultContent']/div/h2/span/text()").get(),
                'Company_name': job.xpath(".//span[@class='companyName']/a/text()").get(),
                'Company_rating': job.xpath(".//span[@class='ratingNumber']/span/text()").get(),
                'Company_location': job.xpath(".//div[@class='companyLocation']/text()").get(),
                'Estimated_salary': job.xpath(".//span[@class='estimated-salary']/span/text()").get()
        }

        next_page = response.urljoin(response.xpath("//a[@aria-label='Next']/@href").get())

        if next_page:
           yield scrapy.Request(url=next_page, callback=self.parse)

问题是,根据 Indeed 的数据,有 28,789 个职位符合我的查询。 但是,当我将抓取的内容保存到 csv 文件时,只有 76 行。 我也试过: next_page = response.urljoin(response.xpath("//ul[@class='pagination-list']/li[position() = last()]/a/@href").get()) 但结果是相似的。 所以我的问题是我在处理分页时做错了什么。

【问题讨论】:

    标签: web-scraping pagination scrapy


    【解决方案1】:
    1. 问题不在于分页,而在于您只能从每一页获得一份工作。
    2. 最好在 if 语句后加上urljoin,以免出错。
    import scrapy
    
    
    class JobsNySpider(scrapy.Spider):
        name = 'jobs_ny'
        allowed_domains = ['www.indeed.com']
        start_urls = ['https://www.indeed.com/jobs?q=analytics&l=New%20York%2C%20NY&vjk=7b2f6385304ffc78']
    
        def parse(self, response):
            jobs = response.xpath('//div[@id="mosaic-provider-jobcards"]/a')
            for job in jobs:
                yield {
                    'Job_title': job.xpath(".//td[@class='resultContent']/div/h2/span/text()").get(),
                    'Company_name': job.xpath(".//span[@class='companyName']/a/text()").get(),
                    'Company_rating': job.xpath(".//span[@class='ratingNumber']/span/text()").get(),
                    'Company_location': job.xpath(".//div[@class='companyLocation']/text()").get(),
                    'Estimated_salary': job.xpath(".//span[@class='estimated-salary']/span/text()").get()
                }
    
            next_page = response.xpath("//a[@aria-label='Next']/@href").get()
    
            if next_page:
                next_page = response.urljoin(next_page)
                yield scrapy.Request(url=next_page, callback=self.parse)
    

    【讨论】:

    • 谢谢你,超级用户!它解决了我的问题。我尝试了 'jobs = response.xpath('//div[@id="mosaic-provider-jobcards"]/a')' 和我的 'jobs = response.xpath("//td[@id='resultsCol ']")' 在语句之后使用 url join,但只有 'id="mosaic-provider-jobcards' 有效。你知道为什么会这样吗?
    • response.xpath("//td[@id='resultsCol']") 将为您提供工作的容器,但不是工作本身。因此,for 循环将只有一次迭代,您将只获得每个页面的第一个作业。
    • 再次感谢 @SuperUser 帮助我理解它!
    • @shq 没问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-17
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2021-11-15
    相关资源
    最近更新 更多