这就到了第六篇啦,很快啊。懂得都懂啦,这一篇相对会比较轻松一些。
(事实真的是这样的吗?不知道哦!!!)
毕竟这一篇是要讲验证码登录的嘛。
这是一种比较简单粗暴的方式啊,首先如果没有验证码的需求的话,碧如我之前爬CSDN抓到自己的个人信息那次。这种方式就很好了。
因为cookie和session的特性,在cookie的有效期内是可以上的去的。
之所以这么说呢,那自然是因为成功过了嘛(爬了哪些网站就不好说了嘛,理解一下)。不过由于测试次数较少,所以也不敢百分百保证能成功。
反正就是,登录之后尽快拿到cookie,尽快拿去登录。
这里我要说一句:在进行“高端操作”之前,不妨先拿个二十分钟来试试这个方法,万一就成了呢?
我曾经还想用selenium来手动登录,这种方法经测验可以登录的上去,但是爬取数据就没那么简单了(可能是我用selenium只会点点点,不会抓数据吧)。
注:这个方法看不懂就不要看了,不出意外我这辈子不会用这个方法,更不会去用pytesseract
听这名字,牛逼吧。
其实就是OCR啦。
首先要找个目标网址嘛,先找那种简单的验证码,黑白文字的。
captcha图像样本链接,这里面有六十张灰度验证码图,够用啦。
先把图扒拉下来,可以看到这张图是内嵌在页面中的。像这样的图片要怎么办呢?
不难办啊这个,图片也是文件嘛,只要是文件,就肯定存在网站的文件夹下。
内嵌的图片,不过是以一种相对路径的方式来写的罢了。
用网站的根目录,加上图片的地址在试试看:https://captcha.com/images/captcha/botdetect3-captcha-ancientmosaic.jpg
现在能下载了不?
import requests
import os
import time
from lxml import etree
def get_Page(url,headers):
response = requests.get(url,headers=headers)
if response.status_code == 200:
return response.text
return None
def parse_Page(html,headers):
html_lxml = etree.HTML(html)
datas = html_lxml.xpath( './/div[@class="captcha_images_left"]|.//div[@class="captcha_images_right"]')
# 创建保存验证码文件夹
file = 'D:/YZM'
if os.path.exists(file):
os.chdir(file)
else:
os.mkdir(file)
os.chdir(file)
for data in datas:
# 验证码名称
name = data.xpath( './/h3')
# 验证码链接
src = data.xpath( './/div/img/@src')
# print(len(src))
count = 0
for i in range(len(name)):
# 验证码图片文件名
filename = name[i].text + '.jpg'
img_url = 'https://captcha.com/'+ src[i]
response = requests.get(img_url,headers=headers)
if response.status_code == 200:
image = response.content
with open(filename, 'wb') as f:
f.write(image)
count += 1
print( '保存第{}张验证码成功'.format(count))
time.sleep( 1)
def main():
url = 'https://captcha.com/captcha-examples.html?cst=corg'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.146 Safari/537.36'}
html = get_Page(url,headers)
parse_Page(html,headers)
if __name__ == '__main__':
main()
Python是有处理OCR的tesserocr库,据说准确率和上手程度没有百度这个润,所以就先讲这个了。
百度OCR-API文档
接口能力啥的我就不说了吧,人家自己有官宣的。
我着重讲讲怎么用。
首先,你要注册个账号。
from aip import AipOcr # pip install baidu-aip
import os
i = 0
j = 0
APP_ID = '你的 APP_ID '
API_KEY = '你的API_KEY'
SECRET_KEY = '你的SECRET_KEY'
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
# 读取图片
file_path = 'D:/YZM'
filenames = os.listdir(file_path)
# print(filenames)
for filename in filenames:
# 将路径与文件名结合起来就是每个文件的完整路径
info = os.path.join(file_path,filename)
with open(info, 'rb') as fp:
# 获取文件夹的路径
image = fp.read()
# 定义参数变量
options = {
'detect_direction': 'true',
'language_type': 'CHN_ENG',
}
# 调用通用文字识别接口
result = client.basicGeneral(image,options)
print(result)
if result[ 'words_result_num'] == 0:
print(filename + ':'+ '----')
i += 1
else:
for word in result['words_result']:
print(filename + ' : '+word['words'])
j += 1
print('共识别验证码{}张'.format(i+j))
print('未识别出文本{}张'.format(i))
print('已识别出文本{}张'.format(j))
惨不忍睹啊,就对了两张。。。
没事啊,别慌,我们对图像进行一下数字图像处理。
from PIL import Image
import os
file_path = 'D:/YZM'
filenames = os.listdir(file_path)
for filename in filenames:
info = os.path.join(file_path,filename)
# 打开图片
image = Image.open(info)
# 传入'L'将图片转化为灰度图像
gray = image.convert('L')
bw = gray.point(lambda x: 0 if x < 1 else 255, '1')
bw.save(filename)
处理之后,整体是好一些,但是也就那样了。
应该是我学艺不精,毕竟我的数字图像处理能过,离不开老师和同学的努力,一大部分原来就是黑白的图拿去洗完之后就洗白白了。。
不过嘛,既然是自动化了,别洗了,就多试试嘛。
上面那个方法,又臭又长。我不喜欢,浪费我一下午。
我是个实在的人,黑猫白猫,只要能抓老鼠的就是好猫。
方法一需要cookie,会担惊受怕,随后讲的用selenium操作又不好抓数据。
方法二再怎么样,也只是识别一下,最后还是得用post方法提交数据上去。
既然selenium、cookie我都能拿出来用了,我还有什么不敢做的?直接图片爬下来,填上去。暴力吧,当时我们“爬虫百战穿山甲”小队的“从入门到懵逼”小伙伴就是这么干的,人家也成功了。
实现就行了,你管我怎么实现的嘛。
好了好了,说句实在话,如果要处理大量验证码的话,方法二是可以去深入挖一下的。
接下来我们看点别的东西吧
滑块验证码:爬虫入门经典(十八) | 滑动验证码识别
看他的吧,早些时候我们打过交道,我们都是大数据的学生,这篇里面居然还有我的出镜机会啊。
破解极验验证码:爬虫入门经典(十九) | 难度提升,破解极验验证码
再把scrapy和正则表达式的链接放了吧,接下来几天有不得不离开一段时间的原因,要缓更了。
Scrapy:我要偷偷的学Python,然后惊呆所有人(第十三天)
这篇大家的积极性挺高的。
正则:今天我把话放这儿,明天我要会【正则表达式】
这篇我个人很喜欢,但是没有流量。
我在哔哔两句吧:这个系列本来预计是写八篇知识点,两个项目实战的,但是由于我本身技术有限,加上一些身体原因,到这第六篇就讲完我要讲的知识点了,接下来会放两个实战项目,这个不会折扣,也不会是那种大家都在做的。是“爬虫百战穿山甲”团队遇到的硬骨头,我去啃一啃吧。