此前已经做过一些对于ajax网站的爬取,或分析ajax规则,或使用selenium+chromedriver去爬取,但它们都是在scrapy框架外实现的,那么,怎么利用scrapy框架去爬取带有ajax加载数据的信息呢。
以简书为例:
如上图,我们发现有些文章它被较多的专题收录,那么我们想要获取没有显示出来的专题,该怎么办呢。
然后,我们明确要做的是简书的整站爬虫,怎么能确保爬下来所有的内容呢。
第一,我们可以用scrapy对接selenium+chromedriver让它模拟浏览器,不停的点击“展开更多”,来获取所有专题
第二,我们使用通用爬虫,定义爬取规则,由于每篇文章下,都有推荐阅读,如下:
我们不停地获取推荐,根据推荐的推荐一直爬取,理论上就可以做到整站爬取。
那么。明确了这两点,我们就可以开始写代码了。
首先创建一项目:
scrapy startproject jianshu
scrapy genspider -t crawl js jianshu.com
我们用pycharm打开这个项目:
首先,我们明确一下获取那些数据,这里简单点,先写items.py:
import scrapy
class JianshuItem(scrapy.Item):
#简单获取四项信息,标题,作者,内容,标签
#其中标签如果有多项是通过点击获取
title = scrapy.Field()
author = scrapy.Field()
content = scrapy.Field()
tags = scrapy.Field()
然后是js.py:
import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from jianshu.items import JianshuItem
class JsSpider(CrawlSpider):
name = 'js'
allowed_domains = ['jianshu.com']
start_urls = ['https://www.jianshu.com/']
#提取规则根据首页和文章页下的推荐url获取,放入parse_detail解析,跟进爬取
rules = (