scrapy爬虫获取简书作者所有文章

作者: 安和然 | 来源:发表于2017-12-03 12:56 被阅读66次

    好久没有更新文章了,因为最近在学习python,每天都花很多时间在练习,没有写文章,也没有写日记。

    总结下来,这是不好的,好多东西没有记录,就消散在风中了。

    所以,把最近练习的一些内容记录在这里。

    在items.py中定义如下:

    # -*- coding: utf-8 -*-
    
    # Define here the models for your scraped items
    #
    # See documentation in:
    # http://doc.scrapy.org/en/latest/topics/items.html
    
    import scrapy
    
    
    class MyspiderItem(scrapy.Item):
        # define the fields for your item here like:
        # name = scrapy.Field()
        title = scrapy.Field()
        time_write = scrapy.Field()
        artical = scrapy.Field()
    

    简书文章加载中有一个机制,是异步动态加载的。也就是下拉过程中不断的增加文章。因此,需要获得直接的链接地址。

    浏览器F12查看源码,选择Network下的XHR,下拉后可以看到加载的全过程。

    image

    链接如下:

    2.jpg

    得到真实链接后,在Spider里这样写:

    # -*- coding: utf-8 -*-
    import scrapy
    from mySpider.items import MyspiderItem
    import sys
    reload(sys)
    sys.setdefaultencoding('utf-8')
    
    
    class JianshuSpider(scrapy.Spider):
        name = 'jianshu'
        allowed_domains = ['jianshu.com']
        page = 1
        #这里输入简书作者的文章列表链接
        start_urls = ['http://www.jianshu.com/u/rHypHw?order_by=shared_at&page=' + str(page)]
    
        def parse(self, response):
            #识别第N页文章列表中,每一篇文章的链接
            node_list = response.xpath("//a[@class='title']/@href").extract()
            for node in node_list:
                url = "http://www.jianshu.com" + node
                #回调parse_arti获取文章详细内容
                yield scrapy.Request(url, callback = self.parse_arti)
            for next_page in range(2, 58):#这个数值根据作者的文章数来确定。文章数/8
                next_url = 'http://www.jianshu.com/u/rHypHw?order_by=shared_at&page=' + str(next_page)
                print("read" + str(next_page))
                #回调parse解析下一页文章列表
                yield scrapy.Request(next_url, callback=self.parse)
    
        def parse_arti(self, response):
            item = MyspiderItem()
            #文章标题
            item['title'] = response.xpath("//h1/text()").extract()
            #文章发布时间
            item['time_write'] = response.xpath("//span[@class='publish-time']/text()").extract()
            #文本内容
            atical_list = response.xpath("//div[@class='show-content']")
            for a in atical_list:
                item['artical'] = a.xpath("./p/text()").extract()
            yield item
    

    直接保存为json文件,pipelines.py文件如下

    # -*- coding: utf-8 -*-
    import json
    # Define your item pipelines here
    #
    # Don't forget to add your pipeline to the ITEM_PIPELINES setting
    # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
    import json
    
    class MyspiderPipeline(object):
        def __init__(self):
            self.f = open('jianshu.json', 'w')
    
        def process_item(self, item, spider):
            line = json.dumps(dict(item)) + '\n'
            # print line
            self.f.write(line.decode("unicode_escape"))
    
            return item
    
        def close_spider(self,spider):
            self.f.close()
    

    初学者,请高手指教。

    相关文章

      网友评论

      • 知识学者:看来我的网络微博知识有待加强啊,
        是异步动态加载的。也就是下拉过程中不断的增加文章:grin:

      本文标题:scrapy爬虫获取简书作者所有文章

      本文链接:https://www.haomeiwen.com/subject/lxyabxtx.html