刮HTML和JavaScript

问题描述 投票:5回答:4

我正在开展一个项目,我需要抓取几个网站并从中收集不同类型的信息。文本,链接,图像等信息

我正在使用Python。我在HTML页面上为此目的尝试了BeautifulSoup并且它可以工作,但是在解析包含大量JavaScript的网站时我很困难,因为这些文件的大部分信息都存储在<script>标记中。

任何想法如何做到这一点?

javascript python parsing web-scraping web-crawler
4个回答
4
投票

首先,从页面中删除和解析JS并非易事。但是,如果您使用无头Web客户端,它可以大大简化,它将像普通浏览器一样为您解析所有内容。 唯一的区别是它的主界面不是GUI / HMI而是API。

例如,您可以将PhantomJS与Chrome或Firefox一起使用,它们都支持无头模式。

有关无头浏览器的更完整列表,请查看here


1
投票

如果页面加载中涉及大量的javascript动态加载,事情变得更加复杂。

基本上,您有三种方法可以从网站抓取数据:

  • 使用浏览器开发人员工具查看页面加载时AJAX请求的内容。然后在您的抓取工具中模拟这些请求。您可能需要jsonrequests模块的帮助。
  • 使用利用selenium等真实浏览器的工具。在这种情况下,您不关心页面的加载方式 - 您将获得真实用户看到的内容。注意:您也可以使用headless浏览器。
  • 看看网站是否提供API(例如walmart API

另外看看Scrapy web-scraping框架 - 它也不处理AJAX调用,但这确实是我曾经使用过的网络抓取世界中最好的工具。

另请参阅以下资源:

希望有所帮助。


0
投票

为了让您开始使用selenium和BeautifulSoup:

使用npm安装phantomjs(节点包管理器):

apt-get install nodejs
npm install phantomjs

安装硒:

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)

0
投票

一个非常快的方法是迭代所有标签并获取textContent这是JS片段:

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;')

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.