使用Beautiful Soup进行Web报废(不捕获所有信息)

时间:2018-05-28 05:16:41

标签: python-3.x beautifulsoup

我曾经使用过几次漂亮的汤包,但这是第一次没有我需要的所有信息。如何获得完整的网页?我需要提取所有出版物和论文的超链接。

from bs4 import BeautifulSoup
import requests

url = 'https://openreview.net/group?id=ICLR.cc/2018/Conference'
source = requests.get(url).text
soup = BeautifulSoup(source, 'html.parser')

1 个答案:

答案 0 :(得分:3)

还有其他HTTP请求正在填写网页。 查看这些内容的好方法是使用Web浏览器中提供的检查器。 在Chrome中,您可以在“网络”下查看这些请求。检查员中的选项卡。

请求如下:

似乎每个人都会返回JSON文本以及您要查找的信息(文章的出版物和超链接), 因此,您只需为每个URL创建单独的请求,并按以下方式访问返回的JSON:

import json

source = requests.get(new_url).text

# json.loads returns a Python dictionary
data = json.loads(source)

for publication in data['notes']:
    publication_info = publication['_bibtex']
    url = publication_info.split('\nurl={')[1].split('}')[0]

包含每个发布的URL的元素很难解析,因为它在字典名称中不允许使用字符(即' @'), 但这个解决方案应该可行。

请注意,我没有测试过此解决方案,因此可能存在一些错误,但解决方案背后的基础逻辑应该是正确的。

可替换地:

您可以使用Splash,它用于呈现基于Javascript的页面。您可以非常轻松地在Docker中运行Splash,只需向Splash容器发出HTTP请求,该容器将返回看起来就像在Web浏览器中呈现的网页一样的HTML。

虽然这听起来过于复杂,但实际上设置起来非常简单,因为您根本不需要修改Docker镜像,因此您无需先知道docker即可工作。它只需要一行就可以启动本地Splash服务器: docker run -p 8050:8050 -p 5023:5023 scrapinghub/splash

然后,您只需修改Python代码中的任何现有请求即可转发到splash:

即。 http://example.com/成为
http://localhost:8050/render.html?url=http://example.com/