Python 访问深层类层次结构中的所有href链接

Python 访问深层类层次结构中的所有href链接,python,selenium,dom,web-scraping,beautifulsoup,Python,Selenium,Dom,Web Scraping,Beautifulsoup,我正在尝试访问网站上的所有href链接,准确地说是搜索结果。我的第一个意图是获得所有的链接,然后进一步研究它。问题是-->我从网站上获得了一些链接,但没有搜索结果的链接。这是我的代码的一个版本 from selenium import webdriver from htmldom import htmldom dom = htmldom.HtmlDom("myWebsite") dom = dom.createDom() p_links = dom.find("a") for link in

我正在尝试访问网站上的所有href链接,准确地说是搜索结果。我的第一个意图是获得所有的链接,然后进一步研究它。问题是-->我从网站上获得了一些链接,但没有搜索结果的链接。这是我的代码的一个版本

from selenium import webdriver
from htmldom import htmldom
dom = htmldom.HtmlDom("myWebsite")
dom = dom.createDom()

p_links = dom.find("a")
for link in p_links:
    print("URL: " +link.attr("href"))
下面是该特定网站的HTML屏幕。在屏幕中,我标记了我将来尝试访问的href链接。我愿意接受任何帮助,无论是硒、htmldom、B4汤等


由于AJAX请求,在初始页面加载之后会显示结果

我设法通过
Selenium
获取链接,但是我必须等待
.ckantile a
元素加载(这些是您想要获取的链接)

我应该提到,webdriver将等待页面加载 违约它不等待在帧内加载或ajax 请求。这意味着当您使用.get('url')时,浏览器将等待 直到页面完全加载,然后转到中的下一个命令 密码。但当您发布ajax请求时,webdriver不会这样做 等待,你有责任等待适当的时间 页面或页面的一部分加载的时间;所以有一个模块 命名的预期条件

代码:

from urllib.parse import urljoin

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

url = 'https://open.nrw/suche'
html = None

browser = webdriver.Chrome()
browser.get(url)
delay = 3  # seconds

try:
    WebDriverWait(browser, delay).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.ckantitle a'))
    )
    html = browser.page_source
except TimeoutException:
    print('Loading took too much time!')
finally:
    browser.quit()

if html:
    soup = BeautifulSoup(html, 'lxml')
    links = soup.select('.ckantitle a')
    for link in links:
        print(urljoin(url, link['href']))
您需要安装selenium:

pip install selenium

并获取驱动程序。

由于AJAX请求,初始页面加载后会显示结果

我设法通过
Selenium
获取链接,但是我必须等待
.ckantile a
元素加载(这些是您想要获取的链接)

我应该提到,webdriver将等待页面加载 违约它不等待在帧内加载或ajax 请求。这意味着当您使用.get('url')时,浏览器将等待 直到页面完全加载,然后转到中的下一个命令 密码。但当您发布ajax请求时,webdriver不会这样做 等待,你有责任等待适当的时间 页面或页面的一部分加载的时间;所以有一个模块 命名的预期条件

代码:

from urllib.parse import urljoin

from bs4 import BeautifulSoup
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException

url = 'https://open.nrw/suche'
html = None

browser = webdriver.Chrome()
browser.get(url)
delay = 3  # seconds

try:
    WebDriverWait(browser, delay).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.ckantitle a'))
    )
    html = browser.page_source
except TimeoutException:
    print('Loading took too much time!')
finally:
    browser.quit()

if html:
    soup = BeautifulSoup(html, 'lxml')
    links = soup.select('.ckantitle a')
    for link in links:
        print(urljoin(url, link['href']))
您需要安装selenium:

pip install selenium

获取一个驱动程序。

您要查找的数据将加载AJAX请求。因此,在获取页面源代码后,不能直接刮取它们。但是,AJAX请求被发送到此URL:

https://open.nrw/solr/collection1/select?q=*%3A*&fl=validated_data_dict%20title%20groups%20notes%20maintainer%20metadata_modified%20res_format%20author_email%20name%20extras_opennrw_spatial%20author%20extras_opennrw_groups%20extras_opennrw_format%20license_id&wt=json&fq=-type:harvest+&sort=title_string%20asc&indent=true&rows=20
它以JSON格式返回数据。您可以使用
请求
模块来刮取此数据

