如何通过多线程代码python提高Webscraping代码速度

2023-11-29

下面是我的代码,我在其中逐行编写(大约有900页,10行,每行5个数据)有什么办法可以让它更快吗?目前正在采取80 min将数据导出到 csv 中。有什么方法可以向页面发出并行请求并使此代码更高效。

import requests
from urllib3.exceptions import InsecureRequestWarning
import csv

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from bs4 import BeautifulSoup as bs

f = csv.writer(open('GEM.csv', 'w', newline=''))
f.writerow(['Bidnumber', 'Items', 'Quantitiy', 'Department', 'Enddate'])


def scrap_bid_data():
    page_no = 1
    while page_no < 910:
        print('Hold on creating URL to fetch data...')
        url = 'https://bidplus.gem.gov.in/bidlists?bidlists&page_no=' + str(page_no)
        print('URL created: ' + url)
        scraped_data = requests.get(url, verify=False)
        soup_data = bs(scraped_data.text, 'lxml')
        extracted_data = soup_data.find('div', {'id': 'pagi_content'})
        if len(extracted_data) == 0:
            break
        else:
            for idx in range(len(extracted_data)):
                if (idx % 2 == 1):
                    bid_data = extracted_data.contents[idx].text.strip().split('\n')

                    bidno = bid_data[0].split(":")[-1]
                    items = bid_data[5].split(":")[-1]
                    qnty = int(bid_data[6].split(':')[1].strip())
                    dept = (bid_data[10] + bid_data[12].strip()).split(":")[-1]
                    edate = bid_data[17].split("End Date:")[-1]
                    f.writerow([bidno, items, qnty, dept, edate])

            page_no=page_no+1
scrap_bid_data()

我对您的代码进行了一些重组,以确保您的 CSV 文件已关闭。我还收到以下错误消息:

ConnectionError: HTTPSConnectionPool(host='bidplus.gem.gov.in', port=443): url 超出最大重试次数:/bidlists?bidlists&page_no=1 (由 NewConnectionError(' 引起):无法建立新连接:[WinError 10060] 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机未能响应',))

你应该尝试一下NUMBER_THREADS value:

import requests
from urllib3.exceptions import InsecureRequestWarning
import csv
import concurrent.futures
import functools

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
from bs4 import BeautifulSoup as bs


def download_page(session, page_no):
    url = 'https://bidplus.gem.gov.in/bidlists?bidlists&page_no=' + str(page_no)
    print('URL created: ' + url)
    resp = session.get(url, verify=False)
    return resp.text


def scrap_bid_data():
    NUMBER_THREADS = 30 # number of concurrent download requests
    with open('GEM.csv', 'w', newline='') as out_file:
        f = csv.writer(out_file)
        f.writerow(['Bidnumber', 'Items', 'Quantitiy', 'Department', 'Enddate'])
        with requests.Session() as session:
            page_downloader = functools.partial(download_page, session)
            with concurrent.futures.ThreadPoolExecutor(max_workers=NUMBER_THREADS) as executor:
                pages = executor.map(page_downloader, range(1, 910))
                page_no = 0
                for page in pages:
                    page_no += 1
                    soup_data = bs(page, 'lxml')
                    extracted_data = soup_data.find('div', {'id': 'pagi_content'})
                    if extracted_data is None or len(extracted_data) == 0:
                        print('No data at page number', page_no)
                        print(page)
                        break
                    else:
                        for idx in range(len(extracted_data)):
                            if (idx % 2 == 1):
                                bid_data = extracted_data.contents[idx].text.strip().split('\n')

                                bidno = bid_data[0].split(":")[-1]
                                items = bid_data[5].split(":")[-1]
                                qnty = int(bid_data[6].split(':')[1].strip())
                                dept = (bid_data[10] + bid_data[12].strip()).split(":")[-1]
                                edate = bid_data[17].split("End Date:")[-1]
                                f.writerow([bidno, items, qnty, dept, edate])
