如何抓取并提取链接到n级并再次抓取数据并将其映射到python中的输出?

时间:2019-12-17 09:29:11

标签: python web-scraping web-crawler

我正在学习使用python进行网络爬取和抓取。我想在站点中有链接的地方抓取数据,而在这些链接中有更多链接。所以我想将数据刮到预定义的级别n。 这是我的基本代码

import requests
from selenium import webdriver
from requests_ntlm import HttpNtlmAuth
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import time
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.action_chains import ActionChains
from webdrivermanager import GeckoDriverManager
import pickle
from selenium.webdriver.common.keys import Keys
from urllib.parse import urljoin
from seleniumrequests import Chrome
options = Options()

options.add_argument('--incognito')
options.add_argument('--headless')
options.add_argument("--no-sandbox")
options.add_argument('--disable-dev-shm-usage')
options.add_argument("--profile-directory=Default")
driver = webdriver.Chrome("./chromedriver",options=options)

web_url = 'https://spaceflightnow.com/'
driver.get("https://spaceflightnow.com/")
time.sleep(5)
soup = BeautifulSoup(driver.page_source,"lxml")
#section = soup.section
links=[]
for url in soup.find_all('a',href=True):
     links.append(urljoin(web_url,url.get('href')))
     #print(urljoin(web_url,url.get('href')))
links = list(filter(lambda x: x != web_url,links))
print(links)

这将打印首页的多个链接。现在,我想单击并转到上一级的所有链接,然后再次将其刮取,以在其中获得更多链接。新闻链接可能会在内部再次显示相同的链接。所以我想知道的是我应该采取的方法。我能理解我需要一棵树,但无法确切地知道如何做? 就像我在列表中创建一个列表一样,但是如何动态地进行直到n级呢?以及如何与保存在文件中的数据进行映射?谁能帮我这个 ?也许有样品溶液? 谢谢:)

1 个答案:

答案 0 :(得分:0)

我举了一个无需递归即可工作的示例-我会说它类似于Breadth-First Search算法。

它将网址保留在列表 table1.SpacingBefore = 10f; table1.SpacingAfter = 12.5f; table.SpacingBefore = 10f; table.SpacingAfter = 12.5f; 上以控制级别,并保留在[(url, level),...]中以过滤访问的页面。它还过滤到外部页面的链接。

经过Firefox测试。

set()