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,
}
网站 (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,
}