scrapy 如何定义start_url来用scrappy抓取文章?

cczfrluj  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(162)

我试着从这个网站上刮文章。到目前为止,我所做的计划是:

  • start_urls可以覆盖网站中的所有页面
  • parse函数用于捕获详细信息页面,其中包含我需要的所有信息
  • parse_item用于获取我需要的信息(日期、标题和全文)
  • 我使用response.xpath来获取信息。
import scrapy
from scrapy.crawler import CrawlerProcess

class weeklymining(scrapy.Spider):
    name = 'weeklymining'
    start_urls = ['https://www.miningweekly.com/page/coal/page:'+str(x) for x in range(1,4)]

    def parse(self, response):
        for link in response.xpath('//*[@class="en-serif"]/a/@href'):
            yield scrapy.Request(
                url=link.get(),
                callback=self.parse_item
            )

    def parse_item(self, response):
        yield {
            'date': response.xpath('//*[@class="sml"]/p/span[1]').get(),
            'category': 'coal',
            'title': response.xpath('//*[@class="article_title"]/h2/a/text()').get(),
            'text':''.join([x.get().strip() for x in response.xpath('//*[@id="article_content_container"]//p//text()')])
            }
if __name__ == '__main__':
    process = CrawlerProcess()
    process.crawl(weeklymining)
    process.start()

当我运行代码时,它给我错误:2022-07-14 23:14:28 [scrapy.core.scraper] ERROR: Spider error processing <GET https://www.miningweekly.com/page/coal/page:1> (referer: None)
我可以打开网址,但似乎代码不能处理网址。
我应该如何修复我的代码,以便从网站获得所需的信息?
非常感谢你的帮助

6mzjoqzu

6mzjoqzu1#

出现错误是因为此行url=link.get()生成了一个无法搜索的相对URL。您可以将其与基本URL连接以形成完整的URL,也可以使用response.follow快捷方式,如下所示:

import scrapy
from scrapy.crawler import CrawlerProcess

class weeklymining(scrapy.Spider):
    name = 'weeklymining'
    start_urls = ['https://www.miningweekly.com/page/coal/page:'+str(x) for x in range(1,4)]

    def parse(self, response):
        for link in response.xpath('//*[@class="en-serif"]/a/@href'):
            yield response.follow(
                url=link.get(),
                callback=self.parse_item
            )

    def parse_item(self, response):
        yield {
            'date': response.xpath('//*[@class="sml"]/p/span[1]').get(),
            'category': 'coal',
            'title': response.xpath('//*[@class="article_title"]/h2/a/text()').get(),
            'text':''.join([x.get().strip() for x in response.xpath('//*[@id="article_content_container"]//p//text()')])
            }
if __name__ == '__main__':
    process = CrawlerProcess()
    process.crawl(weeklymining)
    process.start()

相关问题