【Python实战】selenium自动批量下载艾瑞咨询免费报告

工作中需要预约实验室,奈何学校的预约系统不给力,用户体验不佳。

比如,预约7天的某个实验室的6个小房间,需要执行相同的操作6*7=42次。每次的操作都是一模一样,系统无法自定义一段时间,就是得傻傻地点点点。

约了两次之后,实在受不了这么傻瓜的操作。

就尝试探索学习python+selenium怎么让浏览器自己预约实验室。

然后,花了半天时间后,终于可以通过修改代码,2分钟让电脑自己干完之前需要20+分钟的无意义的人工重复操作了。

其实,之前好几次都想学这个selenium的自动化,但没遇到合适的机会(需求),差不多每次都放弃在自动登录上。

正好这个预约实验室算是让自己入门了,比如,本来打算调用百度的OCR文字识别来帮助通过验证码登录,结果,系统登录界面的验证码就是个图片,输入啥都通过。。。

现在有信心去搞点其他的事儿了。

之前就有个想把艾瑞咨询的免费报告都下载下来的需求,而这个也正好不需要登录,简直就是完美的练习机会。


艾瑞咨询.png
报告下载.png

selenium是一个用电脑模拟人操作浏览器网页,可以实现自动化,测试等。

selenium在python的安装和配置,百度或者bing一下,还是很容易的。

实现过程主要就是要捋清楚人是怎么操作浏览器网页的。

在自动批量下载艾瑞咨询的免费报告这个例子中,需要涉及到:打开浏览器、设置浏览器默认下载路径、选择下拉框中的不同行业和不同时间、拖动下拉条显示出所有报告、获取每个报告的下载链接、点击下载等一系列操作。

捋清楚每个步骤后,就可以去找每个步骤的实现方式(函数),然后,循环就行。

在用selenium的时候,看着电脑自己操作浏览器,感觉还是有些神奇的。这里录了一小段自动下载的过程。

自动化.gif

具体代码记录一下。

from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.keys import Keys
from time import sleep
import time
import random,os
from selenium.webdriver.chrome.options import Options


# 获取列表
def get_ls(xpath):
    ul = driver.find_element_by_xpath(xpath)
    sleep(1)
    li = ul.find_elements_by_tag_name('li')
    sleep(1)
    ls = []
    for t in li:
        txt = t.find_elements_by_tag_name('a')
        for i in txt:
            ls.append(i.get_attribute("textContent"))
    return ls

# 选择行业
def select_cate(li_num):
    driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[1]/div').click()
    sleep(1)
    driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[1]/ul/li[' + str(li_num) + ']').click()
    sleep(1)

# 选择时间
def select_time(li_num):
    driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[2]/div').click()
    sleep(1)
    driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[2]/ul/li[' + str(li_num) + ']').click()
    sleep(1)

# 滚动条拉到最底
def scroll_down():
    for i in range(1,100):
        try:
            nomore = driver.find_element_by_xpath('/html/body/div/div[2]/div[5]/div/div/p').get_attribute("textContent")
            sleep(1)
            print(nomore)
            break
        except:
            js="var q=document.documentElement.scrollTop=10000"
            driver.execute_script(js)
            sleep(2)

# 获取当页所有报告列表
def get_href_ls():
    href_ls = []
    ul = driver.find_element_by_xpath('/html/body/div/div[2]/div[4]/div/div/ul') 
    try:
        li = ul.find_elements_by_tag_name('li')
        ls = []
        for l in li:
            div = l.find_elements_by_xpath('div[1]')
            for d in div:
                als = d.find_elements_by_tag_name('a')
                for a in als:
                    href = a.get_attribute('href')
                    href_ls.append(href)
    except:
        href_ls = []
    return href_ls


# 设置浏览器及下载路径
def set_browser(path):
     # 浏览器设置
    chrome_options = Options()
     # 修改下载路径
    tmpath = 'C:\\study\\6_other\\reports\\' + path
    print(tmpath)
    # 判断路径是否存在,未存在则创建文件夹
    if not os.path.exists(tmpath):
        os.makedirs(tmpath)
    prefs = {'profile.default_content_settings.popups': 0, #防止保存弹窗
    'download.default_directory': tmpath, #设置默认下载路径
    "profile.default_content_setting_values.automatic_downloads":1 #允许多文件下载
    }
    chrome_options.add_experimental_option('prefs', prefs)
    #修改windows.navigator.webdriver,防机器人识别机制,selenium自动登陆判别机制
    chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) 
    driver = webdriver.Chrome(options=chrome_options)
    # 窗口最大化
    # driver.maximize_window()
    # 打开艾瑞咨询报告网页
    driver.get('https://www.iresearch.com.cn/report.shtml')

    return driver


if __name__ == '__main__':
    driver = webdriver.Chrome()
    # 打开艾瑞咨询报告网页
    driver.get('https://www.iresearch.com.cn/report.shtml')
    sleep(2)
    # 获取行业列表
    cate_ls = get_ls('/html/body/div/div[2]/div[3]/div/div/div[1]/ul')
    print(cate_ls)
    # 获取时间列表数
    time_ls = get_ls('/html/body/div/div[2]/div[3]/div/div/div[2]/ul')
    print(time_ls)
    # 关闭浏览器
    driver.quit()
    # 纪录开始时间
    start = time.perf_counter()
    totalnum = 0
    for c in range(2, len(cate_ls)+1):
    # for c in range(8, 9):
        for t in range(2, len(time_ls)+1):
        # for t in range(6, 7):
            print('当前为:',c,cate_ls[c-1], t,time_ls[t-1])
            # 报告路径
            path = cate_ls[c-1] + '\\' + time_ls[t-1]
            # 打开浏览器
            driver = set_browser(path)
            sleep(5)
            # 选择类别
            select_cate(c)
            sleep(2)
            select_time(t)
            sleep(2)
            # 下拉滚动条
            scroll_down()
            # 获取当前页面报告链接
            href_ls = get_href_ls()
            num = len(href_ls)
            if num >0:
                for n,url in enumerate(href_ls):
                    driver.get(url)
                    sleep(2)
                    # 点击下载
                    driver.find_element_by_xpath('/html/body/div/div[2]/div[3]/div/div/div[1]/div/div[1]/a[2]').click()
                    sleep(2)
                    print('正在下载{}/{}:'.format(n+1, num), url)
            totalnum = totalnum + num
            # 纪录结束时间
            end = time.perf_counter()
            print('用时:',end-start)
            # 关闭窗口且在关闭前等待5秒
            sleep(5)
            driver.close()
    print('总共:{}份报告'.format(totalnum))
    # 纪录结束时间
    end = time.perf_counter()
    print('总共用时:',end-start)

总共1514份报告,用了差不多3.8小时。

其中一个很大的感受就是,得sleep好多秒,比如打开了下载报告页面后得等待几秒,不然可能因为网速没刷出来,就下载不成功。

所以,整体下载速度不会特别快,但好在可以解放双手,让电脑自己慢慢下,自己去干其他事儿了。

文件夹.png

你可能感兴趣的:(【Python实战】selenium自动批量下载艾瑞咨询免费报告)