首页 > 解决方案 > 使用 python 抓取推文的问题

问题描述

我正在尝试在特定时间范围内从一个网页上抓取推文。

为此,我正在使用此链接,该链接仅在我指定的时间范围内搜索:

https://twitter.com/search?f=tweets&q=subwaydstats%20since%3A2016-08-22%20until%3A2018-08-22

这是我的代码:

import pandas as pd
import datetime as dt
import urllib.request
from bs4 import BeautifulSoup

url = 'https://twitter.com/search?f=tweets&q=subwaydstats%20since%3A2016-08-22%20until%3A2018-08-22'
thepage = urllib.request.urlopen(url)
soup = BeautifulSoup(driver.page_source,"html.parser")

i = 1
for tweet in soup.find_all('div', {'class': 'js-tweet-text-container'}):
    print(tweet.find('p', {'class': 'TweetTextSize'}).text.encode('UTF-8'))
    print(i)
    i += 1

当我从地铁统计用户的实际 twitter 页面中抓取时,上面的代码有效。

出于这个原因,我不明白为什么它对搜索页面不起作用,即使 html 对我来说似乎是一样的。

我是一个初学者,所以如果这是一个愚蠢的问题,我很抱歉。谢谢!

标签: pythonhtmltwitterbeautifulsoup

解决方案


有一个 Twitter API - Twitter Search API 文档:https://developer.twitter.com/en/docs/tweets/search/api-reference/get-search-tweets 使用非官方 Python 包装器:https:// /github.com/bear/python-twitter让获取推文变得超级容易。

但是,如果你想抓取 HTML,那就更难了。我正在做类似的事情 - 抓取一个有角度的应用程序,但是,您在屏幕上看到的实际 HTML 实际上是通过“前端 javascript”呈现的。Requests 和 urllib,只获取基本的 HTML,但不运行 javascript。

您可以使用selenium,它基本上是一个可以自动执行任务的浏览器。由于它的行为类似于浏览器,它实际上运行的是前端 javascript,这意味着您将能够抓取网页。

这里有一篇很棒的文章解释了你可以抓取 twitter 的不同方式https://medium.com/@dawran6/twitter-scraper-tutorial-with-python-requests-beautifulsoup-and-selenium-part-2-b38d849b07fe


推荐阅读