关于twitter爬虫的总结
最近有需要收集包含特定关键词的tweets数据。要求查询的时间跨度比较大,使用Twitter给的API有诸多问题,尤其是似乎还突破不了七天的限制,再加上懒得研究,所以还是决定采用爬取网页响应的方式。
一、Twitter搜索的机制
Twitter提供了一个search的功能,允许用户以关键词进行搜索,在高级搜索选项当中也能设置时间段等限定条件。得到初始搜索结果页面后,将页面下拉,到达底部之后会加载下一页。这个加载过程是由js完成的,如果关闭浏览器的js,那么下一页将不会加载,用户仅能浏览搜索结果首页。
二、拿到搜索结果首页
Twitter的search功能实际上是以get方式发出请求,因此只需要构造一个url就能进行查询。
#可以设定语言、关键词以及时间区间,事实上进一步研究Twitter的search功能后还能添加更多限制,譬如不出现的关键词,关键词列表等
url = 'https://twitter.com/search?l=ja&q=熊本城since%3A2016-04-01 until%3A2017-11-01&src=typd'
好消息是,与微博不同,似乎Twitter的search功能并不要求用户登录,因此我们不必考虑登录的问题。有了这个url,利用urllib2、request之类的库就能很轻松的拿到一个HTML页面,这个页面即是搜索结果首页,与关闭浏览器js的搜索结果是一致的,使用正则表达式或者BeautifulSoup一洗就可以了。
三、翻页机制
通过抓包能发现,翻页是由请求如下url完成的:
date_since = '2016-04-01'
date_until = '2016-09-21'
keyword = '熊本城'
lang = 'ja'
timeline_Url = 'https://twitter.com/i/search/timeline?vertical=default&q="' + keyword + '"since%3A' + date_since + '%20until%3A' + date_until + '&l='+lang+'&src=typd&include_available_features=1&include_entities=1&max_position=' + position + '&reset_error_state=false'
其中时间段和关键词这两个参数与查询首页时参数一致,而position则能在首页的返回数据中找到,值得注意的是首页返回的数据中有一个min-position和一个max-position,这两者似乎是相同的,其中的机制没有深入研究。在抓包看了加载流程之后我猜测max-position应该是用来请求整个页面数据的,而min-position则用来进行分步加载,因此就使用了max-position。
接着如果我们继续翻页,可以看到后续的翻页请求也同样由此url完成,只是参数position发生改变,而每一次翻页请求所需要的position显然来自上一个页面请求的返回。
发出这个请求之后,能接收到一个json文件。分析之后可以发现,这个json由以下几个键值对组成:
{
"min_position":str
"has_more_items":boolean
"items_html":html
"new_latent_count":int
"focused_refresh_interval":int
}
items_html:一个不标准的html页面,这个页面包含了本次翻页所要加载的数据,也是我们要爬取的主要内容。
min_position:包含了一个position数据,这用来组装下一次翻页请求的url。
has_more_items:大概是用来表明本次返回是否完全。在多次尝试后我发现似乎所有通过爬虫获取的页面该参数都为false,目前看来对爬取数据没有影响。
new_latent_count:本页新增数据条数。
focused_refresh_interval:不明。看字面意思猜测可能是刷新时间,但这个刷新时间有何影响还不清楚。同样在多次尝试后发现该参数恒为30000,也没有发现对爬取有何影响。
三、抓取流程和存在的问题
现在抓取数据的流程就很清楚了。
1、填入相关参数,请求搜索首页。获得首页tweets数据及position。
2、将相关参数及上页position填入,组装timeline的url,请求翻页加载的数据。
3、重复第2步。
有几个问题需要注意。
1、在进行第2步时,返回的json数据中的items_html是不完整的html,想要用BeautifulSoup之类的工具解析的话需要给它添加一个简单的头尾,例如
Head = u"""
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Fake Title</title>
<body>
"""Tail = u"""
</body>
</head>
</html>
"""
2、Twitter不要求用户登录,但他会检查你的请求的header,尤其是user-agent。恶心人的地方在于如果你的user-agent没有通过检查,那么也不会报错,而是返回一个空的items_html。user-agent失效特点在于position为空,而其他原因导致的无数据返回是会有position返回的。
3、在我爬取的过程当中,如果请求的数据量稍稍大一些——可能只需要几万条这个量级——那么在数据获取的过程中会出现抓取到空页面的情况。除了第2点谈到的user-agent失效的情况(然而事实上这种情况非常少见),剩下的我没有办法解释。
4、在解析html拿数据的时候,你会发现发推时间实际上有两个地方拿,一个是网页显示的时间,一个是发推的时间戳。我在进行爬取的时候发现Twitter网页端的时间显示是有问题的,一开始认为是时区问题,但后来发现并不尽然。因此,还是拿时间戳比较靠谱。进一步研究你会发现,Twitter search在工作时实际上使用的是网页显示的那个时间去拿数据。结合一些表现,我猜测第3点问题的原因很可能就在于此,不过鉴于任务已经完成,就不再深究了,以后遇到再说吧。
关于twitter爬虫的总结相关推荐
- Java开发Twitter爬虫抓取图片和视频并保存到本地
零.目标 使用Java开发爬虫,爬取Twitter状态下评论中的图片和视频,并将其保存到本地. 一.调研爬虫框架 Twitter4J: https://github.com/Twitter4J/Twi ...
- Twitter爬虫Python库Tweepy 附中英文官方文档
文章目录 前言 一.Tweepy是什么 二.Tweepy可以干什么 三.一个简单的demo 四.一个更简单的demo 五.文档下载 前言 Twitter Tweepy相关这块内容在CSDN甚至搜索引擎 ...
- 【2022 Twitter爬虫高级搜索接口分析及代码编写 Python爬虫 附主要代码及解析】
目录 前言 一.网页分析 二.主要代码 1.请求Json包 2. Guesstoken获取 2.Json文件解析 3.存入xlsx 运行效果 名人信息解析获取 存入excel 总结 前言 最近在帮助做 ...
- 简单Twitter爬虫--关键词
文章目录 1. 常规参数 2. 请求头 1. 常规参数 Twitter网站是用AJAX异步加载的,当对搜索关键词进行检索时,可以用requests请求到保存有数据的json文件,但是需要对url进 ...
- 【Twitter爬虫】Twitter网络爬虫
利用selenium爬取Twitter 从2月9日起,Twitter不再支持免费访问Twitter API,继续使用Twitter API支付较高的费用.下面将介绍一种绕过Twitter API爬取推 ...
- 简单twitter(推特)爬虫和NLTK词频分析(0基础入门)
转载请指明出处 目录 一.项目简介 二.简单介绍 1.TWINT的用法和相关注意点 2.NLTK的简单使用 一.项目简介 本代码是大创期间所作. 当时发现网上资料很少,我深深体会到摸着石头过河是什么感 ...
- Python百度文库爬虫之txt文件
Python百度文库爬虫之txt文件 说明: 对于文件的所有类型,我都会用一篇文章进行说明,链接: Python百度文库爬虫之txt文件 Python百度文库爬虫之doc文件 Python百度文库爬虫 ...
- python潜力开源项目_10大Python开源项目推荐(Github平均star2135)
翻译 | suisui 来源 | 人工智能头条(AI_Thinker) 继续假日充电系列~本文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望 ...
- python项目-马哥教育官网-专业Linux培训班,Python培训机构
文是 Mybridge 挑选的 10 个 Python 开源项目,Github 平均star 2135,希望你能够喜欢~~ ▌Rank 1:Requests-HTML v0.9(7385 stars ...
最新文章
- ACM OJ反馈结果大全
- ASP.NET Core分布式项目实战(详解oauth2授权码流程)--学习笔记
- android 多个复选框,Android UI控件之CheckBox(复选框、多选框)
- osg geometry清空vertex
- Linux/UNIX不同shell环境下数组的处理
- UI干货素材|app切换开关模块
- word20161219
- netcat 传输文件
- 1.UNIX 环境高级编程--UNIX基础知识
- C++11 pair的使用
- 使用Fresco加载gif动画
- c++基础(上) 听课流水账
- wincc工程组态论文_仪表人零基础学系统组态,必备知识!2020.12.12
- 一个屌丝程序猿的人生(三十二)
- Win8.1 WP8: 蓝牙Rfcomm应用
- 保龄球 java机试题
- android 高度百分比,Android 屏幕适配-百分比布局适配
- Nature封面:基因突变才是衰老的罪魁祸首?体细胞突变越快,寿命越短
- Acwing春季每日一题 混合牛奶(朴素做法和优化做法)
- 致大学生——成为博主半年了,谈谈博客对于就业和考研的重要性