最近一直在琢磨爬虫,从最早的BeautifulSoup爬取游民福利图,后来要爬取的动态网页多了,就逐渐过渡到了selenium+chromedriver/phantomJs的爬虫组合。偶然间听基友说有个msdn.itellyou.cn里收集了各种微软程序的ed2k安装包,因此便开始了对它的爬取之旅。

这个网站的页面结构还是挺复杂的。通过观察,发现软件的名称和地址都在右侧内容项中的label>checkbox中,名称为label的值,而地址为checkbox的data-url属性。且右侧的具体内容是通过div的动态加载来实现的,只有在点击了左侧的具体目录项才会出现;对于多语言的软件,每个子标签中的软件的xpath中的id又是不同的,因此需要动态获得每个子标签的id。最后,该网站会时不时地弹出呼吁捐赠的对话框,也会对爬虫造成影响。

由于采用selenium+chromedriver,且网站的各个资源项的id也摸不到规律,只能用最笨的方法——模拟点击法来获取所有软件的地址,即将目录项一个一个点开后再依次点击右侧的语言栏(若有的话);同时,在点击时还要处理随时可能弹出的捐款对话框。此外,有很多目录项里头其实没有数据,但也要花费一定时间点击。总的来说,这个爬虫效率是比较低的,若大家有更高效率的方法,欢迎提出。

源代码如下:

# -*- coding=utf-8 -*-
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
import time
from selenium.common.exceptions import NoSuchElementException,ElementNotVisibleException,WebDriverException,TimeoutException
import xlwt
#左侧目录的xpath
catalogue_list = ['//*[@id="accordion"]/div[1]/div[1]/h4/a','//*[@id="accordion"]/div[2]/div[1]/h4/a','//*[@id="accordion"]/div[3]/div[1]/h4/a','//*[@id="accordion"]/div[4]/div[1]/h4/a','//*[@id="accordion"]/div[5]/div[1]/h4/a','//*[@id="accordion"]/div[6]/div[1]/h4/a','//*[@id="accordion"]/div[7]/div[1]/h4/a','//*[@id="accordion"]/div[8]/div[1]/h4/a']
catalogue_name = [u'企业解决方案',u'MSDN技术资源库',u'工具和资源',u'应用程序',u'开发人员工具',u'操作系统',u'服务器',u'设计人员工具']count = 0
software_name_list = []
software_url_list = []def builddriver(kind):chromedriver_path = 'D:\\WebDrivers\\chromedriver_win32\\chromedriver.exe'phantomjs_path = 'D:\\WebDrivers\\phantomjs\\bin\\phantomjs.exe'if kind == 'Chrome':driver = webdriver.Chrome(executable_path=chromedriver_path)elif kind == 'Phantomjs':driver = webdriver.PhantomJS(executable_path=phantomjs_path)return driver#关闭弹出的捐款对话框
def clickdialog():global drivertry:dialog_close_button = driver.find_element_by_xpath('/html/body/div[2]/div/div/div[1]/button')if dialog_close_button:dialog_close_button.click()time.sleep(3)except NoSuchElementException:passexcept ElementNotVisibleException:pass#通过该函数调用所有的点击功能,防止对话框干扰
def click_when_dialog(target_item):try:target_item.click()except WebDriverException:clickdialog()target_item.click()except NoSuchElementException, e:raise eexcept TimeoutException:time.sleep(2)target_item.click()# 处理某灵异bug……except WebDriverException:time.sleep(2)target_item.click()finally:time.sleep(4)def get_one_kind_software(kind_name_selector, type_name):global software_name_list, software_url_listsoftware_file = open(type_name + '.txt', 'w')kind_name = driver.find_element_by_xpath(kind_name_selector)click_when_dialog(kind_name)kind_id = kind_name.get_attribute('data-target')[1:]software_item = driver.find_elements_by_xpath('//*[@id="' + kind_id + '"]/div/ul/li')  # 目录下的软件列表项# 顺序点击每个目录项for i in range(0, len(software_item)):click_when_dialog(software_item[i])# 获取右侧数据# 多语言:# 获取多语言列表multi_languate_list = driver.find_elements_by_xpath('//*[@id="view_data_container"]/ul/li/a')if multi_languate_list:for j in range(0, len(multi_languate_list) - 1):software_id = 'lang_' + multi_languate_list[j].get_attribute('data-id')try:click_when_dialog(multi_languate_list[j])except NoSuchElementException:continue# 获取具体内容try:software_name = driver.find_element_by_xpath('//*[@id="' + software_id + '"]/ul/li/div/label').textsoftware_url = driver.find_element_by_xpath('//*[@id="' + software_id + '"]/ul/li/div/label/input').get_attribute('data-url')except NoSuchElementException:# 可能未加载完,但实际有time.sleep(4)try:software_name = driver.find_element_by_xpath('//*[@id="' + software_id + '"]/ul/li/div/label').textsoftware_url = driver.find_element_by_xpath('//*[@id="' + software_id + '"]/ul/li/div/label/input').get_attribute('data-url')# 这个真没有……except NoSuchElementException:continuesoftware_name_list.append(software_name)software_url_list.append(software_url)for i in range(0, len(software_name_list)):software_file.write(software_name_list[i] + '    ' + software_url_list[i] + '\n')print type_name + '已爬取完成。\n'# 清空已写入至文件的列表software_name_list = []software_url_list = []software_file.close()def file_to_excel():global countworkbook = xlwt.Workbook()sheet_list = []for sheet_name in catalogue_name:sheet = workbook.add_sheet(unicode(sheet_name), cell_overwrite_ok=True)sheet_list.append(sheet)# 依次打开文件并写入对应的sheetfor i in range(0, len(catalogue_name)):count = 0software_file = open(unicode(catalogue_name[i]) + '.txt', 'r')for line in software_file:sheet_list[i].write(count, 0, unicode(line.split('    ')[0]))sheet_list[i].write(count, 1, unicode(line.split('    ')[1]))count += 1software_file.close()print u'软件存储完成'workbook.save('software.xls')driver = builddriver('Chrome')
if __name__ == "__main__":global driverdriver.get('http://msdn.itellyou.cn/')time.sleep(5)for k in range(0, len(catalogue_list)):get_one_kind_software(catalogue_list[k], catalogue_name[k])driver.close()file_to_excel()
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">此网站共分为8个目录,这段程序将每个目录的结果分别存为一个txt文件,最后再将其整理成一个excel文件。</span>

