Python 访问深层类层次结构中的所有href链接
我正在尝试访问网站上的所有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
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。单击它,并检查响应。