爬虫大数据 爬虫Python AI Sql我爱编程

Python3 + Selenium + Headless Ch

2018-04-09  本文已影响1648人  老胡聊聊天

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.后续

以后如果有必要的话,再研究怎么处理验证码。有兴趣的可以一起探讨。

上一篇下一篇

猜你喜欢

热点阅读