使用 Scrapy (Python) 抓取网络数据(在线新闻评论)

2024-04-11

我想从在线新闻中抓取网络评论数据纯粹用于研究。我注意到我必须学习 Scrapy...

通常,我使用 Python 进行编程。我想这很容易学。但我遇到了一些问题。

我想抓取新闻评论http://news.yahoo.com/congress-wary--but-unlikely-to-blow-up-obama-s-iran-deal-230545228.html http://news.yahoo.com/congress-wary--but-unlikely-to-blow-up-obama-s-iran-deal-230545228.html.

但问题是有一个按钮(>查看评论(452))可以查看评论。另外,我想做的是抓取该新闻中的所有评论。不幸的是,我必须点击另一个按钮(查看更多评论)才能看到其他 10 条评论。

我该如何处理这个问题?

我所做的代码如下。抱歉,代码太差了。

#############################################
from scrapy.spider import BaseSpider
from scrapy.selector import Selector
from tutorial.items import DmozItem

class DmozSpider(BaseSpider):
   name = "dmoz"
   allowed_domains = ["news.yahoo.com"]

   start_urls = ["http://news.yahoo.com/blogs/oddnews/driver-offended-by-%E2%80%9Cwh0-r8x%E2`%80%9D-license-plate-221720503.html",]

   def parse(self, response):
       sel = Selector(response)
       sites = sel.xpath('//div/p')
       items = []
       for site in sites:
           item = DmozItem()
           item['title'] = site.xpath('/text()').extract()
           items.append(item)
       return items  

您可以看到要解决我的问题还需要做多少工作。但我必须快点..无论如何我都会尽力而为。


由于您看起来像是先尝试后提问的类型(这是一件非常好的事情),所以我不会给您答案,而是提供有关如何找到答案的(非常详细的)指南。

问题是,除非您是雅虎开发人员,否则您可能无权访问您要抓取的源代码。也就是说,您并不确切地知道该网站是如何构建的,以及您作为用户向该网站发出的请求在服务器端是如何处理的。但是,您可以研究客户端并尝试模拟它。我喜欢使用 Chrome 开发者工具来实现此目的,但您也可以使用其他工具,例如 FF firebug。

所以首先我们需要弄清楚发生了什么。因此,它的工作方式是,您单击“显示评论”,它会加载前十条评论,然后您每次都需要继续单击接下来的十条评论。但请注意,所有这些单击不会将您带到不同的链接,而是生动地获取评论,这是一个非常简洁的 UI,但对于我们的情况需要更多的工作。我可以立即说出两件事:

  1. 他们使用 JavaScript 来加载评论(因为我停留在同一页面上)。
  2. 每次您单击时,它们都会通过 AJAX 调用动态加载它们(这意味着每次单击时,它都会向数据库发出另一个请求,而不是随页面加载注释并仅向您显示它们)。

现在让我们右键单击并检查该按钮上的元素。它实际上只是一个带有文本的简单跨度:

<span>View Comments (2077)</span>

通过查看它,我们仍然不知道它是如何生成的或者单击时它会做什么。美好的。现在,保持开发工具窗口打开,让我们单击它。这样就打开了前十名。但事实上,有人要求我们取回它们。 chrome devtools 记录的请求。我们查看开发工具的网络选项卡,看到很多令人困惑的数据。等等,这是一个有道理的:

http://news.yahoo.com/_xhr/contentcomments/get_comments/?content_id=42f7f6e0-7bae-33d3-aa1d-3dfc7fb5cdfc&_device=full&count=10&sortBy=highestRated&isNext=true&offset=20&pageNumber=2&_media.modules.content_comments.switches._enable_view_others=1&_media.modules.content_comments.switches._enable_mutecommenter=1&enable_collapsed_comment=1

See? _xhr http://en.wikipedia.org/wiki/XMLHttpRequest然后获取评论。这很有意义。在浏览器中访问该链接给了我一个 JSON 对象(看起来像 python 字典),其中包含该请求获取的所有十条评论。现在这就是您需要模拟的请求,因为那是给你你想要的东西的那个。首先,让我们将其转换为人类可以阅读的一些正常请求:

go to this url: http://news.yahoo.com/_xhr/contentcomments/get_comments/
include these parameters: {'_device': 'full',
          '_media.modules.content_comments.switches._enable_mutecommenter': '1',
          '_media.modules.content_comments.switches._enable_view_others': '1',
          'content_id': '42f7f6e0-7bae-33d3-aa1d-3dfc7fb5cdfc',
          'count': '10',
          'enable_collapsed_comment': '1',
          'isNext': 'true',
          'offset': '20',
          'pageNumber': '2',
          'sortBy': 'highestRated'}

