scrapy爬虫获取简书作者所有文章
2017-12-03 本文已影响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()
初学者,请高手指教。