import requests

BASE_URL = 'https://open.nrw/dataset/'

r = requests.get('https://open.nrw/solr/collection1/select?q=*%3A*&fl=validated_data_dict%20title%20groups%20notes%20maintainer%20metadata_modified%20res_format%20author_email%20name%20extras_opennrw_spatial%20author%20extras_opennrw_groups%20extras_opennrw_format%20license_id&wt=json&fq=-type:harvest+&sort=title_string%20asc&indent=true&rows=20')
data = r.json()
for item in data['response']['docs']:
    print(BASE_URL + item['name'])
输出:

https://open.nrw/dataset/mags-90-10-dezilsverhaeltnis-der-aequivalenzeinkommen-1512029759099
https://open.nrw/dataset/alkis-nutzungsarten-pro-baublock-wuppertal-w
https://open.nrw/dataset/allgemein-bildende-schulen-am-1510-nach-schulformen-schulen-schueler-und-lehrerbestand-w
https://open.nrw/dataset/altersgruppen-in-meerbusch-gesamt-meerb
https://open.nrw/dataset/amtliche-stadtkarte-wuppertal-raster-w
https://open.nrw/dataset/mais-anteil-abhaengig-erwerbstaetiger-mit-geringfuegiger-beschaeftigung-1477312040433
https://open.nrw/dataset/mags-anteil-der-stillen-reserve-nach-geschlecht-und-altersgruppen-1512033735012
https://open.nrw/dataset/mags-anteil-der-vermoegenslosen-in-nrw-nach-beruflicher-stellung-1512032087083
https://open.nrw/dataset/anzahl-kinderspielplatze-meerb
https://open.nrw/dataset/anzahl-der-sitzungen-von-rat-und-ausschussen-meerb
https://open.nrw/dataset/anzahl-medizinischer-anwendungen-den-oeffentlichen-baedern-duesseldorfs-seit-2006-d
https://open.nrw/dataset/arbeitslose-den-wohnquartieren-duesseldorf-d
https://open.nrw/dataset/arbeitsmarktstatistik-arbeitslose-gelsenkirchen-ge
https://open.nrw/dataset/arbeitsmarktstatistik-arbeitslose-nach-rechtskreisen-des-sgb-ge
https://open.nrw/dataset/arbeitsmarktstatistik-arbeitslose-nach-stadtteilen-gelsenkirchen-ge
https://open.nrw/dataset/arbeitsmarktstatistik-sgb-ii-rechtskreis-auf-stadtteilebene-gelsenkirchen-ge
https://open.nrw/dataset/arbeitsmarktstatistik-sozialversicherungspflichtige-auf-stadtteilebene-gelsenkirchen-ge
https://open.nrw/dataset/verkehrszentrale-arbeitsstellen-in-nordrhein-westfalen-1476688294843
https://open.nrw/dataset/mags-arbeitsvolumen-nach-wirtschaftssektoren-1512025235377
https://open.nrw/dataset/mais-armutsrisikoquoten-nach-geschlecht-und-migrationsstatus-der-personen-1477313317038

如您所见,这返回了前20个URL。首次加载页面时,仅显示20项。但是,如果向下滚动,将加载更多。要获取更多项目,可以更改URL中的查询字符串参数。URL以
行=20结尾。您可以更改此数字以获得所需数量的结果。

您要查找的数据将加载AJAX请求。因此,在获取页面源代码后,不能直接刮取它们。但是,AJAX请求被发送到此URL:

https://open.nrw/solr/collection1/select?q=*%3A*&fl=validated_data_dict%20title%20groups%20notes%20maintainer%20metadata_modified%20res_format%20author_email%20name%20extras_opennrw_spatial%20author%20extras_opennrw_groups%20extras_opennrw_format%20license_id&wt=json&fq=-type:harvest+&sort=title_string%20asc&indent=true&rows=20
它以JSON格式返回数据。您可以使用
请求
模块来刮取此数据

import requests

BASE_URL = 'https://open.nrw/dataset/'

