我有一个包含超过500K的twitter用户名列表。我可以开发一个使用twython和API密钥的程序。程序和输入太大,无法放在此处,因此上传到Github
程序运行正常,用户名大约150个,但不超过这个。该限制使得无法为500K +用户名刮取地理位置。
我正在寻求绕过API的一些帮助,可能会使用网络抓取技术或任何其他更好的替代方法来刮取用户名的地理位置。
赞赏每一个帮助:)
答案 0 :(得分:2)
我要做的是废弃twitter.com/而不是使用Twitter API。
主要原因是前端不是查询限制(或者至少方式不那么有限),即使您需要在几秒钟内拨打Twitter太多时间,您也可以使用User-Agent和代理来发现。
对我来说,报废是绕过API限制的最简单方法。
此外,您需要抓取的内容非常容易访问,我制作了一个简单的“脏”代码,用于解析您的csv文件并输出用户的位置。
我会在你的回购上做一个公关的乐趣,但这里是代码:
#!/usr/env/bin python
import urllib2
from bs4 import BeautifulSoup
with open('00_Trump_05_May_2016.csv', 'r') as csv:
next(csv)
for line in csv:
line = line.strip()
permalink = line.split(',')[-1].strip()
username = line.split(',')[0]
userid = permalink.split('/')[3]
page_url = 'http://twitter.com/{0}'.format(userid)
try:
page = urllib2.urlopen(page_url)
except urllib2.HTTPError:
print 'ERROR: username {} not found'.format(username)
content = page.read()
html = BeautifulSoup(content)
location = html.select('.ProfileHeaderCard-locationText')[0].text.strip()
print 'username {0} ({1}) located in {2}'.format(username, userid, location)
输出:
username cenkuygur (cenkuygur) located in Los Angeles
username ilovetrumptards (ilovetrumptards) located in
username MorganCarlston hanifzk (MorganCarlston) located in
username mitchellvii (mitchellvii) located in Charlotte, NC
username MissConception0 (MissConception0) located in #UniteBlue in Semi-Red State
username HalloweenBlogs (HalloweenBlogs) located in Los Angeles, California
username bengreenman (bengreenman) located in Fiction and Non-Fiction Both
...
显然,您应该更新此代码以使其更加强大,但基础知识已经完成。
PS:我解析永久链接' field,因为它存储格式良好的slug以便使用到profil的页面。它非常脏,但速度快它的工作原理
关于google API,我肯定会使用某种缓存/数据库来避免谷歌调用。
在python中,没有数据库,你可以创建一个像:
这样的字典{
"San Fransisco": [x.y, z.a],
"Paris": [b.c, d.e],
}
对于要解析的每个位置,我首先检查此dict是否存在密钥,如果是,则从此处获取我的值,否则调用google API然后将值保存在db dict中。
我认为通过这两种方式,您将能够获取数据。