注意:我大约一年要教自己如何编写代码以作为工作的补充,所以请不要在这件事上uke之以鼻;我知道那不是很好。
无论如何,我正在尝试编写代码以从大约1500000个网页中下载pdf,这些网页按一个整数顺序排列,然后仅从包含某些关键字的网页中提取文本。我将在下面删除一些名称,但是我已经将此名称与多线程一起运行(我在计算机上使用Oracle VirtualBox和10个内核),它可以处理大约25分钟/分钟,但是这需要我大约41天,这基本上是不可行的。寻求帮助以使此代码块更快得多,以便我可以在合理的时间内完成此操作。任何帮助,将不胜感激。
其他说明:通过网站进行迭代时,并非所有文件实际上都是pdf格式,并且某些网页只是空白。另外,我从其他人那里得到了很多,所以这里可能有很多无用的代码。我创建了一个文件(costSummary.txt),该文件收集有问题的商品的序列号和该商品的成本,并且可以对其进行优化。
#Load libraries
from wand.image import Image as Img
import requests
from PIL import Image
import pytesseract
import cv2
import os
from os import path
from os import listdir
from os import stat
import multiprocessing as multi
import numpy as np
import sys
#Create function to extract the information
def webIterate():
myfile = open('costSummary.txt', 'w')
for i in range(20):
id = 4766120 + i
image_url = 'http://website{}.pdf'.format(id)
r = requests.get(image_url, stream = True)
with open('python{}.pdf'.format(id), 'wb') as pdf:
for chunk in r.iter_content(chunk_size=1024):
if chunk:
pdf.write(chunk)
if stat('python{}.pdf'.format(id)).st_size > 0:
with Img(filename='python{}.pdf'.format(id), resolution = 300) as img:
img.compression_quality = 99
img.save(filename='sample_scan{}.jpg'.format(id))
if path.exists('sample_scan{}-0.jpg'.format(id)):
os.rename('sample_scan{}-0.jpg'.format(id), 'sample_scan{}.jpg'.format(id))
text = ''
if stat('sample_scan{}.jpg'.format(id)).st_size > 0:
text = pytesseract.image_to_string(Image.open('sample_scan{}.jpg'.format(id)))
if stat('python{}.pdf'.format(id)).st_size == 0:
text = ''
if (text.find('HORIZONTAL WELL') == -1):
text = ''
for item in text.split('\n'):
if 'SERIAL' in item:
sn = item.strip()
for item in text.split('\n'):
if '$' in item:
capex = item.strip()
myfile.write('%s\n' % sn)
myfile.write('%s\n' % capex)
test = os.listdir('/home/myDirectory')
for item in test:
if item.endswith('{}.jpg'.format(id)):
os.remove(item)
elif item.endswith('{}.pdf'.format(id)):
os.remove(item)
else:
test = os.listdir('/home/myDirectory')
for item in test:
if item.endswith('{}.jpg'.format(id)):
os.remove(item)
elif item.endswith('{}.pdf'.format(id)):
os.remove(item)
myfile.close()
file_name = multi.current_process().name +'.txt'
test = os.listdir('/home/myDirectory')
for item in test:
if item.endswith('.jpg'):
os.remove(item)
elif item.endswith('.pdf'):
os.remove(item)
cpus = multi.cpu_count()
workers = []
for cpu in range(cpus):
sys.stdout.write('CPU' + str(cpu) + '\n')
worker = multi.Process(name = str(cpu),
target = webIterate,
args = ())
worker.start()
workers.append(worker)
for worker in workers:
worker.join()