注册:用户
登录:
查询该用户是否还有剩余的题分(题分充足才可以验证,绑定微信即有1000分)
创建一个软件ID:用户中心——> 软件ID ——> 生成一个软件ID——>录入软件的名称和说明,接着提交就行。这样就获得了软件的ID和软件KEY。
到开发者文档那里下载示例代码:选择Python语言的Demo下载
下载完后解压缩,然后放进当前的工程目录中
样例:(运行样例试一下)
#!/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('超级鹰用户名', '超级鹰用户名的密码', '96001') #用户中心>>软件ID 生成一个替换 96001
im = open('a.jpg', 'rb').read() #本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print chaojiying.PostPic(im, 1902) #1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
import requests
from lxml import etree
from chaojiying import Chaojiying_Client # 就是样例里面的代码引入 class 类Chaojiying_Client
# 封装识别验证码图片的函数
def getCodeText(imgPath, codeType):
chaojiying = Chaojiying_Client('超级鹰账号', '密码', '软件ID') # 用户中心>>软件ID 生成一个替换 96001
im = open(imgPath, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, codeType))
return chaojiying.PostPic(im, codeType)['pic_str']
headers = {
'User-Agent':'Moz。。。'
}
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
page_text = requests.get(url=url, headers=headers).text
# 解析验证码图片img中src属性值
tree = etree.HTML(page_text)
# //*[@id="imgCode"] 定位到元素直接复制xpath路径
img_src = tree.xpath('//div[@class="mainreg2"]/img[@id="imgCode"]/@src')[0]
img_src = 'https://so.gushiwen.cn' + img_src
# print(img_src)
# 获取图片并保存下来
img_data = requests.get(url=img_src,headers=headers).content
with open('./yzm.jpg','wb') as fp:
fp.write(img_data)
print('下载结束')
# 调用打码平台的示例程序进行验证码图片数据识别
code_text = getCodeText('yzm.jpg',1902)
print("识别结果为:", code_text)
// 会返回以下些数据 PostPic
{
'err_no': #,
'err_str': '#',
'pic_id': '#',
'pic_str': '#',
'md5': '#'
}
爬取基于某些用户的用户信息。(需要先登录)
import requests
from lxml import etree
from chaojiying import Chaojiying_Client
# 封装识别验证码图片的函数
def getCodeText(imgPath, codeType):
chaojiying = Chaojiying_Client('超级鹰账号', '密码', '软件ID') # 用户中心>>软件ID 生成一个替换 96001
im = open(imgPath, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# print(chaojiying.PostPic(im, codeType))
return chaojiying.PostPic(im, codeType)['pic_str']
session = requests.Session()
# 1. 对验证码图片进行捕获和识别
headers = {
'User-Agent': 'Mozilla。。。'
}
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
page_text = session.get(url=url, headers=headers).text
# print(page_text)
tree = etree.HTML(page_text)
img_src_code = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]/@src')[0]
# print(img_src_code)
img_code_data = session.get(url=img_src_code, headers=headers).content
with open('./gushi.jpg', 'wb') as fp:
fp.write(img_code_data)
# print('存储结束')
# 使用超级鹰打码平台提供的示例代码对验证码图片进行识别
results = getCodeText('./gushi.jpg', 1004)
# 获取动态变化的请求值
__VIEWSTATE = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
__VIEWSTATEGENERATOR = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
# post 请求的发送(模拟登录)
login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
# 模拟登录
data = {
'__VIEWSTATE': __VIEWSTATE,
'__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
'from': 'http://so.gushiwen.cn/user/collect.aspx',
'email': '账号修改',
'pwd': '密码',
'code': results, # 验证码
'denglu': '登录',
}
login_text = session.post(url=login_url,headers=headers,data=data).text
with open('test.html','w',encoding='utf-8') as fp:
fp.write(login_text)
# 通用方法验证登录成功 (一般情况下)
#response = session.post(url=login_url, headers=headers, data=data)
#print(response.status_code) # 200 响应成功
无状态即:当用户向服务器端发起请求之后,这个服务器端并不会记录当前用户相关的用户状态。
# 对应到程序中
我们想要爬取古诗文网的当前用户主页,我们会发两次请求,其中第二次请求是想获得“个人页的信息”,那么我们是想让服务器端知道,在第二次的get请求的发送之前,
我们已经“登录通了”。(让服务器端知道我们是在登录后才发起的第二次请求,这样才有用)。
但是,在服务器端是不会保留用户的用户状态。
也就是说,在第一次POST请求成功后,我们是可以进行模拟登录成功的,但是服务器端并不会记录当前请求对应的一个状态。即当我们第二次对个人主页发起请求的时候,
服务器端并不会知道,这个请求是基于当前用户已经“登录的状态”发起的请求,服务器端无任何记录。这就是程序没有请求到对应页面数据的原因
这个cookie表示的是什么含义?
用抓包工具分析:在Response Headers中发现Set-Cookie,这个参数表示的就是当这次对应的url的post请求,请求成功之后就让我们的服务器端为当前请求所对应的客户端,创建的,设置的一组Cookie值;这组Cookie值就是让服务器端用来记录当前客户端的登录状态。
由此可以知道,我们第二次get请求所需要的Cookie值,是由第一次post请求,请求之后由服务器端所创建的;如果可以获取服务器端所创建的这个cookie值(Set-Cookie)之后,将此Cookie值交给第二次get请求携带发送,就可以获取对应个人主页的页面数据了。
import requests
from lxml import etree
from chaojiying import Chaojiying_Client
# 封装识别验证码图片的函数
def getCodeText(imgPath, codeType):
chaojiying = Chaojiying_Client('超级鹰账号', '密码', '软件ID') # 用户中心>>软件ID 生成一个替换 96001
im = open(imgPath, 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# print(chaojiying.PostPic(im, codeType))
return chaojiying.PostPic(im, codeType)['pic_str']
# 创建一个session对象
session = requests.Session()
# 1. 对验证码图片进行捕获和识别
headers = {
'User-Agent': 'Mozilla。。。'
}
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
page_text = session.get(url=url, headers=headers).text
# print(page_text)
tree = etree.HTML(page_text)
img_src_code = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]/@src')[0]
# print(img_src_code)
img_code_data = session.get(url=img_src_code, headers=headers).content
with open('./gushi.jpg', 'wb') as fp:
fp.write(img_code_data)
# print('存储结束')
# 使用超级鹰打码平台提供的示例代码对验证码图片进行识别
results = getCodeText('./gushi.jpg', 1004)
# 获取动态变化的请求值
__VIEWSTATE = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
__VIEWSTATEGENERATOR = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
# post 请求的发送(模拟登录)
login_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
# 模拟登录
data = {
'__VIEWSTATE': __VIEWSTATE,
'__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
'from': 'http://so.gushiwen.cn/user/collect.aspx',
'email': '账号',
'pwd': '密码',
'code': results,
'denglu': '登录',
}
# 使用session进行post请求的发送(这个请求发送成功后,若是产生cookie,这个cookie会自动存储在session对象中)
response = session.post(url=login_url,headers=headers,data=data)
print(response.status_code)
# 爬取当前用户的个人主页对应的页面数据
detail_url = 'https://so.gushiwen.cn/user/collect.aspx' # 其实本实战中当登录成功就会跳转到个人主页,即url是一样的
# 手动cookie处理
# headers = {
# 'Cookie':'XXXX' # 在抓包工具中获取cookie值
# }
# 使用携带了cookie的session进行get请求的发送
detail_page_text = session.get(url=detail_url,headers=headers).text
with open('test.html','w',encoding='utf-8') as fp:
fp.write(detail_page_text)
print('存储结束')