【发布时间】:2020-12-29 15:32:10
【问题描述】:
下面是我逐行编写的代码(大约有 900 页,每行有 10 行和 5 个数据) 有什么方法可以加快速度。目前将数据导出到 csv 需要 80 分钟。有什么方法可以对页面进行并行请求并提高此代码的效率。
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()
【问题讨论】:
-
尝试使用 pandas 和字典 stackoverflow.com/questions/57000903/…
-
此代码受 IO 限制 - 大多数时间将用于发出 HTTP 请求 - 因此优化它的方法是使用线程或类似方法并行化 HTTP 请求。
-
@snakecharmerb 抱歉不知道 THread 你能帮忙吗!
-
作为python线程的简单介绍,我推荐这篇文章:medium.com/better-programming/…
标签: python multithreading asynchronous threadpool python-multithreading