【问题标题】:Extracting links from a URL until there is data and then moving to the next URL从 URL 中提取链接,直到有数据,然后移动到下一个 URL
【发布时间】:2021-03-12 07:53:44
【问题描述】:

我有一个要从中提取数据的 URL。我找到了一种从该网址中提取数据的方法。但是如果现有 URL 没有任何数据,我该如何移动到下一个 URL?

在 main 函数中使用的基本 URL 是, https://posoco.in/reports/daily-reports/

相反,我只想提取 2020-21 年的数据,然后从这里继续, https://posoco.in/reports/daily-reports/daily-reports-2020-21/

这样,如果 2020-21 的 pdf 文件全部被提取,那么只要网站以自动方式存在,程序就应该从下一个 URL 开始提取,即 2021-22 依此类推,这样程序就可以自动检查它们每年一次。

我写的代码。

#import libraries
import re
import tabula
import datetime
from datetime import datetime,timedelta
from datetime import timedelta, date
import requests
import pandas as pd
import glob
import logging
import os
import urllib.request
import urllib.error
import urllib.parse
from bs4 import BeautifulSoup
import wget

def source_urls(url):
    html = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(html, 'html.parser')
    tags = soup('a')
    filelink = []
    for link in tags:
        if ('daily-reports-' in link.get('href','')):
            filelink.append(link.get('href'))
    return filelink

def get_urls(url):
    html = urllib.request.urlopen(url).read()
    soup = BeautifulSoup(html, 'html.parser')
    tags = soup('a')
    filelink = []
    for link in tags:
        if ('_nldc_psp/?wpdmdl' in link.get('href','')):
            filelink.append(link.get('href'))
    return filelink

if __name__ == "__main__":
    url = 'https://posoco.in/reports/daily-reports/'
    file_links = source_urls(url)
    sorted_file_links = sorted(file_links)
    for files in sorted_file_links:
        sub_files = get_urls(files)
        for x in sub_files:
            print(x)

程序输出

https://posoco.in/download/31.03.14_nldc_psp/?wpdmdl=3256
https://posoco.in/download/30.03.14_nldc_psp/?wpdmdl=3255
https://posoco.in/download/29.03.14_nldc_psp/?wpdmdl=3254
https://posoco.in/download/28.03.14_nldc_psp/?wpdmdl=3253
....
...
...
...
...
https://posoco.in/download/11-03-21_nldc_psp/?wpdmdl=35681
https://posoco.in/download/10-03-21_nldc_psp/?wpdmdl=35649
https://posoco.in/download/09-03-21_nldc_psp/?wpdmdl=35627
https://posoco.in/download/08-03-21_nldc_psp/?wpdmdl=35612
https://posoco.in/download/07-03-21_nldc_psp/?wpdmdl=35589

我已经粘贴了所有的库,但这里只使用了几个。 rest 用于下载和处理和记录。

【问题讨论】:

  • 所以基本上你要问的是如何设置一个每年运行你的脚本的 cron 作业?您的代码工作得很好(尽管它可能会被显着重构)。要获得新的网址,您需要等到 2022 年。说了这么多,你有什么问题?

标签: python-3.x beautifulsoup python-requests


【解决方案1】:

好吧,你必须设置一个条件,它将拾取主 urls,它等于/大于 2021-20

然后就可以解析内部的urls了。

另外,这里不需要使用.get

由于您使用条件来获取网址,包括_nldc_psp/?wpdmdl,这意味着如果有模式则返回它。所以你不要需要将值替换为空值link.get('href',''),然后返回它!

import httpx
import trio
from bs4 import BeautifulSoup
from datetime import datetime
from pprint import pprint as pp

cond = datetime.strptime('2020-21', '%Y-%d')


async def get_urls(client):
    r = await client.get('https://posoco.in/reports/daily-reports/')
    soup = BeautifulSoup(r.text, 'lxml')
    return [x['href'] for x in soup.select('a[href*=reports-]') if datetime.strptime(x['href'].split('-', 3)[-1][:-1], '%Y-%d') >= cond]


async def main():
    async with httpx.AsyncClient(timeout=None) as client, trio.open_nursery() as nurse:
        links = await get_urls(client)

        async def get_pdf(url):
            r = await client.get(url)
            soup = BeautifulSoup(r.text, 'lxml')
            pp([x['href']
                for x in soup.select('a[href*="nldc_psp"]')])

        if links:
            for link in links:
                nurse.start_soon(get_pdf, link)


if __name__ == "__main__":
    trio.run(main)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2021-12-16
    • 2016-08-18
    • 1970-01-01
    • 2019-10-12
    相关资源
    最近更新 更多