现在这只是一个反复试验的问题。不过,这里有几点需要注意:

  1. 显然,计数决定了您收到的评论数量。我尝试将其更改为 100 以查看会发生什么情况,但收到了错误的请求。它很高兴告诉我原因 - “偏移量应该是总行数的倍数”。现在我们了解了如何使用offset

  2. content_id 可能是标识您正在阅读的文章的内容。这意味着您需要以某种方式从原始页面获取它。试着稍微挖掘一下,你就会找到它。

  3. 另外,您显然不想一次获取 10 条评论,因此找到一种以某种方式获取总评论数的方法可能是个好主意(要么找出页面如何获取它,要么只是从内部获取它)文章本身)

  4. 使用开发工具,您可以访问所有客户端脚本。因此,通过挖掘,您可以发现指向 /get_comments/ 的链接保存在名为 YUI 的 javascript 对象中。然后,您可以尝试了解它是如何发出请求的,并尝试模仿它(尽管您可能可以自己弄清楚)

  5. 您可能需要克服一些安全措施。例如,您可能需要原始文章中的会话密钥才能访问评论。这用于防止直接访问网站的某些部分。我不会用细节来麻烦您,因为在这种情况下这似乎不是问题,但您确实需要注意它,以防它出现。

  6. 最后,你必须解析 JSON 对象(Python 有优秀的内置工具),然后解析你得到的 html 注释(你可能想查看一下美丽汤 http://www.crummy.com/software/BeautifulSoup/).

正如您所看到的,这需要一些工作,但尽管我写了这么多,但这也不是一项极其复杂的任务。

所以不要惊慌。

只需要不断地挖掘,直到找到金子(另外,具备一些基本的 WEB 知识也没什么坏处)。然后,如果您遇到障碍并且确实无法继续前进,请回到这里,再次询问。有人会帮助你。

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Scrapy (Python) 抓取网络数据(在线新闻评论) 的相关文章

  • 从 SHAP 值中获取特征重要性

    我想要获得重要功能的数据框 通过下面的代码 我得到了 shap values 但我不确定这些值的含义是什么 在我的 df 中有 142 个特征和 67 个实验 但得到了一个带有 ca 的数组 2500 个值 explainer shap T
  • 上传时的 Google Drive API——这些额外的空行从何而来?

    总结一下该程序 我从我的 Google 云端硬盘下载一个文件 然后在本地计算机中打开并读取一个文件 file a txt 然后在我的计算机中打开另一个文件 file b txt 处于附加模式 并且在使用这个新的 file b 更新我的 Go
  • ctypes 错误:libdc1394 错误:无法初始化 libdc1394

    我正在尝试将程序编译为共享库 我可以使用 ctypes 在 Python 代码中使用该库 使用以下命令该库可以正常编译 g shared Wl soname mylib O3 o mylib so fPIC files pkg config
  • Pyqt-如何因另一个组合框数据而更改组合框数据?

    我有一个表 有 4 列 这 4 列中的两列是关于功能的 一个是特征 另一个是子特征 在每一列中 所有单元格都有组合框 我可以在这些单元格中打开txt 我想 当我选择电影院作为功能时 我只想看到子功能组合框中的电影名称 而不是我的 数据 中的
  • Python 是解释型的还是编译型的,或者两者兼而有之?

    据我了解 An 解释的语言是由解释器 将高级语言转换为机器代码然后执行的程序 实时运行和执行的高级语言 它一次处理一点程序 A compiled语言是一种高级语言 其代码首先由编译器 将高级语言转换为机器代码的程序 转换为机器代码 然后由执
  • Python中列表中两个连续元素的平均值

    我有一个偶数个浮点数的列表 2 34 3 45 4 56 1 23 2 34 7 89 我的任务是计算 1 和 2 个元素 3 和 4 5 和 6 等元素的平均值 在 Python 中执行此操作的快捷方法是什么 data 2 34 3 45
  • 更改 x 轴比例

    我使用 Matlab 创建了这个图 使用 matplotlib x 轴绘制大数字 例如 100000 200000 300000 我想要 1 2 3 和 10 5 之类的值来指示它实际上是 100000 200000 300000 有没有一
  • 如何从 JSON 响应重定向?

    所以我尝试使用 Flask 和 Javascript 上传器 Dropzone 上传文件并在上传完成后重定向 文件上传正常 但在烧瓶中使用传统的重定向 return redirect http somesite com 不执行任何操作 页面
  • GradientTape 根据损失函数是否被 tf.function 修饰给出不同的梯度

    我发现计算的梯度取决于 tf function 装饰器的相互作用 如下所示 首先 我为二元分类创建一些合成数据 tf random set seed 42 np random seed 42 x tf random normal 2 1 y
  • Python:我不明白 sum() 的完整用法

    当然 我明白你使用 sum 与几个数字 然后它总结所有 但我正在查看它的文档 我发现了这一点 sum iterable start 第二个参数 start 的作用是什么 这太尴尬了 但我似乎无法通过谷歌找到任何示例 并且对于尝试学习该语言的
  • 使用 Conda 更新特定模块会删除大量软件包

    我最近开始使用 Anaconda Python 发行版 因为它提供了许多开箱即用的数据分析库 使用 conda 创建环境和安装软件包也轻而易举 但是当我想更新 Python 本身或任何其他模块时 我遇到了一些严重的问题 我事先被告知我的很多
  • Werkzeug 中的线程和本地代理。用法

    首先 我想确保我正确理解了功能的分配 分配本地代理功能以通过线程内的模块 包 共享变量 对象 我对吗 其次 用法对我来说仍然不清楚 也许是因为我误解了作业 我用烧瓶 如果我有两个 或更多 模块 A B 我想将对象C从模块A导入到模块B 但我
  • `pyqt5'错误`元数据生成失败`

    我正在尝试安装pyqt5使用带有 M1 芯片和 Python 3 9 12 的 mac 操作系统 我怀疑M1芯片可能是原因 我收到一个错误metadata generation failed 最小工作示例 directly in the t
  • 在 Spyder 的变量资源管理器中查看局部变量

    我是 python 新手 正在使用 Spyder 的 IDE 我欣赏它的一项功能是它的变量资源管理器 然而 根据一些研究 我发现它只显示全局变量 我找到的解决方法是使用检查模块 import inspect local vars def m
  • 在 Windows 上使用带有对数刻度的 matplotlib 时出现 Unicode 错误

    我正在使用 python 2 6 和 matplotlib 如果我运行 matplotlib 库页面中提供的示例 histogram demo py 它工作正常 我已经大大简化了这个脚本 import numpy as np import
  • Flask 应用程序的测试覆盖率不起作用

    您好 想在终端的 Flask 应用程序中测试 删除路由 我可以看到测试已经过去 它说 test user delete test app LayoutTestCase ok 但是当我打开封面时 它仍然是红色的 这意味着没有覆盖它 请有人向我
  • bs4 `next_sibling` VS `find_next_sibling`

    我在使用时遇到困难next sibling 并且类似地与next element 如果用作属性 我不会得到任何返回 但如果用作find next sibling or find next 然后就可以了 来自doc https www cru
  • [cocos2d-x]当我尝试在 Windows 10 中运行“python android-build.py -p 19 cpp-tests”时出现错误

    当我尝试运行命令时python android build p cpp tests 我收到如图所示的错误 在此之前 我收到了另一条关于 Android SDK Tools 版本兼容性的错误消息 所以 我只是将 sdk 版本从 26 0 0
  • 通过 Web 界面执行 python 单元测试

    是否可以通过 Web 界面执行单元测试 如果可以 如何执行 EDIT 现在我想要结果 对于测试 我希望它们是自动化的 可能每次我对代码进行更改时 抱歉我忘了说得更清楚 EDIT 这个答案此时已经过时了 Use Jenkins https j
  • python 日志记录会刷新每个日志吗?

    当我使用标准模块将日志写入文件时logging 每个日志会分别刷新到磁盘吗 例如 下面的代码会将日志刷新 10 次吗 logging basicConfig level logging DEBUG filename debug log fo

随机推荐

  • 如何使用 pincode 作为输入查找纬度和经度列表

    有什么方法可以使用 zip pincode 找到纬度和经度列表吗 Input 560103 Output 12 123456 72 123456 12 123654 72 366666 12 123456 72 123456 on goog
  • 用于将 DataTable 替换为集合的最佳 C# 泛型类?

    我正在尝试将遗留的 C NET 1 1 应用程序带入现代时代 我们使用 DataTable 来收集可能是业务对象的内容 鉴于大多数代码认为它正在与 DataRow 的接口进行通信 那么哪种通用集合可以实现最不痛苦的转换 如果我正确地阅读了您
  • std::stack 是否公开迭代器?

    是否std stack在 C STL 中公开底层容器的任何迭代器 还是应该直接使用该容器 根据堆栈的定义 堆栈没有迭代器 如果您需要带有迭代器的堆栈 则需要自己在其他容器 std list std vector 等 之上实现它 堆栈文档在这
  • Python 导入:导入不带 .py 扩展名的模块?

    在我开发的Python系统中 我们通常有这种模块结构 mymodule mymodule mymodule feature py mymodule test feature py 这使得我们的小测试框架可以轻松导入 test feature
  • 我们如何使用 hibernate criteria API 将列排序为 int?

    您好 我想使用 hibernate Criteria API 从数据库中获取数据 该数据应按某些列作为数字排序 该列在 DB 中定义为 varchar 但我必须以数字形式获取 我在使用标准 API 时遇到问题 因为它仅像字符串一样排序 前任
  • SQLite 中的 IF 语句:更新还是插入?

    我无法使用 SQLite 运行此查询 if 0 lt select COUNT from Repetition where Word behnam and Topic mine begin update Repetition set Cou
  • jqplot:分离刻度和系列值

    我有一项 Web 服务 可以在一个数组中发送日期值 针对 x 轴 它将 y 轴值发送到另一个数组中 是否可以让 jqPlot 创建一个包含 2 个这样的数组的图表 文档似乎表明这是可能的 我知道将日期和系列值组合在一个数组中是有效的 希望避
  • 无法使用 phpexcel 上传文件文件路径问题

    我目前正在使用 phpexcel 库来读取我的 excel 文件 该文件将由用户上传 但我现在不能 我正在使用这段代码 我现在无法获得文件路径 如果有人可以告诉我 如何覆盖现有文件并重命名输入文件 文件正在传输到文件夹 但我无法在这一行中获
  • 如何在不运行docker镜像的情况下查看其中的文件? (注意:这个问题是如何在不运行容器的情况下读取文件)[重复]

    这个问题在这里已经有答案了 有时运行 docker 镜像会失败 因此无法通过 ssh 进入容器 在这种情况下 我们如何查看容器内的内容 存在一个问题 但被错误地标记为重复 如何在不运行docker镜像的情况下浏览它 https stacko
  • Android 中的 main() 在哪里?

    我是 Android 新手 正在研究框架 这迫使我问这个问题 由于我们要在 Android 中扩展 Activity 因此必须有main某处Activity或者有一个隐藏类Activity包含的工具main 我到处找 但没找到 如果有人能对
  • MySQL auto_increment步长是如何确定的

    我有一个网页表 主键作为 URL 的哈希值 还有一个 auto increment ID 列 它也是一个唯一键 我有点困惑的是为什么连续插入不会将 ID 字段增加 1 当我第一次创建表并执行一次插入时 第一个 id 是 1 第二次插入生成的
  • 需要用C#创建一个动画GIF

    我尝试过各种解决方案 例如 http bloggingabout net blogs rick archive 2005 05 10 3830 aspx http bloggingabout net blogs rick archive 2
  • 数组数组上的 ng-repeat,按子数组索引排序

    假设我有这个对象 var rows 1 2 3 4 11 222 3333 4444 鉴于此 以及这个模板 tr td cell td tr 我怎样才能订购ng repeat通过每行的第二个 列 索引处的值1给定的row元素 我是否正确地认
  • 用Python计算稀疏矩阵的N个最小特征值

    我想在Python中找到稀疏矩阵的N个最小特征值 我尝试过使用scipy sparse linalg eigen arpack包 但计算最小特征值的速度非常慢 我在某处读到有一个移位反转模式 但是当我尝试使用它时 我收到一条错误消息 告诉我
  • 将 WordPress 站点从本地主机移动到实时服务器

    我已将 WordPress 网站从本地主机服务器移至实时服务器 我已经很好地编辑了 wp config php 文件 并将站点 url 添加到数据库中的 home 和 SiteURL 列 但我仍然无法在线访问我的管理页面 并且我的站点仍然显
  • 如何从 iOS 以编程方式访问 Safari 的阅读列表

    是否可以从 iOS 以编程方式访问 Safari 的 阅读列表 我知道可以从 Mac 上执行此操作 如下所述 谢谢 国标 iOS 7 添加了一个 API 来将项目添加到阅读列表中 import
  • 将事件传递给父视图?

    我有一个包含五个 TextView 的布局 当用户单击五个 TextView 中的任何一个时 它将执行相同的操作 打开另一个 Activity 因此 五个 TextView 的 OnClickerListener 行为是相同的 我是否可能只
  • 编码为 uri 和绝对 Windows 路径

    我有一个 XML 文件 其中包含以文件名开头的部分
  • 如何从 Git 中删除无效的远程分支引用?

    在我当前的存储库中 我有以下输出 git branch a master remotes origin master remotes public master 我想删除remotes public master从分支列表 git bran
  • 使用 Scrapy (Python) 抓取网络数据(在线新闻评论)

    我想从在线新闻中抓取网络评论数据纯粹用于研究 我注意到我必须学习 Scrapy 通常 我使用 Python 进行编程 我想这很容易学 但我遇到了一些问题 我想抓取新闻评论http news yahoo com congress wary b