帮粉丝写Python爬虫之【全网通用评论爬虫】

93 阅读10分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情

今天这篇文章最终结果就是我制作了一款自动评论器,但整体的设计思路其实扩展到全网所有涉及评论的地方。

当然代码只供学习使用,没有啥版权限制。 携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情 评论器制作需要限制频率,所以下述代码限制了,每分钟发1次,或者根据网站评论点的设计思路,进行整体设计。

写在前面,爬虫基础调研

我们需要大量的待评论文章,这些文章可以从不同分类文章页面进入,例如以下的链接,都是文章的列表:

等等,很多分类,分类的列表建议你整理成类似下述代码中的列表,方便后续罗列数据。

 urls = ["home", "career", "python", "web", "ops", "watchers",
            "java", "arch", "db", "5g", "game", "mobile", "sec", "engineering", "iot", "fund", "avi", "other", "ai", "blockchain", "cloud"]

评论接口需要通过开发者工具获取,例如下述内容。

post_url = "https://www.cnblogs.com/mypath/ajax/PostComment/Add.aspx"
post_url = "https://blog.csdn.net/phoenix/web/v1/comment/submit"

上述接口与传输数据稍微抓取一下即可,需要准备的数据参照图片后续描述:

Python爬虫入门教程 95-100 帮粉丝写Python爬虫之【全网通用评论爬虫】 Python爬虫入门教程 95-100 帮粉丝写Python爬虫之【全网通用评论爬虫】 对于每个评论接口,你都需要进行传输数据上的分析,例如:

以下代码中commentId冗余字段,可以为空,content 评论内容,articleId 被评论文章的ID,编码过程中最核心的应该是获取当前评论人的信息,也就是Cookies的获取,则部分你可以采用最笨的办法,就是网页登录,之后复制过去,也可以在编码过程中模拟登录,之后保存一份在本地。

data = {
        "commentId": "",
        "content": content,
        "articleId": articleId
    }

Python爬虫入门教程 95-100 帮粉丝写Python爬虫之【全网通用评论爬虫】 评论内容,你可以自己编写,定义到一个列表中,也可以通过抓取段子,笑话等内容作为补充,当然采用下述我提供的数据也可以。

数据如下,数据量非常大,简单拖动预览即可。