scrap_bid_data()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过多线程代码python提高Webscraping代码速度 的相关文章

  • 为什么 .setGeometry() 不改变 QWidget 实例的大小?

    我想使用 QWidget 更改 QPushButton 的大小 setGeometry https doc qt io qtforpython 5 PySide2 QtWidgets QWidget html PySide2 QtWidge
  • 在 Numpy 中切片后确定结果数组的形状

    我很难理解在 numpy 中切片后如何确定结果数组的形状 例如 我使用以下简单代码 import numpy as np array np arange 27 reshape 3 3 3 slice1 array 1 2 1 slice2
  • 一次将Python dict的内容分配给多个变量?

    我想做这样的事情 def f return a 1 b 2 c 3 a b f or a b f IE 这样 a 被分配为 1 b 被分配为 2 并且 c 是未定义的 这与此类似 def f return 1 2 a b f 依赖于变量名称
  • 在python中将文本文件解析为列表

    我对 Python 完全陌生 我正在尝试读取包含单词和数字组合的 txt 文件 我可以很好地读取 txt 文件 但我正在努力将字符串转换为我可以使用的格式 import matplotlib pyplot as plt import num
  • Paramiko - 使用私钥连接 - 不是有效的 OPENSSH 私钥/公钥文件

    我正在尝试找到解决方案 但无法理解我做错了什么 在我的 Linux 服务器上 我运行了以下命令 ssh keygen t rsa 这产生了一个id rsa and id rsa pub file 然后我将它们复制到本地并尝试运行以下代码 s
  • Python - 用逗号分割,跳过括号内的内容

    我需要用逗号分隔字符串 但我对这种情况有一个问题 TEXT EXAMPLE THIS IS A EXAMPLE BUT NOT WORKS FOR ME SECOND THIRD 我想拆分并得到 var 0 TEXT EXAMPLE THI
  • 如果字段值在外部列表中,Django 会注释布尔值

    想象一下我有这个 Django 模型 class Letter models Model name models CharField max length 1 unique True 还有这个列表 vowels a e i o u 我想查询
  • 创建一个类似于 Tkinter 的表

    我希望创建类似于 Tkinter 中的表格的东西 但它不一定是这样的 例如 我想创建标题 Name1 Name2 Value 并在每个标题下面有几个空白行 然后 我希望稍后用我计算的值或名称的字符串值填充这些行 因此是标签 对于 Name2
  • iPhone SDK - 在后台线程中运行重复进程

    我有一个iPhone我想在其中每隔一段时间在后台执行一个方法的应用程序1第二 所以在我的主线程中 我有以下代码UIViewController viewDidLoad NSTimer timerWithTimeInterval 1 0 ta
  • WPF 从主线程以外的其他线程截屏

    我有一个线程用于侦听 WPF 应用程序的命令 如果 WPF 应用程序收到截取屏幕截图的命令 则任务将移交给 screenshotService 我在互联网上的某个地方找到了一些代码来截取屏幕截图 似乎可以工作 但我还没有想清楚 我无法从另一
  • 无法截取宽度为 0 的屏幕截图

    我正在尝试截取 Bootstrap 模态内元素的屏幕截图 经过一番努力 我终于想出了这段代码 driver get https enlinea sunedu gob pe driver find element by xpath div c
  • conda-env list / conda info --envs 如何查找环境?

    我一直在尝试 anaconda miniconda 因为我的用户使用随 miniconda 安装的结构生物学程序 并且作者都没有 A 考虑到可能存在其他 miniconda 应用程序 B 他们的程序将在多用户环境中使用 因此 使用 Arch
  • 将一个列表的元素除以另一个列表的元素

    我有两个清单 比如说 a 10 20 30 40 50 60 b 30 70 110 正如你所看到的 列表 b 由一个列表的元素总和组成 其中 window 2 b 0 a 0 a 1 10 20 30 etc 如何获得另一个列表 该列表由
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • Airflow Python 单元测试?

    我想为我们的 DAG 添加一些单元测试 但找不到任何单元测试 有 DAG 单元测试框架吗 有一个端到端的测试框架存在 但我猜它已经死了 https issues apache org jira browse AIRFLOW 79 https
  • Python组合目录中的所有csv文件并按日期时间排序

    我有 2 年的每日数据分成每月文件 我想将所有这些数据合并到一个按日期和时间排序的文件中 我正在使用的代码组合了所有文件 但不按顺序 我正在使用的代码 import pandas as pd import glob os import cs
  • 全局变量是 None 而不是实例 - Python

    我正在处理Python 中的全局变量 代码应该可以正常工作 但是有一个问题 我必须使用全局变量作为类的实例Back 当我运行应用程序时 它说 back is None 这应该不是真的 因为第二行setup 功能 back Back Back
  • 检查字符串是否只有字母和空格 - Python

    试图让 python 返回一个字符串仅包含字母和空格 string input Enter a string if all x isalpha and x isspace for x in string print Only alphabe
  • 在 Python 模块中使用 InstaLoader

    我正在尝试使用 Instaloader 下载与主题标签相关的照片以进行图像分析 我在GitHub存储库中找到了一个全面的方法 如何在终端中执行它 但是 我需要将脚本集成到Python笔记本中 这是脚本 instaloader no vide
  • Django South - 将 null=True 字段转换为 null=False 字段

    我的问题是 转变的最佳做法是什么null True场变成null False使用 Django South 的字段 具体来说 我正在与ForeignKey 你应该先写一个数据迁移 http south aeracode org docs t

