欢迎光临散文网 会员登陆 & 注册

爬虫搜索知网文章及摘要

2023-06-18 15:22 作者:一把江湖刀sss  | 我要投稿

这期教程是为了爬取知网上搜索出来的文章和摘要,建议先看上期教程:

python爬取小说教程

先看我们要爬取下面的目标:

就是上面的样子,搜索出来的文章和摘要进行爬取,我们先打开知网:

然后点开高级搜索:

输入我们想要搜索的内容:

然后不要点检索,先打开开发者选项(F12,没反应的话看设置),检查检索后会进行哪些操作:

然后我们点检索:

可以看到我们的网页中显示出了文章,下面的开发者工具中录制了该过程发生的一些请求

爬取这个的难点在于该搜索过程网页地址并没有变化,浏览器上的变化是对服务器进行post请求之后由服务器返回html文件然后显示在浏览器上

我们点开这个html文件可以看到,这是一个post请求:

关于post请求:
简单理解为post请求将给服务器一些数据,然后服务器根据这些数据返回给请求方相应的数据

我们可以查看post的负载(给服务器的数据):

还有他的响应(服务器返回的数据):

可以看到,返回的是一个html文件内容

在这个html文件中我们可以看到浏览器上显示的数据:

题目前面的是该文章的链接,不过是相对于该网站的域名而言,我们可以在其前面加上该网站的域名,粘贴到浏览器地址栏进行访问:

注意是高级检索页面的域名而不是知网主站的域名★

和我们直接从搜索网页点过去的界面相同(点之前注意关闭开发者选项的录制)

注:进入该页面之后会发现页面的链接和刚刚复制访问的链接时不一样的

我们的目的时直接爬取摘要,在搜索网页中可以直接点击切换显示按钮显示出摘要(注意打开开发者选项的录制和保存日志),也可以切换显示页数:

然后我们可以在页面和第二个html请求中看到摘要:

然后我们检查一下两个html请求的负载:
第一个:

第二个:

可以看到负载的主要变化是:

  1. isSearch由true变为false

  2. 多了一个SearchSql参数

当然有兴趣的话可以尝试切换每一页的条数,会导致负载的变化是改变RecordsCntPerPage值:

到了这里,我们可以有大概的思路:

使用python的requests库模拟post请求,然后将这些数据传输过去,就可以得到我们要爬取的东西。

_________________________________________________________________________

理论上这个思路是可行的,我现在就可以说结果:

可行,但是不全可行

我遇到的问题是:我们直接模拟第二个请求的数据传输过去得不到我们想要的摘要,所以我们只能使用第一个请求然后一个个访问到其中的链接中进行爬取里面的摘要,该文章我只写到获取这些文章的链接,至于如何爬取各个链接里面的摘要,请参照上个教程中的爬取小说的代码。

_________________________________________________________________________

那么接下来我们就开始写代码:

代码会放在文章末尾,我们先来分析代码:

代码主要围绕着requests的post请求展开,将一系列参数定义然后传递进去,其中,data的参数传递,由于python和网页上的代码格式不同,传参时要注意:

使用字典传参数,字典的值只能是字符串或者int类型,例如IsSearch应该传递字符串类型的'true'而不是布尔类型的True,QueryJson的值类似于字典类型,但是传递时要加上引号使其变为字符串

请求头也是在网页上查找到的(详见上一篇教程),经过测试,只需要保留这三个即可。

后面的代码就是对该html进行筛选,使用BeautifulSoup里的findAll方法,寻找到a标签,class值为"fz14"的所有列,因为他们在同一个div标签下,所以得到的列表是个一维列表,然后使用text得到文章名,使用get方法获取到href的值,即文章的链接,并把他们保存到列表中。

注意,上传的源代码已经删除本人的请求头和Cookie,请自行获取自己的Cookie和请求头

代码链接:

链接:https://pan.baidu.com/s/1zVLNiqr72a3c-BlWiDB7FQ?pwd=4567 

提取码:4567 

—————————————————————————————————————————

关于代码中无法爬取带摘要的html请求的一点可能性推测:

  1. IsSearch的值变成了false,证明服务端可能并没有进行搜索,而是根据新添加的Searchsql在数据库中对这些文章进行查询,将查询到的内容再表现到网页上

  2. 我们在python中进行第一次的请求,可以对服务端进行查询,但是查询到的结果并没有存储到某个位置,但是在网页上确实已经表达在浏览器上,只需要做一些类似于我们python中的操作把链接爬取出来,然后对数据库进行这些文章的搜索,并返回摘要即可

个人猜测,仅供参考,注:第二个请求除了文章中提到的变化(IsSearch,Searchsql)外还有其他变化,可以自行查找

另外,如果有人找到了正确的方法,可以在评论区告诉我,感激不尽。


爬虫搜索知网文章及摘要的评论 (共 条)

分享到微博请遵守国家法律