一、运用ip代理(一个代理ip尽量只一个人用)
这里的ip指的是网络ip
代理ip,网上自己找(免费或付费)
推荐两个:
- “豌豆HTTP”:免费,具体使用,看之前的
- “快代理”:付费
介绍:(有试用期限)
私密代理与独享代理:可靠性高,难点在于代码格式:
proxies = {'协议':'协议://用户名:密码@ip:端口号'}
开放代理:类似免费的,可靠性稍微好一点,不推荐
关键要学会测试代理ip是否可用
源代码:
import requests
class Proxy:
def __init__(self):
self.proxy_url = 'http://dev.kdlapi.com/api/getproxy/?orderid=992520441312817&num=20&protocol=2&method=1&an_ha=1&sep=2'#代理链接
self.test_url = 'https://www.baidu.com/'
self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.128 Safari/537.36'}
def get_proxy(self):
html = requests.get(url=self.proxy_url,headers=self.headers).text
proxy_list = html.split('\n')
for proxy in proxy_list:
self.text_proxy(proxy)
def text_proxy(self,proxy):
# 测试开放代理
proxies = {
'http': '{}'.format(proxy),
'https': '{}'.format(proxy)
}
try:
res = requests.get(url=self.test_url,proxies=proxies,headers=self.headers,timeout=2)
if res.status_code == 200:
print(proxy,'能用')
except Exception as e:
print(proxy,'不能用')
def main(self):
self.get_proxy()
if __name__ == '__main__':
spider = Proxy()
spider.main()
二、图形验证码(有两种)
前言:
在爬虫中图形验证码的解决方式有哪些?
1 可以通过算法 以及深度学习
2 selenium来解决
3 打码平台(付费)
4 tesseract(免费的 开源的 光学文字识别库)
2.1简单数字加字母类型
https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891
(验证码库,刷新就行)
tesseract
1 安装
1.1 需要把安装的路径添加到path环境变量里面 E:\Tesseract-OCR
1.2 需要把训练数据添加到 用户变量
TESSDATA_PREFIX=E:\Tesseract-OCR\tessdata
2 安装模块(pycharm中)
pip install pytesseract
3 使用
源代码:
from urllib import request
import pytesseract
from PIL import Image # 图形处理库(图片的保存等)
# 指定tesseract的执行路径
pytesseract.pytesseract.tesseract_cmd = r'F:\python辅助工具\Tesseract-OCR\tesseract.exe'
# 指定训练数据的路径
tessdata_dir_config = r'--tessdata-dir "F:\python辅助工具\Tesseract-OCR\tessdata"'
#以上两条是固定的
url = 'https://passport.lagou.com/vcode/create?from=register&refresh=1513081451891'
request.urlretrieve(url,'text.png')
image = Image.open('text.png')
# print(image,type(image)) #<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=113x46 at 0x1DF18354E48> <class 'PIL.JpegImagePlugin.JpegImageFile'>
result = pytesseract.image_to_string(image, lang='eng', config=tessdata_dir_config)#lang='eng'是语言 config=tessdata_dir_config是配置
print(result)
注意:
- tessdata里数据越多,精度越高
- 本质:pic–>文本
2.2复杂(图片,等)
类似这样(典型的是12306登录)
打码平台
也需要自己找,这里推荐 超级鹰
超级鹰官方网站:http://www.chaojiying.com
超级鹰镜像网站:http://www.chaojiying.cn
超级鹰的打码平台 https://www.chaojiying.com/
1 注册账号(用户)
2 充值(1块钱或者扫码关注微信公众号 1000题分)
3 创建软件id(点击创建软件id 输入名字 提交)
4 下载实例代码(python 点击下载 压缩文件),查看价格体系
5 使用实例代码
源代码:
#!/usr/bin/env python
# coding:utf-8
import requests
from hashlib import md5
class Chaojiying_Client(object):
def __init__(self, username, password, soft_id):
self.username = username
password = password.encode('utf8')
self.password = md5(password).hexdigest()
self.soft_id = soft_id
self.base_params = {
'user': self.username,
'pass2': self.password,
'softid': self.soft_id,
}
self.headers = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}
def PostPic(self, im, codetype):
"""
im: 图片字节
codetype: 题目类型 参考 http://www.chaojiying.com/price.html
"""
params = {
'codetype': codetype,
}
params.update(self.base_params)
files = {'userfile': ('ccc.jpg', im)}
r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers)
return r.json()
def ReportError(self, im_id):
"""
im_id:报错题目的图片ID
"""
params = {
'id': im_id,
}
params.update(self.base_params)
r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
return r.json()
#以上都不要改,只要改下面的
if __name__ == '__main__':
chaojiying = Chaojiying_Client('Jerry1234', '123456', '914400') #username, password, soft_id
im = open('code2.png', 'rb').read() #字节流 #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 9004)) #9004 验证码类型 官方网站>>价格体系