问题描述
准备用多进程的方式同时爬取深交所网站多个上市公司的处罚信息,但是写出来的代码只对其中的一个上市公司名称执行,很困惑。
请问应该如下修改,以及代码中有哪些可以优化的地方。非常感谢!
代码如下:
相关代码
#爬取网页
import requests,time,os,multiprocessing
from selenium import webdriver
def szse(name):
driver = webdriver.Edge()
driver.maximize_window()
driver.get('http://www.szse.cn/disclosure/listed/credit/record/index.html')
time.sleep(5)
nameElem=driver.find_element_by_id('1759_cxda_tab1_txtDsr')
buttonElem=driver.find_element_by_class_name('confirm-query btn-query-primary')
nameElem.clear()
nameElem.send_keys(name)
buttonElem.click()
time.sleep(20)
pdfElem = driver.find_elements_by_link_text('查看')#判断是否有处罚。没有处罚的,pdfElem会返回空列表
if pdfElem==[]:
driver.save_screenshot(".\\深交所_查询结果\\%s.png" % (name + '_无处罚'))#截图方法 or get_screenshot_as_file
print(name + ':深交所无处罚纪录,已截图')
else:
driver.save_screenshot(".\\深交所_查询结果\\%s.png" % (name + '_处罚汇总'))
print(name + '深交所有处罚,已截图,待下载pdf')
a=1
for i in range(len(pdfElem))
partial_url=pdfElem[i].get_attribute('encode-open')
url='http://reportdocs.static.szse.cn/'+partial_url
res=requests.get(url)
res.raise_for_status()
time.sleep(10)
open('.\\深交所_查询结果\\%s_处罚纪录_%d.pdf'%(name,a),'wb').write(res.content)
print(name+'深交所处罚纪录已保存'+str(a)+'份')
a = a + 1
print(name+'深交所处罚纪录保存完毕,合计'+str(a-1)+'份')
driver.quit()
#多进程
if __name__=='__main__':
print('请输入需要查询的证券简称,用于深交所,以空格间隔')
nameSZ = input() #如:海南海药 长生生物 坚瑞沃能
st = time.time()
SZlist = nameSZ.split(' ')
os.mkdir('.\\深交所_查询结果')
#应该是这段出了问题:
pool=multiprocessing.Pool()
for name in SZlist:
pool.apply_async(func=shse, args=(name,))
#上段写成这样也不行:pool.apply_async(func=shse, args=SZlist),而且只会查询第一个证券简称的第一个字
pool.close()
pool.join()
print('完成查询和保存,用时 %d 分 %d 秒'%((time.time()-st)//60,round((time.time()-st)%60)))