python - 如何抓取网站主页的其他页面

标签 python web-scraping beautifulsoup

我对Python相当陌生。在一些帮助下,我编写了一些代码来从网页上抓取一些数据。但是,我只能根据代码抓取每个链接的第一页。

目前,下面的代码允许我根据第一页抓取每年数据( https://aviation-safety.net/database/dblist.php?Year=1949 )的链接。

但是,对于某些年份,特定年份的链接 ( https://aviation-safety.net/database/dblist.php?Year=1949&lang=&page=2 ) 中还有其他页面(例如第 2 页、第 3 页、第 4 页) (https://aviation-safety.net/database/dblist.php?Year=1949&lang=&page=3)

我想知道是否可以根据每年数据的附加页面检索附加链接。

#get the additional links within each Year Link
import pandas as pd
from bs4 import BeautifulSoup
import requests

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'}
main_url = "https://aviation-safety.net/database/"

def get_and_parse_url(main_url):
    result = requests.get(main_url)
    soup = BeautifulSoup(result.content, 'html.parser')
    data_table = [main_url + i['href'] for i in soup.select('[href*=Year]')]
    return data_table

with requests.Session() as s:
    data_table = get_and_parse_url(main_url)
    df = pd.DataFrame(data_table, columns=['url'])
    datatable2 = [] #create outside so can append to it

    for anker in df.url:
        result = s.get(anker, headers = headers)
        soup = BeautifulSoup(result.content, 'html.parser')
        datatable2.append(['https://aviation-safety.net' + i['href'] for i in soup.select('[href*="database/record"]')])

 #flatten list of lists
datatable2 = [i for sublist in datatable2 for i in sublist]
df2 = pd.DataFrame(datatable2 , columns=['add_url'])
for i in df2.add_url: 
    print(i)

非常感谢任何形式的帮助,谢谢!

最佳答案

您可以通过收集 pagenumbers 类元素中的子 a 标记的匹配项来确定每个初始记录页面的附加页面数(仅限于顶部)一种是添加第 n 个类型);在生成实际附加页面 url 的列表理解中执行此操作;然后对这些页面使用额外的循环收集。在撰写本文时,这产生了 22,629 个不同的链接。

import requests
from bs4 import BeautifulSoup as bs

base = 'https://aviation-safety.net/database/'
headers = {'User-Agent':'Mozilla/5.0'}
inner_links = []

def get_soup(url):
    r = s.get(url, headers = headers)
    soup = bs(r.text, 'lxml')
    return soup 

with requests.Session() as s:
    soup = get_soup('https://aviation-safety.net/database/')
    initial_links = [base + i['href'] for i in soup.select('[href*="Year="]')]

    for link in initial_links:
        soup = get_soup(link)
        inner_links+= ['https://aviation-safety.net' + i['href'] for i in soup.select('[href*="database/record"]')]
        pages = [f'{link}&lang=&page={i.text}' for i in soup.select('.pagenumbers:nth-of-type(2) a')]

        for page in pages:
            soup = get_soup(page)
            inner_links+= ['https://aviation-safety.net' + i['href'] for i in soup.select('[href*="database/record"]')]

关于python - 如何抓取网站主页的其他页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57960453/

相关文章:

json - 在数组中循环 JSON 以获得 VBA 中的相同值

Python 使用 BeautifulSoup 将 url 写入文件

python - 为什么 `eval` 在 Python 类函数中不起作用?

python - 在同一函数中使用全局变量和局部变量

java - 无效选择器错误: Compound class names not permitted

python - 使用webdriver、python、beautifulsoup检索动态网站

python - 抓取 href 链接

python - Pandas 数据框中的可变移位

python - 这是不好的做法吗 : assigning a return variable

python - 如何使用 lxml 获取斜体和非斜体文本