最近学习了一下爬虫的原理和基本的思路, 并且利用selenium + Python + Chrome 进行了一系列的爬虫.
最开始的想法是, 想每天爬取自己网易云音乐的一些数据, 比如每天听歌量, 之类的.
可以很轻松的利用selenium中的CSS selector 或者 XPath路径找到对应的HTML标签元素, 再通过鼠标等操作, 完成登陆, 进而爬取数据,
但是, 后来发现网易云音乐的登陆有机器人检测, 在监视模式下无法通过selenium直接登陆. 参考了网上的各方意见之后, 找到解决的方法有两种:
1. 通过get/post请求分析, 并修改header来提交表单完成登陆操作;(在requests模块中)
2. 通过模拟鼠标移动来登陆(但听说这种方法现在也会直接被认定为机器人!)
最终这个登陆问题也没有得到解决!!
但是, 这并没有打消我爬虫的积极性. 所以就有了现在的免登陆爬虫:
零、运行环境搭建:
1. 运行环境
我的爬虫是在win7下运行的,用到的爬虫软件有:
ChromeDriver 70.0.3538.67
Python 3.7.0
Selenium 3.14.1
当然, 如果你和我一样, 也是Firefox的忠实粉丝, 我也为你做了测试:
geckodriver-v0.23.0-win64
Firefox 60.0.1
Python 3.7.0
Selenium 3.14.1
这么做的目的主要是因为, 一开始不知道Firefox也有headless模式(无头), 所以专门下载的Chrome.
2. 爬虫部署:
Win7下: 可以使用任务计划程序来定制爬虫; 我使用的是一个叫Ontimer的软件, 可以一键设置和管理所有自定义的计划, 并实现后台静默运行;
Linux下: 我的服务器是CentOS6.9, 比较难搭建运行环境, 如果是CentOS7的操作系统, 可以使用crontab来部署你的爬虫!
一、 取得并分析URL地址:
取得的URL地址如:https://music.163.com/#/user/songs/rank?id=你的网易云音乐ID
上面id=, 可以通过找到你的个人主页来得到(也可以修改id来访问别人的主页)
二、设置请求头:
# 设置Chrome请求头(无头模式):
options = webdriver.ChromeOptions()
options.add_argument('--headless')
options.add_argument('lang=zh_CN.UTF-8') # 设置中文
options.add_argument('disable-infobars') #隐藏"Chrome正在受到自动软件的控制"
options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
# 更换头部
user_agent = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36"
)
options.add_argument('user-agent=%s'%user_agent)
这个是Chrome浏览器请求头设置的代码, 如果你用的是Firefox浏览器:
# 设置Chrome请求头(无头模式):
options = webdriver.FirefoxOptions()
options.add_argument('-headless')
options.add_argument('lang=zh_CN.UTF-8') # 设置中文
options.add_argument('disable-infobars') #隐藏"Chrome正在受到自动软件的控制"
options.add_argument('--disable-gpu') #谷歌文档提到需要加上这个属性来规避bug
# 更换头部
user_agent = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_4) " +
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1547.57 Safari/537.36"
)
options.add_argument('user-agent=%s'%user_agent)
基本和Chrome一致.
如果很不幸, 你用的是PhantomJS或者其他的浏览器驱动, 我这里并没有配置header的代码;
(其实我是有PhantomJS配置的代码的, 但是由于听说PhantomJS要停止维护了, 所以在这里就不写了! 有需要的朋友请自行百度)
三、配置并请求链接:
browser = webdriver.Chrome(chrome_options=options)
browser.get("https://music.163.com/#/user/songs/rank?id=" + user_id)
在这里, 我通过一个str类型的变量user_id来实现了访问网易云音乐不同用户的页面;
三'、预处理: