【问题标题】:Python Web Scraper not collecting all the text I have indicatedPython Web Scraper 没有收集我指出的所有文本
【发布时间】:2017-08-04 19:17:26
【问题描述】:

我正在开发一个 python 网络爬虫,试图为我正在做的项目获取信息。我在 twitter atm 上使用它,因为我发现 twitter api 不会抓取超过一周的信息。我使用的代码是:

import urllib
import urllib.request
from bs4 import BeautifulSoup as soup

my_url = 'https://twitter.com/search?q=australian%20megafauna&src=typd&lang=en'

page_html = urllib.request.urlopen(my_url)
page_soup = soup(page_html, "html.parser")

print(page_soup.title.text)

for tweet in page_soup.findAll('p', {'class': 'TweetTextSize'}, lang='en'):
    print(tweet.text)

据我了解,findAll 的属性部分可以使用冒号作为 LIKE 函数,这似乎可以正常工作。我正在使用“findAll”查看的 HTML 的特定部分是:

<p class="TweetTextSize  js-tweet-text tweet-text" lang="en" data-aria-
label-part="0"></p>

现在我浏览了其他推文,它们似乎都在使用这个类,但是我无法弄清楚为什么它只会返回 1 条推文。奇怪的是,它甚至不是第一条推文(而是第二条)。

如果有人能指出我正确的方向,那就太好了。谢谢。

PS:我还想问一下是否有办法抓取所有推文。在浏览 HTML 时,我发现有一个名为“stream-container”的类,它有一个元素“data-min-position”,当您向下滚动并打开新推文时,该元素会发生变化。我在想,即使我的代码确实有效,它也可能无法看到所有搜索结果,只能从初始页面抓取。谢谢。

编辑:注意到我的代码使用了一个带有 lang='en' 的 url,所以有点多余,但它似乎根本不影响它

【问题讨论】:

  • 尝试改用tweet-text 类,看看会发生什么。
  • 还是一样。我也尝试输入count,但似乎不起作用
  • 当你向下滚动时加载推特内容,你为什么不使用selenium
  • 试试printing 你的page_htmlpage_soup 变量,看看它们是否能得到你预期的结果。只是为了确定。
  • @Mekicha 你是对的,我的 page_html 只给了我这两条推文。我该如何解决?

标签: python html web-scraping beautifulsoup


【解决方案1】:

感谢所有帮助。所以我仍然没有弄清楚为什么我的 urlrequest 为我提供了页面 html 的不完整版本。但是,我发现了一种解决方法,如 @ksai 建议的那样使用 selenium。

它是这样的:

网页抓取工具

import urllib
import urllib.request
from bs4 import BeautifulSoup as soup
from selenium import webdriver
import time

myurl = 'https://twitter.com/search?q=australian%20megafauna&src=typd&lang=en'

driver = webdriver.Firefox()
driver.get(myurl)
#scroll-automation using selenium
lenOfPage = driver.execute_script("window.scrollTo(0, 
document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return 
lenOfPage;")
match=False
while(match==False):
    lastCount = lenOfPage
    time.sleep(3)
    lenOfPage = driver.execute_script("window.scrollTo(0, 
document.body.scrollHeight);var lenOfPage=document.body.scrollHeight;return 
lenOfPage;")
    if lastCount==lenOfPage:
        match=True

page_html = driver.page_source
page_soup = soup(page_html, "html.parser")


print(page_soup.title.text)
for tweet in page_soup.findAll('p', {'class': 'tweet-text'}, lang='en'):
    print(tweet.text)

所以我完全不知道 selenium 是如何工作的,所以我只是挪用了别人的滚动解决方案:How to scroll to the end of the page using selenium in python

@ksai,你会不会有另一种方法?

我打算将推文作为文本存储在 csv 文件中,如果您打算用它来训练机器人,会有格式吗?

谢谢

【讨论】:

  • 对于facebook、twitter、linkedin等动态网站,我推荐使用selenium
  • csv 格式最适合数据分析和模型训练。
  • Tbh 我什至不知道 selenium,尽管我想我一直使用的所有指南都使用静态页面作为示例。所以谢谢你让我知道!
  • 只将推文保留为单行文本可以吗?还是您认为将它们按单词分开并将每个句子排成一行会更好?
  • 我不是这个领域的专家。您想通过 Google 搜索更多信息。
【解决方案2】:

试试这个:

  my_url = 'https://twitter.com/search?q=australian%20megafauna&src=typd&`lang=en'

  page_html = urllib.urlopen(myurl).read()

它应该工作。 使用python3,您可以这样做:

import urllib.request
with urllib.request.urlopen(my_url) as f:
  page_html = f.read()

【讨论】:

  • 仍然只给我那条推文。没有真正使用 ` 在 url 所以我只是删除了 'en' 周围的引号。
  • 你在添加.read()方法吗?和print 你的page_html 再次查看是否有任何变化。
  • 是的,我再次尝试确认。 .read() 方法似乎不适用于 .request 在 urlopen 之前,所以我将它保留在那里。 page_html 仍然只提出了这两个,所以我不确定发生了什么。仍然没有弄清楚为什么会发生这种情况(也许会读取网站的缓存版本?),但我想对于 selenium,它会在浏览器中打开页面,我认为这会有所帮助。感谢大家的帮助!
  • 还有一个问题。你用的是python2还是python3?
  • 啊,原来是python3
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-13
  • 2021-10-19
  • 1970-01-01
  • 2021-03-02
相关资源
最近更新 更多