如何加速我的拖网python代码?

如何加速我的拖网python代码?,python,selenium,web-scraping,finance,Python,Selenium,Web Scraping,Finance,我一直在使用Python代码从股票交易模拟软件中提取数据(我获取我正在交易的证券的股票代码,例如VTI、AAPL、GOOG等),然后搜索晨星的股票代码,并从该网站提取定价信息和我想要的任何其他信息。我将所需列表中的数据保存到.csv文件中,以便在Excel中使用。我使用Selenium来运行一个webdriver(我使用Chrome来直观地查看流程,或者使用PhantomJS来运行无头程序,而不使用浏览器GUI),并使用beautifulsoup来访问网站和使用HTML 我的程序运行正常,但只需

我一直在使用Python代码从股票交易模拟软件中提取数据(我获取我正在交易的证券的股票代码,例如VTI、AAPL、GOOG等),然后搜索晨星的股票代码,并从该网站提取定价信息和我想要的任何其他信息。我将所需列表中的数据保存到.csv文件中,以便在Excel中使用。我使用Selenium来运行一个webdriver(我使用Chrome来直观地查看流程,或者使用PhantomJS来运行无头程序,而不使用浏览器GUI),并使用beautifulsoup来访问网站和使用HTML

我的程序运行正常,但只需120秒就可以完成一个只有11种证券的投资组合,我希望能扩展这个程序来做更精细的操作

在我的编码风格中,有没有什么可以改变的东西可以加速网页垃圾处理的过程?有没有编写Python代码的通用方法来实现快速执行

代码如下:

from selenium import webdriver
from bs4 import BeautifulSoup
import csv

#browser = webdriver.Chrome() #replace with .Firefox(), or with the browser of your choice
browser = webdriver.PhantomJS()

security_links_list = list()
equitysim_ticker_list = list()

url = ['https://www.equitysim.com/Home'
]

for item in url:

 browser.get(item) #navigate to page behind login
 username = browser.find_element_by_id('placeholderContent_txtUserName')
 username.send_keys('EDITED_FOR_SECURITY')
 password = browser.find_element_by_id('placeholderContent_txtPassword')
 password.send_keys('EDITED_FOR_SECURITY')
 form = browser.find_element_by_id("placeholderContent_LoginButton")
 form.click()

 innerHTML = browser.execute_script("return document.body.innerHTML") #returns the inner HTML as a string
 innerHTML = browser.page_source
 html = browser.page_source
 soup = BeautifulSoup(html, 'html.parser')
 table_a = soup.find('table', 'ba-tbl admintable')
 for a in table_a.find_all('a', href=True):
    security_links_list.append(a['href'])
links_set = set(security_links_list)
links_set.remove('#')
print(links_set)

mystring = "https://www.equitysim.com"

links_set_revised = [mystring + link_text for link_text in links_set]
print(links_set_revised)

for item in links_set_revised:

 browser.get(item)
 innerHTML = browser.execute_script("return document.body.innerHTML") #returns the inner HTML as a string
 innerHTML = browser.page_source
 html = browser.page_source
 soup = BeautifulSoup(html, 'html.parser')

 title_element = soup.find("title")
 title = title_element.text
 ticker = title.split(':', 1)[0]

 ticker = ticker.replace('\n','')
 ticker = ticker.replace('\t','')

 equitysim_ticker_list.append(ticker)

print(equitysim_ticker_list)

morningstar_ticker_search = "http://quote.morningstar.com/TickerLookup.html"
uri_links = list()

for ticker in equitysim_ticker_list:
 browser.get(morningstar_ticker_search)
 enter_ticker = browser.find_element_by_xpath("//input[@value='Ticker']")
 enter_ticker.click()
 search_ticker = browser.find_element_by_class_name('F3')
 search_ticker.send_keys(ticker)
 go_box = browser.find_element_by_xpath("//input[@src='http://im.morningstar.com/im/go.gif']")
 go_box.click()

 html = browser.page_source
 soup = BeautifulSoup(html, 'html.parser')
 outer_div = soup.find('div', attrs={'id': 'quote_quicktake'})
 iframe = outer_div.find('iframe').get('src')
 full_url = 'https:' + iframe
 uri_links.append(full_url)

print(uri_links)

price_list = list()
ticker_list = list()
nav_list = list()

for item in uri_links:

 browser.get(item) #navigate to page behind login
 innerHTML = browser.execute_script("return document.body.innerHTML") #returns the inner HTML as a string
 innerHTML = browser.page_source
 html = browser.page_source
 soup = BeautifulSoup(html, 'html.parser')

 price_element = soup.find("div", attrs={"id": "lastPrice"})
 price = price_element.text # strip() is used to remove starting and trailing

 nav_element = soup.find("span", attrs={"id": "NAV"} or {"vkey": "NAV"})
 nav = nav_element.text
 nav_split1 = nav.split('\n                                   \t\t', 1)[1]
 nav_split2 = nav_split1.split(' ', 1)[0]

 title_element = soup.find("title")
 title = title_element.text
 ticker = title.split(' ', 1)[0]

 price_list.append(price)
 nav_list.append(nav_split2)
 ticker_list.append(ticker)

 print(ticker)
 print(price)
 print(nav_split2)
 #ticker =

print(ticker_list)
print(price_list)
print(nav_list)


csvfile = "C:\\Users\\USERNAME\\AppData\\Local\\Programs\\Python\\Python36\\personal\\exampleCsv.csv"

#Assuming res is a flat list
with open(csvfile, "w") as output:
    writer = csv.writer(output,lineterminator='')
    writer.writerow(ticker_list)
    writer.writerow('\n')
    writer.writerow(price_list)
    writer.writerow('\n')
    writer.writerow(nav_list)

这是一个公平的问题,但这对于StackOverflow来说有点离题了,因为这个问题可能有许多不同的正确答案。对这个问题的典型回答是并行运行更多浏览器,通常使用芹菜之类的队列。将所有URL放在一个队列中,然后跨越硬件/网络可以处理的尽可能多的工作人员来获取它们。如果你不需要JavaScript,可以考虑使用SoRy或机器人。为了加速网络浏览,不要使用硒。使用http库获取页面,并使用XML库对其进行解析。@SiKing我仔细研究了您的建议,了解到Beautifulsoup的解析器可以与lxml解析器交换。这就是您所说的使用XML库进行解析的意思吗?另外,关于您关于使用http库获取页面的建议,您是指使用诸如请求之类的库吗?我明天也会亲自调查,但任何直接的建议都会很好。谢谢你给我指明了正确的方向!