Scrapy 下一页链接

Scrapy Next Page Links

网站 (https://www.bernama.com/en/crime_courts/) 使用相同的 class 名称 a="page-link" 所有分页 link秒。我的目标是在右侧获得下一个按钮,但无法区分上一个按钮、数字按钮和下一个按钮。我当前的代码试图从数组中取出最后一个元素但失败了。

start_urls = {
    'https://www.bernama.com/en/crime_courts/'
}

def parse(self, response):
    for news in response.css('div.col-7.col-md-12.col-lg-12.mb-3'):
        yield{
            'title' : news.css('a.text-dark.text-decoration-none::text').get(),
            'link' : news.css('a.text-dark.text-decoration-none::attr(href)').get()
        }

    next_page = response.css('a.page-link::attr(href)').getall()

    if next_page[-1] != "#":
        yield response.follow(next_page, callback = self.parse)

您只是在

中忘记了[-1]
yield response.follow( next_page[-1] )

完整的工作代码,但我使用较短的 css 选择器

下一页使用相对 URL,因此需要 response.urljoin() 创建绝对 URL。

import scrapy

class MySpider(scrapy.Spider):
    
    name = 'my_spyder'
    
    start_urls = ['https://www.bernama.com/en/crime_courts/']
    
    def parse(self, response):
        print("url:", response.url)
        
        for news in response.css('h6 a'):
            yield {
                    'title': news.css('::text').get(),
                    'link' : response.urljoin(news.css('::attr(href)').get()),
                    #'link' : response.urljoin(news.attrib['href']),
                    'page' : response.url,
                  }
    
        next_page = response.css('a.page-link::attr(href)').getall()
    
        if next_page[-1] != "#":
            yield response.follow(next_page[-1])
    
from scrapy.crawler import CrawlerProcess

c = CrawlerProcess({
    'USER_AGENT': 'Mozilla/5.0',
    'FEEDS': {'output.csv': {'format': 'csv'}},  # new in 2.1
})
c.crawl(MySpider)
c.start() 

顺便说一句:

css 选择器的两个版本也都获得了指向 YouTube 上视频的链接,但它们在每个页面上都是相同的,而且 CVS 多次具有相同的链接。

如果您只需要新闻而不需要视频,则可能需要获取包含 row 和文本 More news 的部分,稍后仅在该部分中搜索。

sections = response.xpath('//div[@class="row"]/div[div[@class="row"]//span[contains(text(), "More news")]]')
#print(sections)

for news in sections[0].css('h6 a'):
    yield{
        'title': news.css('::text').get(),
        'link' : response.urljoin(news.css('::attr(href)').get()),
        'page' : response.url,
    }