代码中的所谓“灵异bug”,是指在爬取操作系统那一目录时,经常到MS-DOS西班牙语之后会弹出异常:Other element would receive click:<nav class="balabala ……></nav>,且有时出现在这里,有时出现在爬取完Win7处,单步也抓不到。因此只能抛出一个WebdDriverException,处理方法是等2s后再试一次。

爬取后的成果:

个人感觉,用selenium+chromedriver/phantomjs爬取网页的效率实在是不高,但是碰到动态网页似乎又没有其他更好的办法。若有高人知道高效爬取动态网页的方法,还请不吝赐教。

爬取msdn.itellyou.cn网站相关推荐

  1. 从入门到入土:基于Python爬取四川大学所有官方网站|狗头保命|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  2. python爬取汽车之家_python爬虫实战之爬取汽车之家网站上的图片

    随着生活水平的提高和快节奏生活的发展.汽车开始慢慢成为人们的必需品,浏览各种汽车网站便成为购买合适.喜欢车辆的前提.例如汽车之家网站中就有最新的报价和图片以及汽车的相关内容,是提供信息最快最全的中国汽 ...

  3. Search For Free —— 新闻爬虫及爬取结果的查询网站

    文章目录 一. 项目概述 1.1 核心需求 1.2 技术要求 二. demo展示 2.1 项目框架 2.2 演示demo视频 三. 网站分析 四.数据爬取 4.1 爬虫整体结构 4.2 使用的工具包 ...

  4. python3爬取巨潮资讯网站年报数据

    python3爬取巨潮资讯网站年报数据 2018年年底巨潮资讯http://www.cninfo.com.cn改版了,之前实习生从网上找的脚本不能用了,因此重新修改了下爬取脚本.最初脚本的原链接忘了, ...

  5. python3爬取数据_python3爬取巨潮资讯网站年报数据

    python3爬取巨潮资讯网站年报数据 2018年年底巨潮资讯http://www.cninfo.com.cn改版了,之前实习生从网上找的脚本不能用了,因此重新修改了下爬取脚本.最初脚本的原链接忘了, ...

  6. Python 爬虫实战入门——爬取汽车之家网站促销优惠与经销商信息

    在4S店实习,市场部经理让我写一个小程序自动爬取汽车之家网站上自家品牌的促销文章,因为区域经理需要各店上报在网站上每一家经销商文章的露出频率,于是就自己尝试写一个爬虫,正好当入门了. 一.自动爬取并输 ...

  7. Scrapy笔记十二:简单爬取苏宁书籍网站

    文章目录 简单爬取苏宁书籍网站 参考网址: 整个爬取过程思路: 未解决的问题: 代码如下: 简单爬取苏宁书籍网站 参考网址: 网址1:https://book.suning.com/ 网址2:http ...

  8. Python零基础之爬取王者荣耀官方网站高清壁纸(普通版)

    Python零基础之爬取王者荣耀官方网站高清壁纸 目标: 分析过程: 1. 确定目标url 2. 解决url解析问题 3. 图片下载解析 4. 多页面的处理 代码示例 需要注意的问题: 目标: 1.下 ...

  9. Crawler:基于urllib+requests库+伪装浏览器实现爬取国内知名招聘网站,上海地区与机器学习有关的招聘信息(2018.4.30之前)并保存在csv文件内

    Crawler:基于urllib+requests库+伪装浏览器实现爬取国内知名招聘网站,上海地区与机器学习有关的招聘信息(2018.4.30之前)并保存在csv文件内 目录 输出结果 设计思路 核心 ...

  10. 爬取唯美女生网站上所有小姐姐的照片

    爬取唯美女生网站 前几天刚好看到有人在教学爬取唯美女生网站(https://www.vmgirls.com)的图片,大致听了一下,只是介绍了一次爬取某一个小姐姐的照片,因此就尝试做一个爬取全站小姐姐照 ...

最新文章

  1. linux vim 字体大小,Linux学习—vim大全
  2. 学习VIM编辑器的使用
  3. 设置element表格透明样式
  4. WebApi 接口参数不再困惑:传参详解
  5. LuckyDraw app被评为Microsoft365 App Award
  6. 02.Mybatis的动态代理方式实现增删改查
  7. UEditor在线编辑器配置及注意事项
  8. Linux RS-232 程式設計
  9. redis 缓存模式
  10. 设计模式(1)单例模式
  11. springboot集成logback配置文件模板
  12. 拓端tecdat|matlab测量计算信号的相似度
  13. 快速生成大量测试数据
  14. 唐宇迪学习笔记7:梯度下降策略
  15. xp无法访问文件共享服务器,XP不能访问Windows7共享文件之解决办法
  16. 基于51单片机的秒表设计
  17. Nginx跳转到用户首页
  18. amp;#9733;色盲悖论正解!
  19. COLD:中文冒犯性语言检测数据集
  20. excel表格中18位身份证号码如何转换成出生日期

热门文章

  1. PR基础学习(二) 导入和预览素材视频
  2. 做IT就要做到高层!
  3. python输入个人所得税计算_Python实现的个人所得税计算器
  4. kodwebserver mysql_kod云项目搭建
  5. 清远机器人编程_清远宇舵机器人告诉你为什么少年儿童要学习机器人编程?
  6. android textview字体为宋体,安卓开发--textView的字体样式设置(设置宋体,微软雅黑等)...
  7. 计算与推断思维 十六、比较两个样本
  8. 2022-2022阿里巴巴Android面试真题解析,阿里+头条+抖音+百度+蚂蚁+京东面经
  9. C++ Learning (Next)
  10. Blender进阶Python编程3D开发-源码分析笔记系列-做出你自己的3D数据图表