我正在尝试开发一个简单的网络刮板。我想提取没有html代码的文本。事实上,我实现了这个目标,但是我看到在一些加载javascript的页面中,我没有获得好的结果。
例如,如果一些javascript代码添加了一些文本,我就看不到它,因为当我调用
response = urllib2.urlopen(request)
我得到的原始文本没有添加的文本(因为javascript是在客户机中执行的)。
所以,我在想一些办法来解决这个问题。
我正在尝试开发一个简单的网络刮板。我想提取没有html代码的文本。事实上,我实现了这个目标,但是我看到在一些加载javascript的页面中,我没有获得好的结果。
例如,如果一些javascript代码添加了一些文本,我就看不到它,因为当我调用
response = urllib2.urlopen(request)
我得到的原始文本没有添加的文本(因为javascript是在客户机中执行的)。
所以,我在想一些办法来解决这个问题。
15条答案
按热度按时间lokaqttq1#
美丽素和 selenium 的混合对我很有效。
p、 你可以在这里找到更多的等待条件
kq4fsx7k2#
您需要在脚本中为页面的不同部分使用urllib、requests、beautifulsoup和selenium web驱动程序(仅举几例)。
有时你只需要其中一个模块就可以得到你所需要的。
有时您需要两个、三个或所有这些模块。
有时你需要关闭浏览器上的js。
有时你需要在你的脚本标题信息。
没有一个网站可以以同样的方式被刮去,也没有一个网站可以永远以同样的方式刮去,而不必修改你的爬虫,通常是在几个月之后。但它们都可以刮!有志者事竟成。
如果将来需要不断地刮取数据,只需刮取所有需要的数据,并用pickle将其存储在.dat文件中。
只要继续搜索如何尝试这些模块和复制粘贴到谷歌你的错误。
wixjitnu3#
使用pyqt5
nqwrtyyt4#
我两天来一直在试图找到这个问题的答案。许多答案会把你引向不同的问题。但蛇的答案上面是真正的重点。这是最短、最简单的解决方案。只是提醒一下,最后一个单词“var”代表变量名,因此应该用作:
jaql4c8m5#
如前所述,selenium是呈现javascript结果的好选择:
gazpacho是一个非常容易解析呈现html的库:
mwngjboj6#
我最近使用html库来解决这个问题。
他们在readthedocs.io上的扩展文档相当不错(跳过pypi.org上的注解版本)。如果您的用例是基本的,那么您可能会获得一些成功。
如果在使用response.html.render()呈现所需数据时遇到问题,可以向render函数传递一些javascript来呈现所需的特定js对象。这是从他们的文档中复制的,但可能正是您需要的:
如果指定了脚本,它将在运行时执行提供的javascript。例子:
返回已执行脚本的返回值(如果提供):
在我的例子中,我想要的数据是填充javascript绘图的数组,但是数据在html中的任何地方都没有呈现为文本。有时,如果数据是动态填充的,则根本不清楚所需数据的对象名是什么。如果无法直接从view source或inspect中跟踪js对象,可以在浏览器(chrome)的调试器控制台中键入“window”,然后输入enter,以调出由浏览器呈现的对象的完整列表。如果你让一些受过教育的人
ivqmmu1c7#
编辑2017年12月30日:这个答案出现在谷歌搜索的最热门结果中,所以我决定更新它。旧的答案还在后面。
dryscape不再维护,dryscape开发人员推荐的库只有python2。我发现将selenium的python库与phantomjs一起用作web驱动程序足够快,而且很容易完成工作。
安装phantom js后,请确保
phantomjs
二进制文件在当前路径中可用:示例
举个例子,我用下面的html代码创建了一个示例页面(链接):
如果没有javascript,它会说:
No javascript support
使用javascript:Yay! Supports javascript
##无js支持的刮削:使用js支持进行刮除:
您还可以使用python库dryscrape来检索javascript驱动的网站。
使用js支持进行刮除:
lztngnrs8#
我们没有得到正确的结果,因为任何javascript生成的内容都需要在dom上呈现。当我们获取一个html页面时,我们获取初始的、未被javascript修改的dom。
因此,我们需要在抓取页面之前呈现javascript内容。
由于selenium在这个线程中已经被多次提到(有时也提到它有多慢),我将列出另外两种可能的解决方案。
解决方案1:这是一个非常好的教程,介绍如何使用scrapy对javascript生成的内容进行爬网,我们将遵循这一点。
我们需要:
docker安装在我们的机器上。在这之前,这是其他解决方案的优势,因为它使用的是独立于操作系统的平台。
按照相应操作系统的说明安装splash。
引用splash文档:
splash是一个javascript呈现服务。它是一个带有http api的轻量级web浏览器,在Python3中使用twisted和qt5实现。
本质上,我们将使用splash来呈现javascript生成的内容。
运行splash服务器:
sudo docker run -p 8050:8050 scrapinghub/splash
.安装scrapy splash插件:
pip install scrapy-splash
假设我们已经创建了一个残缺的项目(如果没有,让我们创建一个),我们将按照指南更新settings.py
:那就去你的垃圾项目吧
settings.py
设置这些中间设备:splash服务器的url(如果您使用的是win或osx,这应该是docker机器的url:如何从主机获取docker容器的ip地址?):
最后,您还需要设置这些值:
最后,我们可以使用
SplashRequest
:在普通的spider中,您可以使用请求对象打开url。如果要打开的页面包含js生成的数据,则必须使用splashrequest(或splashformrequest)呈现该页面。下面是一个简单的例子:
splashrequest将url呈现为html并返回可在回调(parse)方法中使用的响应。
解决方案2:现在(2018年5月)我们称之为实验性的。。。
此解决方案仅适用于python的3.6版(目前)。
你知道“请求”模块吗(谁不知道)?
现在它有了一个网络爬行的小兄弟:请求html:
该库旨在使解析html(例如,抓取网页)尽可能简单直观。
安装请求html:
pipenv install requests-html
向页面的url发出请求:呈现响应以获取javascript生成的位:
最后,该模块似乎提供了刮削功能。
或者,我们可以尝试使用beautifulsoup和
r.html
我们刚刚渲染的对象。xkftehaa9#
也许 selenium 能做到。
fv2wmkja10#
如果你用过
Requests
模块之前,我最近发现开发人员创建了一个名为Requests-HTML
它现在还可以呈现javascript。您也可以访问https://html.python-requests.org/ 要了解有关此模块的更多信息,或者如果您只对呈现javascript感兴趣,则可以访问https://html.python-requests.org/?#javascript-支持直接学习如何使用模块使用python呈现javascript。
基本上,一旦正确安装
Requests-HTML
模块,下面的示例显示在上面的链接中,显示了如何使用此模块来刮取网站并呈现网站中包含的javascript:我最近从youtube视频上了解到了这一点。点击这里!观看演示模块工作原理的youtube视频。
deikduxw11#
听起来,您真正要查找的数据可以通过主页面上某些javascript调用的辅助url进行访问。
虽然您可以尝试在服务器上运行javascript来处理这个问题,但一种更简单的方法可能是使用firefox加载页面,并使用charles或firebug之类的工具来确定辅助url是什么。然后您可以直接查询该url以获取您感兴趣的数据。
46qrfjad12#
这似乎也是一个很好的解决方案,从一个伟大的博客文章
ogq8wdun13#
selenium最适合于抓取js和ajax内容。
查看本文,了解如何使用python从web提取数据
然后下载ChromeWebdriver。
很简单,对吧?
y3bcpkx114#
我个人更喜欢使用刮痧和 selenium 和码头都在不同的容器。通过这种方式,您可以以最小的麻烦安装,也可以对几乎都以某种形式包含javascript的现代网站进行爬网。举个例子:
使用
scrapy startproject
要创建scraper并编写spider, backbone 可以如下所示:真正的魔法发生在中间件中。覆盖downloader中间件中的两个方法,
__init__
以及process_request
,方法如下:不要忘记通过取消对settings.py文件中的下一行的注解来启用这个middlware:
接下来是dockerization。创建您的
Dockerfile
从一个轻量级映像(我在这里使用python alpine),将您的项目目录复制到它,安装要求:最后把所有的一切都集中起来
docker-compose.yaml
:跑
docker-compose up -d
. 如果你第一次这么做,它需要一段时间来获取最新的selenium/standalone chrome和构建你的scraper图像。完成后,您可以检查您的容器是否正在运行
docker ps
还要检查selenium容器的名称是否与传递给scraper容器的环境变量的名称匹配(这里是SELENIUM_LOCATION=samplecrawler_selenium_1
).输入刮板容器
docker exec -ti YOUR_CONTAINER_NAME sh
,对我的命令是docker exec -ti samplecrawler_my_scraper_1 sh
,将cd放入正确的目录中,并使用scrapy crawl my_spider
.整个东西都在我的github页面上,你可以从这里得到它
dced5bon15#
您还可以使用webdriver执行javascript。
或者将值存储在变量中