2017-08-23 54 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)。 –