Twint Python库搜索查询抛出TypeError异常的解决办法及替代方案
我需要从Twitter采集数据,但多次申请Twitter API均被拒绝,因此决定使用Twint Python模块完成该任务。我通过Git安装了其最新版本,随后执行命令
twint -s pineapple搜索推文时,出现如下异常:Traceback (most recent call last): File "/usr/local/bin/twint", line 33, in sys.exit(load_entry_point('twint==2.1.21', 'console_scripts', 'twint')()) File "/usr/local/lib/python3.6/dist-packages/twint/cli.py", line 339, in run_as_command main() File "/usr/local/lib/python3.6/dist-packages/twint/cli.py", line 330, in main run.Search(c) File "/usr/local/lib/python3.6/dist-packages/twint/run.py", line 410, in Search run(config, callback) File "/usr/local/lib/python3.6/dist-packages/twint/run.py", line 329, in run get_event_loop().run_until_complete(Twint(config).main(callback)) File "/usr/lib/python3.6/asyncio/base_events.py", line 484, in run_until_complete return future.result() File "/usr/local/lib/python3.6/dist-packages/twint/run.py", line 235, in main await task File "/usr/local/lib/python3.6/dist-packages/twint/run.py", line 286, in run await self.tweets() File "/usr/local/lib/python3.6/dist-packages/twint/run.py", line 217, in tweets await self.Feed() File "/usr/local/lib/python3.6/dist-packages/twint/run.py", line 62, in Feed response = await get.RequestUrl(self.config, self.init) File "/usr/local/lib/python3.6/dist-packages/twint/get.py", line 135, in RequestUrl response = await Request(_url, params=params, connector=_connector, headers=_headers) File "/usr/local/lib/python3.6/dist-packages/twint/get.py", line 161, in Request return await Response(session, _url, params) File "/usr/local/lib/python3.6/dist-packages/twint/get.py", line 167, in Response async with session.get(_url, ssl=True, params=params, proxy=httpproxy) as response: File "/usr/local/lib/python3.6/dist-packages/aiohttp/client.py", line 855, in __aenter__ self._resp = await self._coro File "/usr/local/lib/python3.6/dist-packages/aiohttp/client.py", line 361, in _request ssl=ssl, proxy_headers=proxy_headers, traces=traces) File "/usr/local/lib/python3.6/dist-packages/aiohttp/client_reqrep.py", line 207, in __init__ url2 = url.with_query(params) File "/usr/local/lib/python3.6/dist-packages/yarl/__init__.py", line 857, in with_query new_query = self._get_str_query(*args, **kwargs) File "/usr/local/lib/python3.6/dist-packages/yarl/__init__.py", line 837, in _get_str_query for k, v in query) File "/usr/local/lib/python3.6/dist-packages/yarl/__init__.py", line 837, in <genexpr> for k, v in query) File "yarl/_quoting.pyx", line 226, in yarl._quoting._Quoter.__call__ TypeError: Argument should be str我的Ubuntu系统安装的Python版本为3.6,在Python脚本中导入Twint调用时也出现了相同异常。请问该如何解决此问题?是否有合适的替代工具完成该任务?
一、解决Twint的TypeError问题
这个错误我之前在Python3.6环境下用Twint时也碰到过,根源是yarl库的版本和Python3.6不兼容——yarl在1.7.0及以上版本开始不再完全支持Python3.6的字符串处理逻辑,而Twint依赖的aiohttp又会自动安装高版本的yarl,导致参数传递时出现类型错误。
解决步骤很简单,只需要降级yarl到兼容Python3.6的版本:
- 先卸载当前的yarl版本:
pip uninstall yarl -y
- 安装兼容的1.6.3版本:
pip install yarl==1.6.3
完成后再重新运行twint -s pineapple,应该就能正常搜索了。如果还是有问题,可以尝试同时指定aiohttp的版本为3.7.4.post0(这个版本和yarl1.6.3适配很好):
pip install aiohttp==3.7.4.post0
二、替代工具推荐
如果Twint后续还是出现各种兼容性问题,或者你需要更稳定的采集方案,这几个工具可以试试:
Snscrape:无API限制的轻量级爬虫,支持Twitter、Facebook等多个平台。用法非常简单,比如搜索包含pineapple的推文:
snscrape twitter-search "pineapple"还可以通过Python脚本调用,直接把结果导出为CSV,适合批量采集,而且维护比较活跃,兼容性好。
Scweet:基于Selenium的Twitter爬虫,模拟真实浏览器操作,不需要API。虽然速度比Twint慢,但不容易被Twitter检测到,适合小规模数据采集。可以通过Python脚本控制,支持采集用户推文、热门话题等内容。
Tweepy(学术版API):如果你的采集需求是学术研究,可以尝试申请Twitter的学术研究API,这个通道的审核比普通API宽松很多。Tweepy是官方推荐的Python客户端,稳定性和数据完整性都有保障,适合大规模、长期的数据采集。
内容的提问来源于stack exchange,提问作者Hafiz Muhammad Shafiq

