声明:本人也是一个爬虫新手,有些地方可能写的并不好,望各位大佬见谅。
第一步:抓包
因为是动态页面,所以我们需要通过抓包来找到每次发送的请求内容,以及接口url。
1.这里采用了FIddler工具进行抓包,滚动CSDN主页,查看第一次刷新出来的数据:
2.接下来查看Fiddler工具抓到的请求数据以及接口url:
发送的请求数据:
3.拿到接口url后,放到浏览器上访问一下:
https://www.csdn.net/api/articles?type=more&category=home&shown_offset=1517142889684478
emmm…有数据就好,就不进行转码了,肯定是和Fiddler工具抓到的json内容一样的。
4.分析接口url:
猜想:红线是类型,类型为more。
黄线是类别,类别应该是首页的意思。
蓝线是参数,看到这种数字首先想到的可能就是时间戳。
5.定义要抓取内容:
前期准备工作结束。接下来就开始写代码
第二步:码代码
1.创建好了spider工程以后,先写items.py:
import scrapy
class CsdnhomepageItem(scrapy.Item):
# 作品类型
article_type = scrapy.Field()
# 发布时间
created_time = scrapy.Field()
# 作者
nick_name = scrapy.Field()
# 文章标题
article_title = scrapy.Field()
# 文章链接
article_link = scrapy.Field()
2.编写CsdnspiderSpider.py:
这个文件在建立工程的时候没有新建,所以需要自己创建。
import scrapy
import time
import json
from CSDNHomePage.items import CsdnhomepageItem
class CsdnspiderSpider(scrapy.Spider):
# 爬虫名称
name = 'CSDNSpider'
allowed_domains = ['https://www.csdn.net/']
def start_requests(self):
# 这里规定只爬10次
for i in range(0, 10):
# 拿到当前时间戳 拼接成url
url_time = int(time.time() * 1000000)
url = "https://www.csdn.net/api/articles?type=more&category=home&shown_offset=" + str(url_time)
# 发送请求 在pares中处理最后的返回结果
yield scrapy.Request(url, callback=self.parse)
def parse(self, response):
# 拿到json数据
datas = json.loads(response.text)["articles"]
for data in datas:
# 将我们需要的数据都解析出来 并交给CsdnhomepagePipeline管道处理
item = CsdnhomepageItem()
item["article_type"] = data['category']
item["created_time"] = data['created_at']
item["nick_name"] = data['nickname']
item["article_title"] = data['title']
item["article_link"] = data['url']
yield item
3.编写pipeline.py:
这个文件要做对数据的保存等操作。
import json
class CsdnhomepagePipeline(object):
def __init__(self):
# 初始化一个文件
self.file_name = open("CSDN首页文章信息.json", "w")
def process_item(self, item, spider):
# 这里是将item先转换成字典,在又字典转换成字符串
# json.dumps转换时对中文默认使用的ascii编码.想输出真正的中文需要指定 ensure_ascii=False
# 将最后的item 写入到文件中
text = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file_name.write(text)
return item
def close_spider(self):
self.file_name.close()
4.修改setting.py文件:
为了启用Item Pipeline组件,必须将它的类添加到 settings.py文件ITEM_PIPELINES 配置:
在setting文件中ITEM_PIPELINE默认是被注释掉的,我们只需要释放出来就好了。其他地方不用管。
第三步:执行
因为我这里用的是PyCharm编写的Scrapy,所以再执行的时候可以有两种方法执行:
1.创建py文件执行:
创建一个py文件,名字可以随便起,主要是内容:
from scrapy import cmdline
# CSDNSpider爬虫名称
cmdline.execute("scrapy crawl CSDNSpider".split())
右键选择运行文件就好了。
2.在终端中敲”scrapy crawl CSDNSpider“,回车就好了:
第四步:结果
在同目录下会多一个json格式的文件,打开瞅瞅:
emmm…正是想要的结果
第五步:总结
主要学习了一下使用Pycharm使用Scrapy来爬取Ajax页面,看着并不是很难。
如果有哪里写错了的,请多多指教!