【问题标题】:how to download all the pdf inside a class python如何下载类python中的所有pdf
【发布时间】:2022-01-04 09:35:49
【问题描述】:

我有大约 900 页,每页包含 10 个按钮(每个按钮都有 pdf)。我想下载所有的 pdf - 程序应该浏览所有页面并一一下载 pdf。 在此,一些pdf(随机)没有下载(代码一直到最后一页)但是一些页面中随机的一些pdf没有下载 大约 4521 个 pdf 正在下载 9000 个 pdf

仅搜索 .pdf 的代码,但我的 href 没有 .pdf page_no(1 到 900)。

https://bidplus.gem.gov.in/bidlists?bidlists&page_no=3

这是网站,下面是链接:

投标编号:GEM/2021/B/1804626

下面是我的代码

import requests
from bs4 import BeautifulSoup as bs

end_number = 900
current_page = 1
pdf_links = {}
path = '<your path>'

with requests.Session() as s:
    while True:
        r = s.get(f'https://bidplus.gem.gov.in/bidlists?bidlists&page_no={current_page}')
        soup = bs(r.content, 'lxml')
        for i in soup.select('.bid_no > a'):
            pdf_links[i.text.strip().replace('/', '_')] = 'https://bidplus.gem.gov.in' + i['href']
        #print(pdf_links)
        if current_page == 1:
            num_pages = int(soup.select_one('.pagination li:last-of-type > a')['data-ci-pagination-page'])
            print(num_pages)
        if current_page == num_pages or current_page > end_number:
            break
        current_page+=1
    
for k,v in pdf_links.items():
    with open(f'{path}/{k}.pdf', 'wb') as f:
        r = s.get(v)
        f.write(r.content)

【问题讨论】:

  • 当您的 URL 引用一个文件时,您应该考虑流式传输响应。此外,您正在使用会话引用 (s) 关闭后。你的 for 循环应该缩进
  • @JCaesar 请通过更改代码来回答它...
  • 我会,但我无法测试它,因为该 URL 目前没有响应 (ERR_CONNECTION_TIMED_OUT)
  • @JCaesar 只需使用代理站点或进行代码更改我将测试 mmyself 并让你知道
  • @JCaesar 出现语法错误

标签: python python-3.x pdf


【解决方案1】:

未测试,但演示了如何使用 requests 模块流式传输文件:

import requests
from bs4 import BeautifulSoup as bs
from concurrent.futures import ThreadPoolExecutor


def writepdf(k, v):
    path = '<YOUR_PATH>'
    with requests.Session() as session:
        with open(f'{path}/{k}.pdf', 'wb') as f:
            with session.get(v, stream=True) as r:
                for data in r.iter_content():
                    f.write(data)

def main():
    with requests.Session() as s:
        current_page = 1
        end_number = 900
        threads = []
        with ThreadPoolExecutor() as executor:
            while current_page <= end_number:
                r = s.get(f'https://bidplus.gem.gov.in/bidlists?bidlists&page_no={current_page}')
                r.raise_for_status()
                soup = bs(r.content, 'lxml')
                for i in soup.select('.bid_no > a'):
                    k = i.text.strip().replace('/', '_')
                    v = f'https://bidplus.gem.gov.in{i["href"]}'
                    threads.append(executor.submit(writepdf, k, v))
                if current_page == 1:
                    num_pages = int(soup.select_one('.pagination li:last-of-type > a')['data-ci-pagination-page'])
                    end_number = min(end_number, num_pages)
                current_page += 1
            for t in threads:
                t.result()

if __name__ == '__main__':
    main()

【讨论】:

  • 文件“C:/Users/deepak jain/PycharmProjects/SeleniumTest/DEMO/dd.py”,第 16 行(r := s.get(f'bidplus.gem.gov.in/bidlists?bidlists&page_no={current_page}')) .raise_for_status() ^ SyntaxError: 无效语法
  • 那是因为你的 Python 版本已经过时了。您需要 3.7+ 或更改代码以免使用海象运算符
  • 能否请您更新您的代码(不含海象)
  • 完成 - 但你真的应该考虑更新你的 Python 环境
  • 代码花费了太多时间 1000 条记录花费了 1 小时
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2022-10-08
  • 1970-01-01
  • 2021-12-20
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多