{"code":200,"message":"success","data":["写的很不错,感谢大神的分享!","感谢大佬分享,很详细。","学到了,支持!","点赞支持一下,原创不容易,深有体会。","博主,可以加你联系方式沟通交流吗?","大佬的文章,行云流水,字字珠玑,已关注收藏。","学到了,收藏一波~","很不错分享~进步的路上一起努力!也期待您的点赞支持!","博主写的非常清晰,对我很有帮助,谢谢,方便可以互相关注。共同学习~","总结的不错。可以可以。很强。继续加油~","这篇文章很不错,值得一看~","文章很赞,作者辛苦了!","学到了,非常值得一看。","走心好文,必须收藏!","啥都不说了,请收下我的膝盖!","太赞了!666666","大佬,我准备跟你混了!","佩服,佩服,一篇绝世好文!","厉害了!大佬就是大佬!","给大佬递茶~","看完这个后刷新了我对技术的认知!","技术懂得人很多,但懂得分享的人少之又少,支持大佬!","大佬,我要拜你为师!","很棒呀,学习啦,谢谢分享!","太优秀了!老铁~","真棒!茅塞顿开的感觉。","爱了爱了,干货满满,已收藏。","看来我还有好长的技术路要走啊!","大佬可否认识一下~","点赞支持一下,原创不容易,深有体会。","太实用了,准备一会试试。","大佬出品,必属精品~","一般不评论的,看到这感到非常的认同。","由浅入深,适合有基础的技术人员。","在CSDN学到了很多知识,真心希望CSDN越来越来好!","比较简单,适合小白。","分析的很到位,学到了很多,大赞!","写的这么好,建议付费!","写的不错,一起加油!","支持博主,支持CSDN!","大佬的文章一直是我坚持写作的动力。","帮助很大,拒绝白嫖,点赞打赏走一波~","最近也在学这个,博文真的写的挺好,感觉很有用~","原创不易,继续加油,已收藏。","大佬写的太棒了!支持多更!","深有感触,请问可以转载么?","这位仁兄高见,着实让人敬佩!","太精辟了!竖起我的大拇指!","都是博主辛苦创作,我来支持一下,奥利给!","为了我的爱马仕,冲冲冲!","活到老学到老,支持原创!","刚入行,特别需要这样的文章滋养,强烈推荐!","大佬的思考维度让人醍醐灌顶,牛皮PLUS!","进我的收藏夹吧~","老铁,你是吃代码长大的吗?","如此详细,付费也会支持!","学起来,头秃的那种~","好文,鉴定完毕!","博主真是开发界的杠把子啊!","文章非常有用,让我受益匪浅!","看君一席文,胜读十年书!","反手就是一个赞!","先占个坑,慢慢看。","代码之路任重道远,愿跟博主努力习之。","大佬辛苦了,难道您就是那天赋异禀之人?您必是时代的弄潮儿~","在最美的年华,做最好的自己,加油!","看了你的文章,内心的仰慕之情油然而生,赶紧给大佬点个赞!","很不错的文章,学到东西了!","感谢博主分享,学到不少东西!","好文!希望博主以后多多分享哈!","君之妙笔,令鄙不及,佩服佩服!","大佬的文章如行云流水,一气呵成,读后如醍醐灌顶,令我茅塞顿开~","学习的道路上一起进步,也期待你的关注与支持!","简单易懂,化繁为简!大师已登峰造极!","大佬的文章令我如痴如醉,请受小弟一拜~","放弃不难,但坚持一定很酷!","文采四溢,大佬这是被耽搁的文学家啊!","看三遍也看不够的好文,mark~","最近一直在找相关的资料,这文章出现得真及时!","写的很详细,学习到很多,感谢大佬!","文绉绉的程序大佬最帅了!","博主不光能写的一手好代码,还能写的一手好文章。","大佬一出手,精品果然有~","写的不错,果断收藏!","感谢博主分享,讲的挺不错,希望后面有更多的文章。","大佬666,看了之后受益很大。","哇,好棒啊,崇拜的小眼神~","大佬写的太好了!","大佬写的很好,手动点赞!","大佬,看了你的文章,内心的仰慕之情油然而生,赶紧给大佬点个赞!","大佬的文章让我受益匪浅,如痴如醉,以后的日子还希望能够得到大佬的谆谆指点!","学到了,点赞支持,一起加油!","大佬的文章让我受益颇多,手动给大佬点赞!","写的不错,just code it !","优秀优秀,必须给个大大的赞!","爱了爱了,得之我幸。","看完大佬的文章,我的心情竟是久久不能平静。正如老子所云:大音希声,大象无形。我现在终于明白我缺乏的是什么了。","感谢博主分享,讲的挺不错,希望后面有更多的文章,可以互关哦~","大佬牛逼!","哇,好棒啊,崇拜的小眼神 ,欢迎回赞,回评哦~~~","学到了,点赞支持,一起加油 (ง •̀o•́)ง (ง •̀o•́)ง","自己每次写文章都要好多个小时,有时一整天,看到这样的文章忍不住点个赞","感谢分享,对我这个菜鸡来说很友好。","支持博主,文章干净利落。不像其他很多人写篇文章里面都是一些公众号二维码啥的。","特别喜欢博主的写作风格,支持一波。","下班回家看到博主文章更新,学到了。","慕名而来,大佬你真的惊艳到我了!","抛开吸引人的标题,博主开发的精神值得学习。","大佬666,获益匪浅,灵感如泉涌般一发不可收拾!","原创不易,继续加油,已收藏。","写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!","内容写的很好,期待多更!","放弃不难,但坚持一定很酷!","不错 本来准备自己总结一下,比我的全面。","写的不错,顶个贴,点个赞,嘿嘿!","博主解释的很全面,学到了。","大佬,看了之后受益很大。","大佬,看了你的文章,内心的仰慕之情油然而生,赶紧给大佬点个赞!","写的挺不错的,继续加油哦!","自己每次写文章都要好多个小时,有时一整天,看到这样的文章忍不住点个赞。","这么好的文章,如果将来我再也看不到了,那我该怎么办?直到我毫不犹豫地把大佬的这篇文章收藏了,我内心的那种激动才逐渐平静下来。","感觉文章思路挺清晰的~","学到了,点赞支持,一起加油~","哇,好棒啊,崇拜的小眼神!","感谢分享,开源是我们开发人员共同的目标,互惠互利。","nice,赞一个!","博主解释的很全面,学到了。","这篇文章有东西的。","写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!","这篇文章很励志,也有点适合我。","首次看博,第一个留言就给博主了,很不错","我会认真研读的,谢谢大佬,辛苦辛苦!","很不错分享~进步的路上一起努力!也期待您的关注和点赞。","膜拜大佬的技术,来我博客指点江山吧!","写的不错 共勉~,最近也在开始写博客。大佬们来翻牌啊!","博主写的很详细,作为小白的我,都能看得懂,谢谢分享!","写的好好哦,我也在写博客,看了你的文章发现自己还有很多需要学习的地方,大佬写的很nice!","博主写的非常好,有理论有例子,非常容易看懂,感谢博主!","写得太齐全了,对于初学计算机网络的人说很有用,值得赞一下。","还是蛮不错的,引导初学者了解基本的。","同样是程序员,为何你能如此秀!","大佬的文章让我受益颇多!","写的不错,学习了,学习的道路上一起进步,也期待你的关注与支持!","博主写的非常清晰,对我很有帮助,谢谢,方便可以加个关注。共同学习!","学到了,学到了,给大佬点赞!","已关注,质量很高的博文!"]}

