python爬虫-selenium破解封IP+pytesseract破解验证码+AI破解网页加密
一直在it大咖网从事python大数据挖掘、数据爬虫、AI技术开发工作,最近在深入研究人工智能“深度学习”TensorFlow技术,采用AI技术做数据爬虫和数据挖掘的工作,AI技术主要是建立爬虫的模型、深度训练机器人、样本数据验证模型、最后我们的机器人就可以像我们千军万马的真人在做爬虫的工作了,解决了爬虫界遇到的各种验证码、封IP、加密的问题。
爬虫遇到的各种反爬难题:
我们知道人工智能的前面工作是喂养大量数据,那么这些数据怎么来呢?大数据的来源是需要用深度爬虫技术技术解决的,我从事过天某查的大数据爬虫系统深度研发、几个亿企业工商数据的采集和城市数据库建立、企某宝、企某查、淘宝、天猫、国家工商公示系统网站的数据爬虫采集等,每个网站的反爬技术都是不同的,像天某查,您如果需要采用python简单的request.get()技术是爬不到数据的,为什么呢?因为这个网站做了强大的反爬技术措施,您只要发起http模拟请求,立刻检测到您是爬虫,然后把您的IP封掉,或者直接服务器那边拒绝你访问。除了封IP外,第二个反爬技术提现在验证码,网站使用验证码的目的就是防止网站数据被爬虫程序机器爬去,因为普通的爬虫就技术是识别不出验证码的,需要用人的眼睛看才能识别出来验证码的数字,所以验证码一直是网站一道强大的守门神。比如当您爬天某查的时候,程序运行几分钟后就会自动弹出个验证码,如果您没有破解验证码那么爬虫工作也就停止了。更有趣的是有些网站采用矢量图加密,也就是传说中的字体库加密,很多爬虫高手对于这个问题缺少是束手无策。因为自己一直喜欢深度研究爬虫技术,希望的经验分享给大家,给大家一点启发.
当前网站的反爬技术有哪些:
1、天某查反爬技术分析:
图形验证码反爬:采用是图形验证码反爬技术,进行人机识别,实现反爬目的
(2)封IP发爬:服务器后台监控每个IP爬取数据的频率,如果发现同一个IP老是一直在采集就会封掉ip。
(3)VIP登录反爬:有些数据需要登录,如果不用VIP登陆是不能看到这些数据的,必须登录才能进行爬取数据。
矢量图加密:天某查的技术团队自己研发了一套字体库,用来混淆加密,让我们用浏览器打开看到的数据是正常的,但是用google或者firefox查看元素的时候看到的值是加密的值,现在这个技术对注册资本、公司经营范围、手机号码、邮箱字段等进行了字体库加密,所以我们眼睛看到的和元素源码看到的数据是不一致的,这个也是目前最高端的反爬技术。几乎没有人能够破解。(需要爬虫技术和大数据交流朋友加我qq:2779571288)
分享基础版爬虫思路:
像这种综合反爬技术的网站,我们要去批量采集数据,我们需要采取对的技术方式,比如如果我们需要爬取类似这种网站所有的企业工商数据,那么我们可以采用动态代理ip+cookie方式去采集,只有用python简单的 requests库和 BS4库即可,demo代码如下:
***************************动态代理IP爬虫完整方法*************************************************************************
Headers:是请求头,您需要模拟浏览器的请求头,请求头到底有哪些参数呢,您用google浏览器或者firefox火狐浏览器打开这个网站 然后查看元素,看网络请求里面有个 Request headers 这个就是请求头需要模拟发送的参数。如下图:
cookies:是您打开那个网站后用firebox请求记录里可以看到的cookie值复制过得即可;
Proxy: 是代理IP,您一定要用动态的爬虫代理IP去爬这种的网站,如果失败就循环下个代理IP直到成功为止。 代理IP可以去网上或者淘宝购买一些第三方的动态代理IP,但是需要高质量的、高匿名的、不限量的否则你几乎是爬不成功的,不要用几个IP尝试不成功觉得不行,需要循环大量IP,因为有些IP本身就暴露自己的身份了。
完整的爬虫代码:
import re
import requests
from bs4 import BeautifulSoup
def get_html(url, headers={}, cookies={}.proxy={}):
while True:
try:
print("模拟请求:"+url);
resp = requests.get(url, headers=headers, cookies=cookies, proxies=proxy, timeout=10)
else:
resp = requests.get(url, headers=mheaders, cookies=cookies, proxies=proxy, timeout=10)
if 'tianyancha' in url:
if resp.status_code == requests.codes.ok:
if '请输入验证码' not in resp.text:
return resp.text
else:
print('{}被封了!'.format(proxy))
elif '融资历史' in resp.text:
return resp.text
else:
print('返回代码编号1:{}, url:{}'.format(resp.status_code, url))
else:
if resp.status_code == requests.codes.ok:
if '小查为' in resp.text or '基本信息' in resp.text:
return resp.text
else:
print('返回的代码编号2:{}, url:{}'.format(resp.status_code, url))
except Exception as e:
print('url :{},捕获code:{}'.format(url, e))
这种简单的爬取方法不用什么框架,直接python引进bs4库用BeautifulSoup解析html的数据、用requests库来发起网络get的请求即可,简单几行代码即可。
面临的问题:
下面问题来了,我们采用的这种get+动态代理IP爬取这种加密的数据,而且需要登录才能看到的数据,面临的问题就是 手机号码是加密的 你爬不到手机号码,邮箱也是加密的,更厉害是注册资本也是用矢量字体库加密技术加密的,而且需要消耗大量的动态代理ip,高质量的动态ip成本是一个月几千到几万的费用,这样的爬虫技术是无法满足真正采集目的。
分享中端版解决思路:
我们需要解决的是手机号码加密,可以爬取到会员登录看到的数据,那么我们采用的技术方案是:会员模拟登陆,而且还要绕过封IPD 的问题,那么在python爬虫技术中,我们只要采用chromedriver+selenium+chrome来实现自动模拟人工登录,模拟正常人一样的打开浏览器然后输入关键词然后去搜索然后得到数据结构,这样就是完全真实浏览器操作一样,目标网站是无法识别出来的。那么这里需要注意几点:就是chromedriver版本和chrome版本要对应,否则是是不成功的。
**************selenium+chromedriver+chrome 安装*****************************
1 安装pyhton3
2 下载 chromedriver.exe (v2.41版本) 放入 E:\python3.7\Scripts目录下
3 安装 chrome 版本 69.0.3497.100(正式版本) (64 位)
chrome浏览器地址:https://dl.lancdn.com/landian/software/chrome/m/
chromedriver.exe 下载地址: http://npm.taobao.org/mirrors/chromedrive
***********selenium+chromedriver+chrome完整demo**************
# encoding=utf-8
# ----------------------------------------
# 语言:Python3.7
# 日期:2018-05-01
# 功能:破解图形验证码,
# ---------------------------------------
import time
import json
import os
import io
import sys
import re
import requests
from bs4 import BeautifulSoup
from selenium import webdrive
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
options = webdriver.ChromeOptions()
browser = webdriver.Chrome(chrome_options=options)
global count
browser.set_window_size(1050, 900) #设置浏览器打开窗口大小
browser.get('https://www.tianxxxxcha.com/login’)#用get打开网址
html=Browser.page_source #用获取网页的html源码
Print(html) #打印出来看看结果是不是
#模拟登陆:
#找到搜索框
searchbox=browser.find_element(By.XPATH,'.//*[@class="input -sm js-live-search-auto"]')
searchbtn=browser.find_element(By.XPATH,'.//*[@class="input-group-btn btn -sm btn-primary"]')
searchbox.click();#鼠标点击一下搜索框 鼠标放入搜索框意思
searchbox.clear()
time.sleep(2) #停留2秒不要太快,否容易被检测到
searchbox.send_keys(‘上海xxx有限公司’) #控制鼠标把需要采集的关键词输入到搜索框去
time.sleep(2) #停留2秒不要太快,否容易被检测到
searchbtn.click(); #模拟鼠标 点击“搜索”按钮
***********************************************************************
下面是selenium操作浏览器鼠标键盘的各种方法:
WebElement接口获取值
size 获取元素的尺寸
text 获取元素的文本
get_attribute(name) 获取属性值
location 获取元素坐标,先找到要获取的元素,再调用该方法
page_source 返回页面源码
driver.title 返回页面标题
current_url 获取当前页面的URL
is_displayed() 设置该元素是否可见
is_enabled() 判断元素是否被使用
is_selected() 判断元素是否被选中
tag_name 返回元素的tagName
**********************************************************************************
2、国家工商信息系统网反爬技术分析:
(1)、二代极速拖拉验证码反爬技术:图形验证码是比较传统的验证码破解难度更大一点,因为需要模拟拖动的速度、拼接的吻合度等等。而且这个网站是采取不登录方式,每次查询都需要输入一次验证码,导致90%的爬虫工程师都无法越过这个极速验证码真正去爬取里面的数据,因为如果用普通的技术去越过这种验证码 需要高质量的、高匿名的、无限量的爬虫动态代理IP,成本太大,几乎没有几个公司可以愿意承担得起这个成本,想要破解这种极速验证码需要用另外的技术方式来处理。
因为时间有限,今天只能先分享交流到这里,最近在做AI爬虫模型,后面给大家分享如果用python这种极速验证码、图像验证码、字体库加密,如何用TensorFlow 进行深度学习来做机器人和训练机器人模型(需要爬虫技术和大数据交流朋友加我qq:2779571288)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。