2017-08-23 148 views
-2

我有一個鏈接: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。

回答

2

你是正確的,它不是在同一個地方的頁面的源代碼,當你檢查頁面發現。但是,你可以看到它的存在<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() 
+0

酷路的鏈接,但我知道這是不可能的,但每一頁你的XPath查詢是給我的相同的結果是:https://www.monster.ca/jobs/search/?q=data-analyst & page = 2。 即使是:https://www.monster.ca/jobs/search/?q=data-analyst&page=6 XPath是給鏈接,頁碼2.能否請你檢查。 –

+0

@AshishKapil你確定嗎?它適用於我,在第6頁,它給了我Scrapy shell中的[Out] [1]:u'https://www.monster.ca/jobs/search/?q = data-analyst&page = 7''。 –

+0

你的查詢是完美的,我想我有一個問題在我的最後,無論什麼頁面我給scrapy外殼,無論它只是加載第一頁。 非常感謝再次托馬斯:)) –

0

您需要XPath表達式以這種方式

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

嘗試,它應該工作。

+0

沒有,它沒有返回。 :/ 我想他們用JavaScript來實現分頁,這就是爲什麼我們不能打解析HTML –

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

另一種解決方案

enter image description here

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) 
+0

如果我放下你的方法涉及使用'請求'而不是Scrapy,那麼還有兩點。首先,您可以立即在URL中傳遞查詢參數,其次您不會提供有關如何獲取最後一個頁碼的提示。 –

+0

@TomášLinhart他問如何打電話給'下一頁',我的回答告訴他如何進入下一頁,你是對的,我們可以傳遞參數,但我的回答沒有錯,而且沒有理由給你消極點:)無論如何,我認爲這對獲取最後一頁太清楚了,我們不是在這裏做所有的代碼部分,但我編輯我的答案,並告訴他如何做到這一點! – parik

+0

恕我直言,答案應該是完整的,沒有任何故意遺漏的信息(例如,在哪裏得到最後一頁的號碼)。另外,當你使用涉及OP以外的其他工具的方法('request'庫而不是原生Scrapy解決方案)時,你應該給出一個關於如何在他當前設置中解決問題的提示(即如何從' requests.get()'call)。 –