抓取HTML和JavaScript
我正在做一个项目,需要爬取几个网站,收集不同类型的信息,比如文本、链接、图片等等。
我用的是Python来实现这个功能。我尝试过使用BeautifulSoup来处理HTML页面,这个方法有效,但在解析那些包含很多JavaScript的网站时遇到了困难,因为这些网站上的大部分信息都存储在<script>
标签里。
有没有什么好的办法可以解决这个问题呢?
4 个回答
0
一种非常快速的方法是遍历所有标签,然后获取它们的 textContent
。这段代码是用JavaScript写的:
page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent;
或者你也可以在selenium/python中这样做:
import selenium
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://ranprieur.com")
pagetext = driver.execute_script('page =""; var all = document.getElementsByTagName("*"); for (tag of all) page = page + tag.textContent; return page;')
0
下面是关于如何开始使用selenium和BeautifulSoup的一些简单步骤:
首先,你需要通过npm(Node包管理器)来安装phantomjs:
apt-get install nodejs
npm install phantomjs
接下来,安装selenium:
pip install selenium
然后,你会得到一个结果页面,像这样,然后像往常一样用BeautifulSoup来解析它:
from BeautifulSoup4 import BeautifulSoup as bs
from selenium import webdriver
client = webdriver.PhantomJS()
client.get("http://foo")
soup = bs(client.page_source)
2
如果网页加载时涉及很多动态的JavaScript内容,那事情就会变得复杂一些。
基本上,你有三种方法可以从网站上抓取数据:
- 使用浏览器的开发者工具,查看在页面加载时有哪些AJAX请求。然后在你的爬虫中模拟这些请求。你可能需要用到json和requests这两个模块的帮助。
- 使用像selenium这样的工具,它可以模拟真实的浏览器。在这种情况下,你不需要关心页面是如何加载的——你会得到真实用户看到的内容。注意:你也可以使用无头浏览器。
- 看看网站是否提供API(例如沃尔玛API)。
另外,建议你看看Scrapy这个网页抓取框架——虽然它也不处理AJAX请求,但这是我用过的网页抓取工具中最好的。
还可以参考这些资源:
- 用Python抓取JavaScript页面
- 用Python抓取JavaScript生成的数据
- 用Python抓取动态内容
- 如何用Python使用Selenium?
- 用Python和PhantomJS进行无头Selenium测试
- 在动态页面中用Selenium和Scrapy
希望这些对你有帮助。