前面爬文章,都是爬去静态的,这里要开始分析动态加载的网站,但是我这里还没有用到splash 渲染,因为我在分析JS脚本的时候,发现了规律,然后我用一个比较笨的办法来爬文章。话不多说,直接开始。
首先我们看博主的首页,他总共写了238篇文章
但是当我们使用检查的时候,却只能看到最近发的文章,以前的没有加载出来,也就是为什么按照我之前的爬,只能爬一点点。
而且当我们下滑鼠标的时候,我们发现可以加载文章出来。
通过chrome浏览器的检查network功能,我们发现有个脚本在运作。
咱们看具体一点
下面的方法比较暴力,也比较笨拙,我一点一点下拉,拉倒第一篇文章为终止,也就是hello world
我发现参数是28
那我只需要在我的爬虫中,编一个循环就OK了,话不多数说,直接上代码
def start_requests(self):
j = 0
while j < 28:
next_url = "https://www.jianshu.com/u/9ea40b5f607a?order_by=shared_at&page=" + str(j)
j = j + 1
yield scrapy.Request(next_url, callback=self.parse)
上面这个是核心,下面放到总的spider中去看看
import scrapy
from ..items import SpiderProjectItem
from scrapy import Request
from scrapy_splash import SplashRequest
class HoptopSpider(scrapy.Spider):
name = 'hoptop'
allowed_domains = ['www.jianshu.com/u/9ea40b5f607a']
base_urls = ['http://www.jianshu.com/u/9ea40b5f607a/']
def start_requests(self):
j = 0
while j < 28:
next_url = "https://www.jianshu.com/u/9ea40b5f607a?order_by=shared_at&page=" + str(j)
j = j + 1
yield scrapy.Request(next_url, callback=self.parse)
def parse(self, response):
content = SpiderProjectItem()
titles = response.xpath('//*[@id]/div/a/text()').extract()
#for one in titles:
# content['title'] = one
# yield content
#abstracts = response.xpath('//*[@id]/div/p/text()').extract()
n = len(titles)
i = 0
while i < n :
content['title'] = titles[i]
i = i + 1
yield content
j = 0
然后咱们运行一下
scrapy crawl hoptop -o titles.csv
成功,但是感觉细节还是要修改一下