随机推荐

  • Extjs 4 MVC - App.JS 查找我的控制器的相对路径问题 - 在带有 Spring MVC 的 WEB-INF 下

    也许我的问题的解决方案包含在问题中 但基本上 我是 ExtJs 4 MVC 的新手 在放置 JSP 的位置时遇到一些困难 我正在使用带有请求映射注释的 Spring MVC 我在 ExtJs App JS 查找控制器时遇到相对路径问题 我通
  • Woocommerce 获取下一个/上一个产品相同类别

    我读过这个 Woocommerce 获取下一个 上一个产品 并且还尝试过这个 他们中的任何一个都在 woocommerce 产品类别下工作 有什么想法吗 提前致谢 在您的文件 yourtheme functions php 中添加这些函数
  • 安卓 adb 找不到

    当我从 Eclipse 运行 Android 应用程序时 出现此错误 Unexpected exception Cannot run program home antz Development adt bundle linux sdk pl
  • 将照片保存到相机胶卷并确保它确实保存

    我目前正在以这种方式将 UIImage 保存到相机胶卷中 UIImageWriteToSavedPhotosAlbum finalPicture image nil nil nil 但是 如果用户拒绝我们访问他们的照片的权限 会发生什么 我
  • 背景大小 100% 在 IE8 和 IE7 中不起作用

    我有一个空的 div 其中包含比容器大小更大的背景图像 我通过以下方式解决这个问题background image具有值 100 100 的属性 直到您在 IE8 和 IE7 中打开示例为止都没有问题 有什么解决方案吗 甚至是 javasc
  • 通过Java连接SAP时出现异常

    您能告诉我解决以下问题的解决方案吗 我在尝试通过 Java 类连接 SAP 相关文件时遇到此异常 即使sapjco3 jar在我的图书馆路径中 我在 Windows XP 和 Windows Server 98 中尝试过此操作 java l
  • 扩展不正确的 Typescript 类定义

    我正在使用 NPM 包下一个路线在我的项目中 默认导出是一个具有如下类型定义的类 export default class Routes implements Registry getRequestHandler app Server cu
  • 从 Java 调用 JavaScript 时出错

    我试图从 Java 调用 JavaFx WebView 中的 JavaScript 但我得到 Exception in thread JavaFX Application Thread netscape javascript JSExcep
  • 匹配不以空格开头或结尾的字符串的正则表达式

    我需要一个正则表达式来确保字符串不以空格开头或结尾 我不在乎它的 中间 是否有空格 只是不在开头或结尾 我有一个正则表达式almost works S S 以下是一些结果示例 HELLO Match HEL LO Match HELLO N
  • PHP file_get_contents - 替换所有 链接中的所有 URL

    SOLVED 回答如下 如何 使用 file get contents 从拉取的文件中获取所有 url 该文件可以是动态的并且有多个 URL 用自定义的新 URL 替换所有 url 并将现有的当前 url 添加到末尾作为变量 Example
  • 如何将 CString 和 std::string std::wstring 相互转换?

    CString非常方便 同时std string与STL容器更加兼容 我在用hash map 然而 hash map不支持CStrings 作为键 所以我想转换CString into a std string 写一个CString哈希函数
  • 如何获取 ASP.NET 应用程序的根文件夹

    我正在尝试获取应用程序的根文件夹 我使用了以下代码 但这给出了bin文件夹 但我需要的是应用程序的根文件夹 有可能得到这个吗 This is the full directory and exe name String fullAppNam
  • 这个 php 结构是什么意思:$html->redirect("URL")?

    我在 php 的其他地方看到过这个 gt 我以前学PHP的一本书里有这个 但是从来没有解释过 它有什么作用 如何工作 我知道重定向位 但是 html 变量和重定向函数发生了什么 提前致谢 注意 如果您不知道 对象 是什么 则下一段可能没有意
  • 如何使用executemany将Python中的字典列表插入MySQL

    我目前正在使用 MySQL 和 Python 从网络上抓取数据 具体来说 我正在抓取表数据并将其插入到我的数据库中 我当前的解决方案有效 但我觉得它效率极低 如果我不重写代码 很可能会锁定我的数据库 这是我目前使用的 部分代码 itemBa
  • 如何使用Python 3登录SAPGUI?

    我正在尝试使用 Python 登录 SAPGUI 以便创建一个脚本来自动运行事务 但我遇到了问题 每当我尝试登录时 我都会收到
  • 如何在RelativeLayout之外或屏幕之外显示一个ImageView?如何在屏幕左上角显示橡胶

    我已经设置了一个相对视图 其中包含所有元素 按钮 图像等 这是我的 Android 应用程序的标题页 现在我想在整个布局的左上角覆盖 LITE 横幅 我的问题是 LITE 横幅图像是一个倾斜的红色橡胶 我需要将其左上角点设置为屏幕上的 45
  • VS2013中如何让项目继承另一个项目的设置?

    我想创建一个本机 C 项目 它从同一解决方案中的另一个本机 C 项目继承其设置 因此 如果我要更改基础项目的设置 它将反映在派生项目中 这可能吗 我使用 继承 这个词是因为我在项目设置中看到了这一点 尽管我不确定它是从哪里继承的 项目设置共
  • Spyder anaconda 在 Linux 上因分段错误而崩溃

    我刚刚在 Linux 上安装了 Anaconda 当尝试打开spyder 从导航器或终端 时 它不起作用 当我尝试在终端中打开它时 出现以下错误 分段错误 核心转储 我完全更新了Conda 但无法解决问题 我使用的是 Conda 版本 4
  • 说<有什么用?扩展 SomeObject> 而不是

    所以我正在查看一些 Java 代码并偶然发现 List
  • 如何通过多线程代码python提高Webscraping代码速度

    下面是我的代码 我在其中逐行编写 大约有900页 10行 每行5个数据 有什么办法可以让它更快吗 目前正在采取80 min将数据导出到 csv 中 有什么方法可以向页面发出并行请求并使此代码更高效 import requests from