编码时间

下面代码只展示部分内容,如果想要学习完整代码,直接加我微 moshanba ,然后我发送给你。(能看到这里表示你已经订阅了专栏) 。

评论部分的代码:

# count 表示得分分数
# content 评论内容
# articleId 被评论的文章
# jar cookies内容
# headers 评论头
def send(count, content,  articleId, jar, headers):
	# 设计评论接口
    post_url = "https://blog.xxxx.net/phoenix/web/v1/comment/submit"
    data = {
        "commentId": "",
        "content": content,
        "articleId": articleId
    }

    post_res = requests.post(
        post_url, data=data, cookies=jar, headers=headers)

    dd = post_res.json()
    if dd["code"] == 200:
        print(f"评论完毕,进入倒计时\n")
        i = 60
        while i > 1:
            time.sleep(1)
            print("\r倒计时{}秒!".format(i), end="", flush=True)
            i -= 1

        count += 1
    print("\n")
    return count

获取待评论文章列表部分代码:

from lxml import etree
import requests


def get_detail(text):
    elements = etree.HTML(text)
    seleted = elements.xpath('//div[@class="title"]/h2/a/@href')
    result = [(i.split('/')[-1], i) for i in seleted]
    return result

# 调取文章分类列表页面
one_url = f"https://www.xxxx.net/nav/python"
headers = {
    "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) 你的UA",
    "referer": f"https://www.csdn.net/nav/python",
    "x-requested-with": "XMLHttpRequest",
    "content-type": "application/x-www-form-urlencoded; charset=UTF-8"
}
res = requests.get(one_url, headers=headers, timeout=3)
articles = get_detail(res.text)
for article in articles:
    articleId = article[1]
    print(articleId)

写在后面

本篇博客原计划帮助一个订阅专栏的朋友。他说他想发广告...,他想灌水,他问我能不能帮他,我说能,哈哈哈。然后就有了本次开发过程。

如果你也想,CALL ME。