【问题标题】:web-scraping hidden href using python使用python抓取隐藏的href
【发布时间】:2017-02-20 11:57:25
【问题描述】:

我正在使用 python 从以下网页获取所有可能的 href:

http://www.congresovisible.org/proyectos-de-ley/

这两个例子

href="ppor-medio-de-la-cual-se-dictan-medidas-para-defender-el-acceso-de-los-usuarios-del-sistema-de-salud-a-medicamentos-de-calidad-eficacia-y-seguridad-acceso-de-los-usuarios-del-sistema-de-salud-a-medicamentos/8683">

href="ppor-medio-del-cual-el-congreso-de-la-republica-facultado-por-el-numeral-17-del-articulo-150-de-la-constitucion-politica-de-colombia-y-en-aras-de-facilitar-la-paz-decreta-otorgar-amnistia-e-indulto-a-los-miembros-del-grupo-armado-organizado-al-margen-de-la-ley-farc-ep/8682">

最后有一个列表,其中包含该页面中所有可能的href。

但是,通过单击 ver todos(“查看全部”)可以看到更多的 href。但是,如果您检查源页面,即使您将 /#page=4 或任何页面添加到 url,总 href 保持不变(实际上页面源不会改变)。我怎么能得到所有这些隐藏的href?

【问题讨论】:

标签: javascript python web-scraping href


【解决方案1】:

前注:我假设您使用 Python 3+。

发生的情况是,您单击“查看全部”,它会请求 API、获取数据、转储到视图中。这都是 AJAX 进程。

使用 Selenium 是一个复杂的方法,但实际上没有必要。在浏览器上稍微调试一下,就可以看到where it loads the data

这是第一页。 q 可能是搜索查询,page 正是哪个页面。每页 5 个元素。您可以通过urllibrequests 请求它并使用json 包将其解析为字典。


一个简单的演示

我想自己尝试一下,似乎我们从中获取数据的服务器需要一个User-Agent 标头来处理,否则,它只会抛出403(禁止)。我正在尝试 Python 3.5.1。

from urllib.request import urlopen, Request
import json

# Creating headers as dict, to pass User-Agent. I am using my own User-Agent here.
# You can use the same or just google it.
# We need to use User-Agent, otherwise, server does not accept request and returns 403.
headers = {
    "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36 OPR/39.0.2256.48"
}

# Creating a Request object.
# See, we pass headers, below.
req = Request("http://www.congresovisible.org/proyectos-de-ley/search/proyectos-de-ley/?q=%20&page=1", headers=headers)

# Getting a response
res = urlopen(req)

# The thing is, it returns binary, we need to convert it to str in order to pass it on json.loads function.
# This is just a little bit complicated.
data_b = res.read()
data_str = data_b.decode("utf-8")

# Now, this is the magic.
data = json.loads(data_str)

print(data)

# Now you can manipulate your data. :)

对于 Python 2.7

  • 您可以使用urllib2urllib2 不像在 Python 3 中那样分成包。因此,您只需要做from urllib2 import Request, urlopen

【讨论】:

  • 感谢您的回答。我忘了说明我使用的是 python 2.7,但我会尝试你的建议。
  • 针对 Python 2.7 编辑
猜你喜欢
  • 2018-09-22
  • 2020-09-02
  • 1970-01-01
  • 2021-06-08
  • 2020-05-11
  • 2021-05-05
  • 2016-04-05
  • 1970-01-01
  • 2017-02-28
相关资源
最近更新 更多