| by 鲍 建伟 | No comments

爬取CSDN文章

1.先大概看下CSDN的请求

首先用 Firefox 新建一个隐私窗口,然后访问https://www.csdn.net/这个链接。使用隐私窗口看请求比较好的一点就是,当隐私窗口每次退出时,Firefox 将删除你浏览时存储的 cookie、历史记录和密码。就像测试时候纯净的环境一样,给我一个纯净的浏览器环境。

在这里我们可以看到,请求头的结构,响应头的结构和set-cookie的结构,在这里,我们主要看响应头和响应首部内的set-cookie,set-cookie 是服务器端向客户端发送的cookie。也就是说我们以后发送给服务器的所有请求都要带上set-cookie内的键值对,这样服务器才知道访问网站的人就是我。下一步我们实验一下,确认一下CSDN使用这个cookie到底是不是 set-cookie(其实肯定是这样的,这实验就是个流程而已) ,如下图:

cookie

双击cookie,拷贝出cookie的value,可以看出,cookie需要:

acw_tc=*******
uuid_tt_dd=********
dc_session_id=*********

这就是set-cookie设置的三个值嘛,所以以后基本不用看后面,直接看set-cookie里面有什么,每次请求时候带上同样的值,服务器就会识别到我。

关于set-cookie的详细解释在这里:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie

看完了cookie怎么发,我们再来看请求头:

一般来说啊,我们伪装好User-Agent和 Referer 即可,但是为了免去后续的奇怪的麻烦,比如有的网站不只是通过UA和 Referer来分辨来访者是人的点击还是爬虫,所以索性我们把所有的请求头都设置成跟浏览器一模一样就好。

解释一下UA,UA就是让服务器能够识别客户使用的操作系统及版本、浏览器及版本等信息等等,Referer 就是告诉服务器我是从哪个页面点过来的,比如我从百度搜索CSDN,点击链接进入,那我们的浏览器对CSDN发起的请求头中的Referer 值就是 https://www.baidu.com。

综上,我们使用Python第一次请求CSDN的伪装头如下:

headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; …) Gecko/20100101 Firefox/68.0',
        'Upgrade-Insecure-Requests: 1': 1,
        'Referer': 'https://www.google.com/',
        'Host': 'www.csdn.net',
        'Connection': 'keep-alive',
        'Cache-Control': 'max-age=0',
        'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8'
    }

请求完毕之后我们再取响应头中的set-cookie,之后每次请求csdn都带上cookie,服务器就可以分辨出我是谁了。

接下来我们再继续看,依旧使用Firefox 的开发者工具,我们暂时以首页为例,发现CSDN并没有翻页键,当滚动到页面底部的时候,页面才会自动加载,就是个瀑布流,感觉还挺尊贵,使用Firefox 开发者工具查看发现,每当翻到页尾的时候,便有一个奇怪的请求发出去:

检查这个请求,发现这个请求就是加载后续文章的嘛,看响应的JSON,结构内有title(文章标题)和文章的URL信息等等,总之很详细,唯一问题就是这个请求URL,把请求URL拷贝出来,如下:

https://www.csdn.net/api/articles?type=more&category=home&shown_offset=1564294058366833

发现URL的最后面有一串莫名其妙的数字,看着好像是时间戳一样,看位数,应该是1564294058366.833 * 1000,1564294058366.833就是时间戳,我第一想法是,要么是CSDN最后一篇文章的发布时间戳,或者是当前时间戳,先去首页源码内搜索,发现:

<ul class="feedlist_mod home" id="feedlist_id" shown-offset="1564294058366833">

上面的代码就是网页源码内搜索到的时间戳。

基本分析完了,开始写吧!冲!基本流程就是这样:

1.伪装头部请求CSDN主页,获取cookie和时间戳
2.根据时间戳来请求页面,模拟鼠标滚轮向下滚动的操作。
3.获取大量文章的链接,逐个爬取内容

2.代码

还没写呢,公司停电了。。。

发表评论