续:如何使用Python爬虫获取offcn上的公考信息及写入Excel表格并发送至指定邮箱

    技术2025-08-17  28

    续:如何使用Python爬虫获取offcn上的公考信息及写入Excel表格并发送至指定邮箱

    目录修改后的代码块自动打开Excel表格 紧接着 上一篇文章,本人对代码进行了一定的改良以及对上次没讲清楚的部分也会在这篇文章里进行解释。主要改良点为:让改代码支持翻页,在程序运行完成以后能自动打开Excel表格让用户进行查看。下一篇文章将会解释:对爬虫以及反爬虫机制进行简要介绍以及如何在Linux服务器上部署该代码。

    目录

    修改后的代码块

    from selenium import webdriver import xlwt import os #修改点 chrome_driver = r'C:\Users\算师妙\AppData\Local\Programs\Python\Python36\chromedriver.exe' chrome_options = webdriver.ChromeOptions() # 使用headless无界面浏览器模式 chrome_options.add_argument('--headless') # 增加无界面选项 chrome_options.add_argument('--disable-gpu') # 如果不加这个选项,有时定位会出现问题 browser = webdriver.Chrome(executable_path=chrome_driver) browser.implicitly_wait(10) # 隐性等待,如等待时间过长,请使用显性等待 browser.maximize_window() lists1 = [] lists2 = [] lists3 = [] lists4 = [] for w in range(1, 5): #修改点 formation1 = 'http://www.offcn.com/sydw/kaoshi/zj/' #修改点 formation2 = '.html' #修改点 browser.get(formation1 + str(w) + formation2) #修改点 for i in range(58): assemble1 = 'body > div:nth-child(5) > div > div.lh_left > div.lh_Hotrecommend > ul.lh_newBobotm02 > ' \ 'li:nth-child( ' assemble2 = ') > a.lh_olistCatename' str1 = browser.find_elements_by_css_selector(assemble1 + str(i) + assemble2) for j in str1: a = j.text if a == '[成绩查询]': continue lists1.append(a) print(a) assemble3 = ') > span' str2 = browser.find_elements_by_css_selector(assemble1 + str(i) + assemble3) for k in str2: a = k.text lists2.append(a) print(a) assemble4 = ') > a:nth-child(3)' str3 = browser.find_elements_by_css_selector(assemble1 + str(i) + assemble4) for l in str3: a = l.text b = l.get_attribute('href') lists3.append(a) lists4.append(b) print(a, b) print(lists1, lists2, lists3, lists4) browser.quit() # 写入Excel部分 wtbook = xlwt.Workbook(encoding='utf-8') sheet = wtbook.add_sheet('sheet1', cell_overwrite_ok=True) # 新增一个sheet工作表 row0 = [u'类型', u'时间', u'标题', u'网址'] for i in range(0, len(row0)): sheet.write(0, i, row0[i]) for i in range(len(lists1)): sheet.write(i + 1, 0, lists1[i]) sheet.write(i + 1, 1, lists2[i]) sheet.write(i + 1, 2, lists3[i]) sheet.write(i + 1, 3, lists4[i]) wtbook.save('工作簿1.xls') fd = os.startfile(r'C:\Users\算师妙\PycharmProjects\job\工作簿1.xls') #修改点

    可以从代码中看出来,修改后的代码将一开始的browser.get(‘http://www.offcn.com/sydw/kaoshi/zj/1.html’)放在了后续的一个循环中,为的是能够获取第2,3,4,5页的数据,这里有个小插曲,或者叫小技巧, 一开始的时候我打算用切换标签页的方法来定位不同的标签页,换句话说也就是当你点击下一页的时候Chrome会自动帮你打开一个新的标签页而不是覆盖原标签页,这就导致了一个问题,selenium所有的爬取动作都是在当前标签页上进行的,也就是说如果在打开一个新的标签页后如果你想回到原标签页进行爬取数据动作的话是做不到的。这对于我们现在的爬取目地来说当然不是什么问题,但为了后续不产生同样的问题而束手无策,在这边也记录一下解决方案:

    from selenium import webdriver chrome_driver = r'C:\Users\算师妙\AppData\Local\Programs\Python\Python36\chromedriver.exe' chrome_options = webdriver.ChromeOptions() # 使用headless无界面浏览器模式 chrome_options.add_argument('--headless') # 增加无界面选项 chrome_options.add_argument('--disable-gpu') # 如果不加这个选项,有时定位会出现问题 browser = webdriver.Chrome(executable_path=chrome_driver) browser.implicitly_wait(10) # 隐性等待,如等待时间过长,请使用显性等待 browser.get('https://www.baidu.com') browser.maximize_window() browser.find_element_by_id('kw').send_keys(u'csdn') now_handle = browser.current_window_handle print(now_handle) print(browser.title) browser.find_element_by_id('su').click() browser.find_element_by_xpath('//*[@id="1"]/h3/a').click() browser.get('https://www.bilibili.com') all_handles = browser.window_handles print(all_handles) browser.switch_to.window(browser.window_handles[0])

    上面一个Python程序的主要运行过程就是:打开百度,搜索csdn,然后点击第一个查询结果,再打开b站,然后将标签页切换至b站页面。 那么,现在请各位猜猜看,当前浏览器有几个标签页? 我相信各位未来各个领域的精英大佬们一定不会像我一样猜成3个的,下面是运行结果: 没错,答案是两个,在上面的Python程序中本人在倒数第二行使用了

    browser.get('https://www.bilibili.com')

    于是浏览器就把第一个打开的标签覆盖成了https://www.bilibili.com 知道这一点后本人就果断在循环中使用了browser.get()方法,省去了切换标签页的烦恼,那么如果在今后的生活中加入我们要切换标签页,该用什么方法呢,答案其实已经写在上面了 首先,当你要切换浏览器标签时,首先获取当前浏览器此时的所有handles,也就是:

    all_handles = browser.window_handles

    从输出端我们可以看到有两个handles出现了: 然后我们所需要的是切换到第一个标签页,那么代码就是:

    browser.switch_to.window(browser.window_handles[0])

    这里标签页的排序是从0开始向后排序的,所以在数组中填写的数字就是0

    自动打开Excel表格

    这块其实非常简单,也就直接上代码了

    import os fd = os.startfile(r'C:\Users\算师妙\PycharmProjects\job\工作簿1.xls')
    Processed: 0.014, SQL: 9