利用twitter官网提供的api 及tweepy库 爬取tweets
利用twitter官网提供的api及tweepy库爬取tweets
tweepy官网文档
思路:
1.以用户为中心,爬取用户的所有推文数据
2.根据用户id寻找用户朋友的tweeter id扩展待爬用户表
3.循环1,2
几点说明:
1.爬推特数据需要翻墙,推荐用ss。代码翻墙需要http,https代理。如果是socks的话会发现浏览器能翻墙,但是代码会提示
tweepy.error.TweepError: Failed to send request: HTTPSConnectionPool(host='api.twitter.com', port=443): Max retries exceeded with url: ....
说明https连接失败。如果需要终端翻墙参考Mac命令行终端下使用shadowsocks翻墙
然后在tweepy.API中加入代理信息,端口为你设定的代理端口。
api = tweepy.API(auth, proxy="127.0.0.1:1080",)
2.使用官方api需要先申请一个应用程序以获得授权,申请地址Twitter应用程序 名字描述什么的随便写好好,没有审核时间,填写后即可获得consumer_key,consumer_secret,access_token,access_token_secret这些在求取数据时需要用到。
3.官方API有速率限制具体参见[Rate limits-Twitter Development]授权用户和授权应用的请求窗口数有差异我用的。user_timeline()
状语从句:user_friends()
限制如下:
所以需要协调两个接口的调用频率。
4.当请求次数超过上限时会抛出异常,然后退出程序,解决方法时tweepy.API中将参数wait_on_rate_limit,wait_on_rate_limit_notify设置为True
到达上限时,程序将自动等待,并输出提示信息。
api = tweepy.API(auth, proxy="127.0.0.1:1080", wait_on_rate_limit=True, wait_on_rate_limit_notify=True)
5.api请求返回json格式数据如图:
6.有些用户设置不允许取数据时会提示Not authorized.
可以在异常部分处理异常,跳过改用户即可.tweepy.error信息也可以在上面的官方文档连接中查到。
代码
import tweepy
import time
import csv
import threadingconsumer_key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
consumer_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_token = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
access_token_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'lock = threading.Lock()def get_tweets():global user_idsglobal old_idslock.acquire()try:num = 0while len(user_ids) > 1:try:user_id = user_ids[num]print('crawling user %s data...' % user_id)auth = tweepy.OAuthHandler(consumer_key, consumer_secret)auth.set_access_token(access_token, access_token_secret)api = tweepy.API(auth, proxy="127.0.0.1:1080", wait_on_rate_limit=True, wait_on_rate_limit_notify=True)tweets = []new_tweets = api.user_timeline(user_id, count=200)tweets.extend(new_tweets)old = tweets[-1].id - 1while len(new_tweets) > 0:new_tweets = api.user_timeline(user_id=user_id, count=200, max_id=old)tweets.extend(new_tweets)old = tweets[-1].id - 1print('%s tweets downloaded' % (len(tweets)))out_tweets = [[tweet.id, tweet.text, tweet.created_at, tweet.lang, tweet.place, tweet.geo, tweet.source,tweet.truncated, tweet.favorite_count, tweet.favorited, tweet.in_reply_to_screen_name,tweet.in_reply_to_status_id, tweet.in_reply_to_user_id, tweet.is_quote_status,tweet.retweet_count, tweet.retweeted, tweet.user.id, tweet.user.name, tweet.user.screen_name,tweet.user.statuses_count, tweet.user.time_zone, tweet.user.url, tweet.user.notifications,tweet.user.profile_background_image_url, tweet.user.profile_image_url,tweet.user.profile_image_url_https, tweet.user.location, tweet.user.contributors_enabled,tweet.user.created_at, tweet.user.default_profile, tweet.user.default_profile_image,tweet.user.description, tweet.user.favourites_count, tweet.user.follow_request_sent,tweet.user.followers_count, tweet.user.following, tweet.user.friends_count,tweet.user.geo_enabled] for tweet in tweets]user_ids.remove(user_id)old_ids.append(user_id)with open('./data1/%s_tweets.csv' % user_id, 'w',encoding='utf-8') as file:writer = csv.writer(file)writer.writerows(out_tweets)print('saved data')except tweepy.TweepError as e:if e.reason=='Not authorized.':print('this user not authorized.')user_ids.remove(user_id)old_ids.append(user_id)continueelse:print(e)finally:lock.release()def get_friends():global user_idsglobal old_idsglobal oldestlock.acquire()try:print('getting user friends id...')auth = tweepy.OAuthHandler(consumer_key, consumer_secret)auth.set_access_token(access_token, access_token_secret)api = tweepy.API(auth, proxy="127.0.0.1:1080", wait_on_rate_limit=True, wait_on_rate_limit_notify=True)ids = []for user in old_ids[10]:try:friends = api.friends_ids(user)friend = []for idd in friends:if (idd not in old_ids) and (idd not in user_ids) and(idd not in oldest):friend.append(idd)ids.extend(friend)except tweepy.TweepError as e:if e.reason == 'Not authorized.':print('this user not authorized.')old_ids.remove(user)oldest.append(user)continueelse:print(e)old_ids.remove(user)oldest.append(user)user_ids.extend(ids)print('done!')with open('crawled and expened user.txt','w',encoding='utf-8') as file:for x in oldest:file.write(str(x))file.write(' ')finally:lock.release()if __name__ == '__main__':user_ids = [25073877,198599889]with open('old_ids.txt','r',encoding='utf-8') as file:old_ids=[x for x in file.read().split(' ')]while len(user_ids) > 0:t1=threading.Thread(target=get_tweets)t2=threading.Thread(target=get_friends)t1.start()t1.join()t2.start()t2.join()
利用twitter官网提供的api 及tweepy库 爬取tweets相关推荐
- 快速开发像vue elementui官网一样的api查询网站
推荐vuepress 附官网VuePress 中文文档 | VuePress 中文网 前言 一直想做公司的api封装查询网站,百度寻找工具返回结果大多是 gitbook 于是开始各种查询GitBook ...
- 使用Kali官网提供的虚拟机系统
使用Kali官网提供的虚拟机系统 Kali Linux官网提供了不同架构的镜像文件,用来安装Kali Linux操作系统.大学霸IT达人另外,还提供了安装好的虚拟机文件,包括VMware和Virtua ...
- Nginx官网提供的版本类型
Nginx官网提供了三个类型的版本 Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版 Stable version:最新稳定版,生产环境上建议使用 ...
- Vue官网提供表单验证cnpm i vee-validate@2 --save
Vue官网提供表单验证 使用步骤: 1:安装vee-valadite,别安装最新版本@2 2:在plugins文件夹中创建一个validate.js[专门注册vee-valadite] 3:注册插件 ...
- 联想计算机配置在哪里,教你如何使用联想官网提供的联想电脑配置查询功能
有不少小伙伴在使用联想电脑的过程中,可能会有需要查询电脑配置的情况,这个可以直接在联想官网查询电脑配置.那么联想官网如何查询电脑配置呢?下面小编就教下大家使用联想官网提供的联想电脑配置查询功能的方法. ...
- java官网下载离线api文档地址
java官网下载离线api文档地址 看到很多人在csdn资源区放着自己下载过的jdk和java离线文档,很是气愤,很多人只是没找到官网的下载位置,这种免费的东西你也好意思收50C币,甚至有的还要钱,这 ...
- ITRF官网提供IGS站点时序图
ITRF官网提供IGS站点时序图 站点数:1054 下载地址:http://itrf.ensg.ign.fr/residuals_list14.php
- 如何利用Spring官网一键生成SpringBoot项目
前言 在平日的学习工作中,有可能是公司需要得重新搭建一个新的SpringBoot项目,也有可能是开发自己想新建一个项目用来集成测试一些技术栈,无论出于何种目的,能快速搭建一个空的SpringBoot项 ...
- 如何从德州仪器官网得到protel(AD)库文件(原理图和封装)
最近在用AD15画DSP的PCB,遇到一个麻烦就是很多新版的元器件的原理图库文件和封装库文件不容易找到. TI的官网提供了元器件的CAD文件,因此只要把CAD文件转换为你需要的软件支持格式就可以了.下 ...
最新文章
- 那个曾被阿尔法狗在围棋领域打哭的男人--柯洁,又夺斗地主全国冠军....
- linux源码阅读笔记 fork函数
- 一个链表创建、反转、打印的C语言代码
- win10系统按esc会弹出计算机,win10系统版本2004控制面板多出ESC是什么原因?
- 程序员利用网吧挖矿,获利上亿元~!
- google search console的使用
- Search Engine Hacking – Manual and Automation
- 国内外网站设计与浏览习惯的差异
- 苹果推送证书不受信任解决办法2022年
- 编写jQuery插件
- 增长黑客读书笔记(一)搭建增长团队
- 计算机领域中dns是什么意思,dns错误是什么意思?dns错误要如何解决?
- 批量修改UWP版bilibili下载的视频文件名
- SpringBoot整合Quartz--使用/教程/实例
- 【Mac环境】mac在线安装brew时返回443链接被拒绝或超时错误解决方案
- 计算机用word做海报,如何用Word文档做出一张简单的海报!
- Daisy Chains
- CS 425 – Database Organization - project 1:HomeImprovement_shop_project
- mysql新加一列_mysql如何增加表中新的列?
- Pandas —— resample()重采样和asfreq()频度转换