Python 如何增加链接

Python 如何增加链接,python,web-scraping,scrapy,scrapy-spider,scrapy-splash,Python,Web Scraping,Scrapy,Scrapy Spider,Scrapy Splash,我有一个链接: 我想像这样增加链接: 然后是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 = ['ht

我有一个链接:

我想像这样增加链接:

然后是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中增加它。

您需要以这种方式使用XPath表达式

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

试试看,它应该可以工作。

你是对的,它没有在页面源中找到,与你检查页面时的位置相同。但是,您可以在
下的页面源代码中看到它

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

另一个解决方案


不,它不返回任何内容。:/我认为他们正在使用javascript进行分页,这就是为什么我们无法通过HTML parsingCool方式点击链接的原因,但我知道这是不可能的,但是Xpath查询的每个页面都会给我相同的结果,即:。甚至对于:xpath提供了第2页的链接。请你查一查。@AshishKapil你确定吗?它对我很有用,第6页它给了我
Out[1]:u'https://www.monster.ca/jobs/search/?q=data-analyst&page=7'
在Scrapy shell中。您的查询非常完美,我想我在这方面遇到了一个问题,无论我给Scrapy shell的页面是什么,无论它只加载第一个页面。再次非常感谢Tomas:)@AshishKapil你可以用Scrapy shell会话的记录更新问题,这样我们就可以看一看,也许我们可以找出问题所在。嗨,我添加了shell的屏幕截图,其中我给出了第3页的链接,但它仍然给出了第2页(这意味着它仍然在第一页)如果我不说您的方法涉及使用
请求而不是Scrapy,那么还有另外两点。首先,您可以在URL中立即传递查询参数,其次,您不会给出如何获取最后一页编号的提示。@TomášLinhart他问如何调用“下一页”,我的回答告诉他如何进入下一页,您是对的,我们可以传递参数,但我的答案没有错,你的否定点也没有理由:)无论如何,我认为这对于获得最后一页来说太清楚了,我们不是来做所有部分的代码的,但我编辑了我的答案,并告诉他如何做!IMHO答案应完整,无任何故意遗漏的信息(例如,从何处获取最后页码)。此外,当您使用的方法涉及OP使用的工具以外的其他工具(
请求
库而不是本机的Scrapy解决方案)时,您应该给出如何在其当前设置中解决问题的提示(即如何从
请求的响应中提取信息。get()
调用)@TomášLinhart尽管我的回答正确,你还是要证明你的否定点是正确的,好吧,我编辑了我的帖子,并要求你给他一个完整的答案!
for page_number in xrange(2, last_page):
   #put page_number in params
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)