事情的起因

前一阵突然收到了这样一封私信

假约稿,真广告

来简书也有一段时间了,这种私信收到了不少,基本都是打着约稿的旗号来骗关注的。其实我觉得主动要求别人的关注没有问题,但是应该明目张胆、大张旗鼓的才对,哪能这样鬼鬼祟祟,企图瞒天过海?看了看这个作者,居然还是个专题编辑呢。

image.png

所以我就试探的问问她,既然想约稿,那么到底有没有看过我的文章。

image.png

那么现在问题来了,我在简书上也有将近1500个赞了,其中到底有没有这位同志的赞呢?自己手动去看看?这可不是程序员的答案!我们的答案是爬虫!

获取用户timeline

可以很容易的看出,https://www.jianshu.com/users/5aa8494a18c8/timeline 这样的url就是用户的timeline,但是页面默认只展示一部分,更早的timeline是浏览器下拉后获取的。用浏览器的开发者工具可以看到请求信息。

动态加载的timeline

page这个参数显而易见,那么max_id是怎么来的呢?首先要看看这些请求是哪里发出来的。

查看请求调用关系

这个看着信息量好大

这个函数看着最像

再看看s函数,终于找到了max_id的获取方式

max_id

max_id可以根据最后一个li元素的id属性获得。

利用requests库进行爬取

requests库就不多介绍了,这里注意两点:

要手动设置请求的header,来模拟正常浏览器

ajax请求要设置额外的header,来模拟下拉刷新

对每次请求下载的response,使用lxml解析,然后利用xpath获取最后一个li元素,进而计算max_id。再用计算出的max_id发起新的请求。

当返回的文本中包含"加入了简书”则停止爬取。

爬取结果分析

爬取了该用户的所有动态,存储到了一个文本文件中,在其中搜索"大神带我来搬砖”,未找到任何结果。所以该用户根本没给我点赞过。

image.png

当然,后来我又学会了用selenium来完成同样的工作。

源码

import requests

from lxml import etree

my_header = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36"

res = requests.get(url='https://www.jianshu.com/users/5aa8494a18c8/timeline', headers={'user-agent': my_header})

if '大神带我来搬砖' in res.text:

print('found')

page = etree.HTML(res.text)

last_li = page.xpath('''//ul[@class="note-list"]/li[last()]''')[0]

max_id = int(last_li.get('id').split('-')[1]) - 1

file = open("activity.txt",'w',encoding='utf-8')

page = 2

while True:

res = requests.get(url='https://www.jianshu.com/users/5aa8494a18c8/timeline?max_id=%s&page=%s' %(max_id,page),

headers={'user-agent': my_header, 'X-INFINITESCROLL':'true'})

last_li = etree.HTML(res.text).xpath('''/html/body/li[last()]''')[0]

max_id = int(last_li.get('id').split('-')[1]) - 1

page = page + 1

file.write(res.text)

file.write(" ")

if '加入了简书' in res.text:

print('end')

break

file.close()

原文作者:大神带我来搬砖

爱好历史和武侠,专注java、大数据的程序员小哥哥。

学习资料共享,技术问题讨论,希望和大家一起交流进步。

