Advertisement

python爬虫-scrapy基于Spider类的全站数据爬取

阅读量:

通常情况下,在我们访问某些网站时

当我们使用scrapy框架处理多页数据时有两种方法

用于存储每一页对应的url到爬虫文件中的start_urls字段。然而,在网页数量较多的情况下(如果网页数量较多),start_urls字段中的列表规模会显著增大。

使用Request方法手动发起请求 (推荐使用)

调用Request对象向目标页面发送一次手动请求,并从古诗文网上获取每一页的诗歌标题。

复制代码
    import scrapy
    
    class GushiSpider(scrapy.Spider):
    name = 'gushi'
    start_urls = ['https://www.gushiwen.org/']
    
    pageNum = 2 #pageNum为2,第一页已经爬取过了 
    url = 'https://www.gushiwen.cn/default_%d.aspx' #每页的url是类似的
    
    def parse(self, response):
        div_list = response.xpath('//div[@class="sons"]/div[1]/p[1]')
        print(str(len(div_list))+"首古诗")
        for div in div_list:
            title = div.xpath('./a/b/text()').extract()
            print(title)
        print("------------------------")
    
        # 爬取所有页码数据    
        if self.pageNum <= 10: #一共爬取10页(共10页)
            self.pageNum += 1
            url = format(self.url % self.pageNum)   # 每一页的url和pageNum有关
    
        # 手动发起请求: scrapy.Request(url,callback,meta)
            ## url是需要发起请求的url,
            ## callback参数的值是回调函数,即发起请求后需要调用哪一个方法
            ## meta参数的值是一个 字典,表示的是向回调函数传递什么样的参数
    
        # 向上面格式化的url发起请求,callback递归调用parse()方法,将得到的数据继续进行解析
        yield scrapy.Request(url=url,callback=self.parse)

输出结果

在这里插入图片描述
  • 注意事项 * 第一条:由于 scrapy.Request() 在调用解析函数时会触发递归过程, 因此必须设置递归终止条件, 即 if self.pageNum <= 10:
  • 第二条:为了识别不同页 url 的差异性, 必须使用 format() 方法生成 url 格式化字符串
  • 第三条:在 scrapy.Request(url=url,callback=self.parse) 中, 当使用 callback 函数时, 必须传递给 callback 的参数中需要包含解析函数名称或实例

全部评论 (0)

还没有任何评论哟~