爬取总结记录:由于经验不足,个人尝试了很多方法,都失败了,查看了网站的上面别人的爬取经验,按照别人做的,但都没有成功。
几经波折最后终于解决了。
好了上代码:
其中有涉及到个人信息的,这里进行了模糊处理。
import time
import requests
from lxml import etree
from chaojiying.chaojiying import Chaojiying_Client
if __name__ == '__main__':
# 1、设置ua头,进行伪装
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0'
}
# 2、进行登录界面的请求
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx?type=d'
response_get = requests.get(url=url, headers=headers)
# 获取请求登录接口后的cookie信息,这个执行登录操作时会用到。
print(response_get.cookies.keys())
print(response_get.cookies.values())
# 获取登录界面,并保存本地
response = response_get.text
with open('./denglu.html', 'w', encoding='utf-8') as fp:
fp.write(response)
# 读取下载到本地的登录页面数据
tree = etree.HTML(response)
# 解析出验证码连接(这里要拼接一下url)
code_image_src = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]/@src')[0]
# 获取viewstate和viewstateenerator值,这个进行登录请求传参时会用到
viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
viewstateenerator = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
print(code_image_src)
print(viewstate)
print(viewstateenerator)
# 这里请求验证码图片链接获取图片,用到了请求登录界面返回回来的cookies信息。(至于为什么要加登录界面返回回来的cookies信息,可以查看web端网络连接
# 在获取验证码图片时也进行了cookie传递,其实这是为了让服务器知道是我们的当前会话进行验证码请求,而不是别人请求验证码。)
img_res = requests.get(url=code_image_src, headers=headers, cookies=response_get.cookies)
# 查看请求图片链接返回回来的cookie信息,这个在进行登录请求时也会用到。
print(img_res.cookies.keys())
print(img_res.cookies.values())
img_content = img_res.content
# 保存登录验证码图片,用于识别。
with open('./gushiwen.jpg', 'wb') as fp:
fp.write(img_content)
# 解析验证码:我这里用了第三方工具超级鹰,这个可以注册一个很便宜。也可以使用其他验证码识别。
chaojiying = Chaojiying_Client('你自己的个人信息', '你自己的个人信息', '你自己的个人信息') # 用户中心>>软件ID 生成一个替换 96001
im = open('./gushiwen.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# im = open('a.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 1902)) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
shibie_result = chaojiying.PostPic(im, 1902)
result = shibie_result['pic_str']
print("*" * 100)
print(type(result))
print('result:' + result)
print("*" * 100)
# 2、进行登录请求操作
denglu_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
# 设置登录请求体数据。这里用的是post方式进行登录
data = {
'__VIEWSTATE': viewstate,
'__VIEWSTATEGENERATOR': viewstateenerator,
'from': "http://so.gushiwen.cn/user/collect.aspx",
'email': "你自己的账户",
'pwd': "你自己的密码",
'code': result,
'denglu': "登录"
}
# 自定义配置cookie信息:配置请求登录界面返回的cookie,以及配置请求图片链接返回回来的cookie,
# 剩余三个cookie信息,可以查看登录请求找到规律。
cookie = {
response_get.cookies.keys()[0]: response_get.cookies.values()[0],
response_get.cookies.keys()[1]: response_get.cookies.values()[1],
img_res.cookies.keys()[0]: img_res.cookies.values()[0],
"login": "false",
"Hm_lvt_9007fab6814e892d3020a64454da5a55": "1658748154",
"Hm_lpvt_9007fab6814e892d3020a64454da5a55": str(int(time.time())) # 这里获取的是当前的时间戳
}
print(cookie)
# 发送登录post请求
denglu_response = requests.post(url=denglu_url, headers=headers, data=data, cookies=cookie)
# print(denglu_response.cookies)
# print(denglu_response.text)
# 保存登录结果页面。
with open('./gerenxinxi.html', 'w', encoding='utf-8') as fp:
fp.write(denglu_response.text)
print(denglu_response.status_code)
print(denglu_response.cookies.keys())
print(denglu_response.cookies.values())
另解:
使用session保存会话,进行登录后多个界面数据的抓取工作。
import time
import requests
from lxml import etree
from 第1部分python练习.第3章python爬虫.pachong_requests.第3章验证码.chaojiying.chaojiying import Chaojiying_Client
if __name__ == '__main__':
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:97.0) Gecko/20100101 Firefox/97.0'
}
# 创建一个session对象
session = requests.Session()
# 1、进行登录界面的请求
url = 'https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx'
# response = requests.get(url=url,headers=headers).text
response = session.get(url=url, headers=headers)
with open('./denglu2.html', 'w', encoding='utf-8') as fp:
fp.write(response.text)
tree = etree.HTML(response.text)
code_image_src = 'https://so.gushiwen.cn' + tree.xpath('//*[@id="imgCode"]/@src')[0]
viewstate = tree.xpath('//*[@id="__VIEWSTATE"]/@value')[0]
viewstateenerator = tree.xpath('//*[@id="__VIEWSTATEGENERATOR"]/@value')[0]
print("第1次:session中的cookie值")
print(session.cookies.keys())
print(session.cookies.values())
print("+++++++++++++++++++++++++")
print(code_image_src)
print(viewstate)
print(viewstateenerator)
img_res = session.get(url=code_image_src, headers=headers)
img_content = img_res.content
print("第2次:session中的cookie值")
print(session.cookies.keys())
print(session.cookies.values())
print("+++++++++++++++++++++++++")
with open('./gushiwen.jpg', 'wb') as fp:
fp.write(img_content)
# 解析验证码
chaojiying = Chaojiying_Client('你的信息', '你的信息', '对应编号') # 用户中心>>软件ID 生成一个替换 96001
im = open('./gushiwen.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
# im = open('a.jpg', 'rb').read() # 本地图片文件路径 来替换 a.jpg 有时WIN系统须要//
print(chaojiying.PostPic(im, 1902)) # 1902 验证码类型 官方网站>>价格体系 3.4+版 print 后要加()
shibie_result = chaojiying.PostPic(im, 1902)
result = shibie_result['pic_str']
print("*" * 100)
print(type(result))
print('result:' + result)
print("*" * 100)
# 2、进行登录请求操作
denglu_url = 'https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx'
input = {
'__VIEWSTATE': viewstate,
# '__VIEWSTATEGENERATOR': "C93BE1AE",
'__VIEWSTATEGENERATOR': viewstateenerator,
'from': "http://so.gushiwen.cn/user/collect.aspx",
'email': "你的账号",
'pwd': "你的密码",
'code': result,
'denglu': "登录"
}
# session.cookies.set_cookie("login", "false")
# session.cookies.set_cookie("Hm_lvt_9007fab6814e892d3020a64454da5a55", "1658748154")
# session.cookies.set_cookie("Hm_lpvt_9007fab6814e892d3020a64454da5a55", str(int(time.time())))
# denglu_response = requests.post(url=denglu_url,headers=headers,input=input)
denglu_response = session.post(url=denglu_url, headers=headers, data=input)
# print(denglu_response.text)
with open('./gerenxinxi2.html','w',encoding='utf-8') as fp:
fp.write(denglu_response.text)
print(denglu_response.status_code)
print("第3次:session中的cookie值")
print(session.cookies.keys())
print(session.cookies.values())
print("+++++++++++++++++++++++++")
# 名句页面数据获取
detail_url = 'https://so.gushiwen.cn/user/collect.aspx?type=m&id=2501549&sort=t'
detail_page = session.get(url=detail_url, headers=headers)
detail_text = detail_page.text
with open('./mingju2.html', 'w', encoding='utf-8') as fp:
fp.write(detail_text)
至此,完结。如有疑问,下面留言,博主看到第一时间回复。