Python3 + Selenium + Headless Ch
1.requests受挫
之前用requests中间搞了一个简书的爬虫,启动两个py进程,一个爬url,一个读内容,用了一阵子,挺嗨的。
今天有个同事想让我帮他爬一下58同城某频道的电话号码,用于营销,看了一下58,感觉用跟简书那个很像,就打算基于现有的微调一下。
然后发现问题了,频繁请求之后会有js的滑动验证码,尝试模拟各种header,也没成功。
image.png
但奇怪的是如果用浏览器手动刷新,出现验证码的几率就小很多(也会出现,不过比直接requests好不少),暴力无脑F5,很小几率出现一次。
2.考虑使用selenium+headless chrome
所以考虑用selenium+phantomjs模拟一下:
1、模拟真实的浏览器环境,可以很少出现验证码
2、如果出现验证码,应该可以模拟滑动关掉它
网上找了demo源码搞起来一看,居然提示phantomjs已经deprecated了,查了一下果然,现在大家都开始抛弃phantomjs用headless了,有chrome和firefox两个版本,chrome的js引擎还是很给力的,所以用chrome。
3.安装
下载安装chromedriver,支持windows/linux/mac:
https://sites.google.com/a/chromium.org/chromedriver/downloads
安装python、selenium这些就不说了。
4.coding
然后就开始coding了——以下只是部分简单代码
from selenium import webdriver
chromedriverpath = 'C:/Users/hx/AppData/Local/Google/Chrome/Application/chromedriver.exe'
driver = webdriver.Chrome(chromedriverpath)
#打开目标网页
driver.get("http://bj.58.com/jiajiao/pn1")
#获取网页标题
title = driver.title
#获取html
html = driver.page_source
#其他api请自行百度
#...
driver.close()
跟beatifulsoap类似,driver也有各种可以操作dom的方法,而且比beatifulsoap还要强大,不过我并不想把之前的代码用driver重新写一遍,所以直接通过driver.page_source获取了html源代码,然后交给beatifulsoap去处理了。
#用beatifulsoap格式化
soap = BeautifulSoup(html)
#用class获取链接dom
links = soap.find_all(class_="t ac_linkurl")
#循环获取链接地址和标题
for i,link in enumerate(links):
target_url = link.get("href")
title = link.text
#mysql部分略
5.效果
写完之后测试了一下,启动的时候会稍微卡顿一下,因为要启动浏览器,然后就快了。
不间歇的访问,差不多访问50次左右会出现一下验证码,加个2秒延迟,跑了几轮,都没有再看到验证码出现了,相当于偷懒绕过了验证码。
6.后续
以后如果有必要的话,再研究怎么处理验证码。有兴趣的可以一起探讨。