【问题标题】:How can I increment the link如何增加链接
【发布时间】:2017-08-23 13:24:44
【问题描述】:

我有一个链接:https://www.glassdoor.ca/Job/canada-data-jobs-SRCH_IL.0,6_IN3_KE7,11_IP1.htm

我想像这样增加链接:https://www.glassdoor.ca/Job/canada-data-jobs-SRCH_IL.0,6_IN3_KE7,11_IP2.htm

然后是 3,4,5.... 我的代码是:

# -*- coding: utf-8 -*-
import scrapy


class GlassdoorSpider(scrapy.Spider):

name = 'glassdoor'
#allowed_domains = ['https://www.glassdoor.ca/Job/canada-data-jobs-SRCH_IL.0,6_IN3_KE7,11.htm']
start_urls = ['https://www.glassdoor.ca/Job/canada-data-jobs-SRCH_IL.0,6_IN3_KE7,11_IP1.htm']

def parse(self, response):
    #main_url = "https://www.glassdoor.ca"
    urls = response.css('li.jl > div > div.flexbox > div > a::attr(href)').extract()

    for url in urls:            
            url = "https://www.glassdoor.ca" + url
            yield scrapy.Request(url = url, callback = self.parse_details)

    next_page_url = "https://www.glassdoor.ca/Job/canada-data-jobs-SRCH_IL.0,6_IN3_KE7,11_IP" 
    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{
        'Job_Title' : response.css('div.header.cell.info > h2::text').extract()

    }
    self.log("reached22: "+ response.url)

我想在变量 next_page_url 中增加它。

【问题讨论】:

    标签: python web-scraping scrapy scrapy-spider scrapy-splash


    【解决方案1】:

    您是对的,在您检查页面时在同一位置的页面源中找不到它。但是,您可以在<head> 下的页面源中看到它存在

    <link rel="next" href="https://www.monster.ca/jobs/search/?q=data-analyst&amp;page=2" />
    

    您可以使用它来提取它

    next_page_link = response.xpath('//head/link[@rel="next"]/@href').extract_first()
    

    【讨论】:

    • 很酷的方式,但我知道这是不可能的,但对于您 Xpath 查询的每个页面,都会给我相同的结果:monster.ca/jobs/search/?q=data-analyst&amp;page=2。即使是:monster.ca/jobs/search/?q=data-analyst&page=6 xpath 正在提供第 2 页的链接。请检查一下。
    • @AshishKapil 你确定吗?它对我有用,对于第 6 页,它在 Scrapy shell 中给了我Out[1]: u'https://www.monster.ca/jobs/search/?q=data-analyst&amp;page=7'
    • 你的查询很完美,我想我最后有一个问题,无论我给scrapy shell的任何页面,无论它只加载第一页。再次非常感谢托马斯 :))
    • @AshishKapil 您可以使用 Scrapy shell 会话的记录更新问题,以便我们看一下,也许我们会找出问题所在。
    • 嗨,我已经添加了 shell 的屏幕截图,其中我给出了 page 3 的链接,但它仍然给了我 page=2 ,(这意味着它仍然在第一页)跨度>
    【解决方案2】:

    为了获得第二页你可以这样做

    import requests
    
    headers = {
        'Pragma': 'no-cache',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4',
        'Upgrade-Insecure-Requests': '1',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
        'Referer': 'https://www.monster.ca/jobs/search/?q=data-analyst',
        'Connection': 'keep-alive',
        'Cache-Control': 'no-cache',
    }
    #for the other page, you should change page number
    params = (
        ('q', 'data-analyst'),
        ('page', '2'),
    )
    
    r = requests.get('https://www.monster.ca/jobs/search/', headers=headers, params=params)
    print r.text
    

    获取所有页面,你应该得到最后一页的数量,

    for page_number in xrange(2, last_page):
       #put page_number in params
    

    更新 1

    另一种解决方案

    def start_requests(self):
        request =  Request("https://www.monster.ca/jobs/search/?q=data-analyst", callback=self.get_lastPage)
        yield request
    
    def get_lastPage(self,response):
        headers = {
            'Pragma': 'no-cache',
            'Accept-Encoding': 'gzip, deflate, br',
            'Accept-Language': 'fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4',
            'Upgrade-Insecure-Requests': '1',
            'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36',
            'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8',
            'Referer': 'https://www.monster.ca/jobs/search/?q=data-analyst',
            'Connection': 'keep-alive',
            'Cache-Control': 'no-cache',
        }
        last_page = response.css('input#totalPages::attr("value")').extract_first()
        for last_page in xrange(2, int(last_page)):
            link = "https://www.monster.ca/jobs/search/?q=data-analyst&page=" + str(last_page)
            yield Request(link,
                            headers=headers, 
                            callback=self.parse_product)
    

    【讨论】:

    • 如果我撇开您的方法涉及使用requests 而不是 Scrapy,那么还有另外两点。首先,您可以在 URL 中立即传递查询参数,其次您不提示如何获取最后页码。
    • @TomášLinhart他问如何调用“下一页”,我的回答告诉他如何转到下一页,你是对的,我们可以传递参数,但我的回答没有错并且没有理由否定您的观点:) 无论如何,我认为获取最后一页太清楚了,我们不是在这里做所有代码部分,但我编辑我的答案并告诉他该怎么做!
    • 恕我直言,答案应该是完整的,没有任何故意遗漏的信息(例如,从哪里获得最后一页码)。此外,当您使用涉及 OP 以外的其他工具的方法时(requests 库而不是原生 Scrapy 解决方案),您应该提示如何在他当前的设置中解决问题(即如何从 @ 的响应中提取信息987654328@电话)。
    • @TomášLinhart 尽管我的回答正确,但你只是证明你的否定观点是合理的,好吧,np,我编辑了我的帖子并用 Request 给他一个完整的答案!
    【解决方案3】:

    你需要这种方式的XPath表达式

    urls = response.xpath('//*[contains(@class,"next")]//@href')
    

    试试吧,应该可以的。

    【讨论】:

    • 不,它什么也不返回。 :/ 我认为他们使用 javascript 进行分页,这就是为什么我们无法通过 HTML 解析点击链接
    猜你喜欢
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    • 2019-09-04
    • 1970-01-01
    相关资源
    最近更新 更多