使用 python 抓取隐藏的 href
web-scraping hidden href using python
我正在使用 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 ("see all") 可以看到更多href。但是如果你检查源页面,即使你添加 /#page=4 或任何页面到 url,总的 hrefs 保持不变(实际上页面源没有改变)。我怎样才能获得所有这些隐藏的 href?
Prenote: I assume you use Python 3+.
发生的事情是,您单击 "See All",它请求 API,获取数据,转储到视图中。这就是全部 AJAX 过程。
复杂的方法是使用Selenium,但实际上没有必要。在浏览器上稍微调试一下,您可以看到 where it loads the data.
这是第一页。 q
可能是搜索查询, page
正是哪个页面。每页 5 个元素。您可以通过 urllib
或 requests
请求它并用 json
将其解析成字典。
一个简单的演示
我想自己尝试一下,我们从中获取数据的服务器似乎需要 User-Agent
header 来处理,否则,它只会抛出 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
- 您可以使用
urllib2
。 urllib2
不像 Python 那样分成包 3. 因此,您只需 from urllib2 import Request, urlopen
.
我正在使用 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 ("see all") 可以看到更多href。但是如果你检查源页面,即使你添加 /#page=4 或任何页面到 url,总的 hrefs 保持不变(实际上页面源没有改变)。我怎样才能获得所有这些隐藏的 href?
Prenote: I assume you use Python 3+.
发生的事情是,您单击 "See All",它请求 API,获取数据,转储到视图中。这就是全部 AJAX 过程。
复杂的方法是使用Selenium,但实际上没有必要。在浏览器上稍微调试一下,您可以看到 where it loads the data.
这是第一页。 q
可能是搜索查询, page
正是哪个页面。每页 5 个元素。您可以通过 urllib
或 requests
请求它并用 json
将其解析成字典。
一个简单的演示
我想自己尝试一下,我们从中获取数据的服务器似乎需要 User-Agent
header 来处理,否则,它只会抛出 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
- 您可以使用
urllib2
。urllib2
不像 Python 那样分成包 3. 因此,您只需from urllib2 import Request, urlopen
.