python骗局-我终于在生活中用到Python了!!!——用爬虫来揭露骗局真相相关推荐

  1. 我终于在生活中用到Python了!!!——用爬虫来揭露骗局真相

    事情的起因 前一阵突然收到了这样一封私信 假约稿,真广告 来简书也有一段时间了,这种私信收到了不少,基本都是打着约稿的旗号来骗关注的.其实我觉得主动要求别人的关注没有问题,但是应该明目张胆.大张旗鼓的 ...

  2. 零基础学python难吗-终于明白0基础学python难吗

    Python语言是一种典型的脚本语言,简洁,语法约束少,接近人类语言.有丰富的数据结构,例如列表.字典.集合等.具有可移植性,支持面向过程和面向对象编程,并且开源.以下是小编为你整理的0基础学pyth ...

  3. 以下python语言关键字在异常处理_【单选题】以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( )...

    问题:[单选题]以下 Python 语言关键字在异常处理结构中用来捕获特定类型异常的选项是: ( ) 更多相关问题 进程从运行状态变为等待的原因可能是() 进程调度主要负责() 在下列叙述中,错误的一 ...

  4. boost 1.34 终于简化了内嵌python的支持

    boost 1.34 终于简化了内嵌python的支持. 还支持了python2.5. 在中文windows下用vc8编译boost的过程中,虽然仍有代码页字符警告,但是可以正常编译成功,不再象1.3 ...

  5. python获取字符串首字母_Python中用startswith()函数判断字符串开头的教程

    Python中用startswith()函数判断字符串开头的教程 函数:startswith() 作用:判断字符串是否以指定字符或子字符串开头 一.函数说明语法:string.startswith(s ...

  6. IDEA为java项目中用到python的模块设置Python interpreter

    IDEA为java项目中用到python的模块设置Python interpreter Java项目中模块用到了python,没有为模块设置Python解释器,因此点击右上角Configure Pyt ...

  7. python异常处理时所使用的保留字_下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是...

    [单选题]以下不是 Python 语言关键字的选项是 [单选题]给出下面代码: a = input("").split(",") x = 0 while x & ...

  8. 下列python保留字中、用于异常处理_下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是...

    下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是 答:except 在罗马共和国后期,西班牙地区被凯撒征服并占领了.() 答:× 维拉帕米不用于治疗 答:慢性心功能不全 按照交通环 ...

  9. Python 3.11 终于发布了,性能大提升!

    来源:https://realpython.com/python311-new-features 推荐阅读:终于来了,[第三期] 彭涛Python 爬虫特训营!! 终于,Python 3.11 正式版 ...

最新文章

  1. 做为程序员对sql进行的性能优化
  2. weblogic登录验证被拒绝_使用Kubernetes身份在微服务之间进行身份验证
  3. [deviceone开发]-do_Dialog的基本使用示例
  4. day24 面向对象与实例属性
  5. Android程序App开机自启动
  6. ML之多分类预测之PLiR:使用PLiR实现对六类label数据集进行多分类
  7. c++ extern “C”
  8. SpringMVC学习日记 1.Spring框架
  9. 标准正态分布_正态分布,正态分布如何变换为标准正态分布
  10. Kali Linux桥接模式配置DNS服务器
  11. MySQL之用Mysql-Proxy实现读写分离
  12. 编译WINDOWS版SDL2:You should run hg revert SDL_config.h
  13. java后端简历项目经历_JAVA后端开发工程师个人简历模板
  14. 中国在计算机领域取得的成就,厉害了我的国——盘点中国科学近年有哪些成就...
  15. 读书笔记|从零开始做运营(入门篇)
  16. 浅谈设计师职业成长轨迹
  17. 1.1 wamp/wnmp 环境搭建
  18. RPM软件包管理命令简介
  19. panic函数c语言,【go语言学习】错误error和异常panic
  20. python提取cad中的文字_[python]提取PPT中的文字(包括图片中的文字)

热门文章

  1. Linux基础——怎么样从 Windows 通过 SSH 远程 Linux
  2. win10 + bazel-0.20.0 + tensorflow-1.13.1 编译tensorflow GPU版本的C++库
  3. 二、JS运算符、NaN
  4. CAGradientLayer简介 实现颜色渐变
  5. 7-27 Codeforces Round #499 (Div. 2)
  6. Bin Packing 装箱问题——NPH问题的暴力枚举 状压DP
  7. flash请求来源Refer测试
  8. 选择一款适合自己的ruby on rails IDE开发工具
  9. 纽约的雪--纽约公立小学的故事
  10. 2022年,ICPC比赛、CCPC比赛、CCF-CSP考试、蓝桥杯比赛、天梯赛日程