写在最前面,selenium我觉得不是很适合爬取,因为慢,它只要是控制浏览器来爬取,我觉得有点像excel中的宏,定制了一定操作,批量操作,适合于死活没找到数据地址的情况。
比如,我最近在爬取网易财经的个股历史数据网易个股历史数据,想把个股的上市以来的数据下载下来,我的操作就是下载数据-上市日-今日-下载。它就启动下载了。
但是本来直接访问下载页面然后下载就好,但是这次就属于死活没找到的情况,selenium就派上用场了。
selenium有个好伙伴叫做Katalon Automation Recorder,是一个chrome插件,用法就是按record进行录制,正常操作就好,依次按下下载数据-上市日-今日-下载,然后stop。

导出export

这就是核心了。
复制粘贴到python里就变成了这样。
from selenium import webdriver
import time
import pandas as pd
import multiprocessing as mp
def getone(code):
option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')
driver = webdriver.Chrome(chrome_options=option)
url = 'http://quotes.money.163.com/trade/lsjysj_{}.html'
driver.get(url.format(code))
driver.find_element_by_id("downloadData").click()
driver.find_element_by_xpath("(//input[@name='date_start_type'])[2]").click()
driver.find_element_by_link_text(u"下载").click()
time.sleep(1.8)
driver.close()
time.sleep(1.8)是下载后停顿1.8s,主要是给下载留时间。
批量下载的话,加上pandas很好用。
def getall(file):
df = pd.read_csv(file,dtype={'code':str})
df['code'].map(getone)
再加上多进程加一下速
def multi():
pool = mp.Pool()
pool.map(getall,('laogu.txt',))
if __name__ == '__main__':
multi()
selenium就是这么简单。
网友评论