r = requests.get('https://open.nrw/solr/collection1/select?q=*%3A*&fl=validated_data_dict%20title%20groups%20notes%20maintainer%20metadata_modified%20res_format%20author_email%20name%20extras_opennrw_spatial%20author%20extras_opennrw_groups%20extras_opennrw_format%20license_id&wt=json&fq=-type:harvest+&sort=title_string%20asc&indent=true&rows=20')
data = r.json()
for item in data['response']['docs']:
    print(BASE_URL + item['name'])
输出:

https://open.nrw/dataset/mags-90-10-dezilsverhaeltnis-der-aequivalenzeinkommen-1512029759099
https://open.nrw/dataset/alkis-nutzungsarten-pro-baublock-wuppertal-w
https://open.nrw/dataset/allgemein-bildende-schulen-am-1510-nach-schulformen-schulen-schueler-und-lehrerbestand-w
https://open.nrw/dataset/altersgruppen-in-meerbusch-gesamt-meerb
https://open.nrw/dataset/amtliche-stadtkarte-wuppertal-raster-w
https://open.nrw/dataset/mais-anteil-abhaengig-erwerbstaetiger-mit-geringfuegiger-beschaeftigung-1477312040433
https://open.nrw/dataset/mags-anteil-der-stillen-reserve-nach-geschlecht-und-altersgruppen-1512033735012
https://open.nrw/dataset/mags-anteil-der-vermoegenslosen-in-nrw-nach-beruflicher-stellung-1512032087083
https://open.nrw/dataset/anzahl-kinderspielplatze-meerb
https://open.nrw/dataset/anzahl-der-sitzungen-von-rat-und-ausschussen-meerb
https://open.nrw/dataset/anzahl-medizinischer-anwendungen-den-oeffentlichen-baedern-duesseldorfs-seit-2006-d
https://open.nrw/dataset/arbeitslose-den-wohnquartieren-duesseldorf-d
https://open.nrw/dataset/arbeitsmarktstatistik-arbeitslose-gelsenkirchen-ge
https://open.nrw/dataset/arbeitsmarktstatistik-arbeitslose-nach-rechtskreisen-des-sgb-ge
https://open.nrw/dataset/arbeitsmarktstatistik-arbeitslose-nach-stadtteilen-gelsenkirchen-ge
https://open.nrw/dataset/arbeitsmarktstatistik-sgb-ii-rechtskreis-auf-stadtteilebene-gelsenkirchen-ge
https://open.nrw/dataset/arbeitsmarktstatistik-sozialversicherungspflichtige-auf-stadtteilebene-gelsenkirchen-ge
https://open.nrw/dataset/verkehrszentrale-arbeitsstellen-in-nordrhein-westfalen-1476688294843
https://open.nrw/dataset/mags-arbeitsvolumen-nach-wirtschaftssektoren-1512025235377
https://open.nrw/dataset/mais-armutsrisikoquoten-nach-geschlecht-und-migrationsstatus-der-personen-1477313317038

如您所见,这返回了前20个URL。首次加载页面时,仅显示20项。但是,如果向下滚动,将加载更多。要获取更多项目,可以更改URL中的查询字符串参数。URL以
行=20结尾。您可以更改此数字以获得所需数量的结果。

@KeyurPotdar将是url:/@KeyurPotdar将是url:/谢谢您的回答,它就像一个符咒!你可能知道一些资源,我可以告诉自己你的代码是如何具体工作的吗?为了知道,如何做到这一点,我自己。你是怎么做到的?您在哪里认识到数据是用AJAX请求加载的?打开开发者工具并转到网络选项卡下的XHR选项卡。刷新页面,您将看到一些请求。其中一个是我使用的URL。点击它,查看回复。谢谢你的回答,它就像一个符咒!你可能知道一些资源,我可以告诉自己你的代码是如何具体工作的吗?为了知道,如何做到这一点,我自己。你是怎么做到的?您在哪里认识到数据是用AJAX请求加载的?打开开发者工具并转到网络选项卡下的XHR选项卡。刷新页面,您将看到一些请求。其中一个是我使用的URL。单击它,并检查响应。