之前试着搞一下CSDN,结果把我给整懵了,所以啊,得找个软柿子捏一捏,就是觉得这次的目标好欺负。
这个就是登录页面啦
这就是我们的目标了,就是要请求这个登录后的
import requests
get_url = 'https://www.douban.com/people/233318987/'
header = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36',
}
html = requests.get(url, headers=header)
这就是直接打开的结果
像这种情况的处理法方法呢,有三种
- requests的post方法登陆
- 添加cookie
- selenium模拟浏览器登陆
咱们按顺序来逐一搞一下,
首先是post方法登陆,这个呢难度较大,需要抓包和分析
抓包分析当然是跑不掉的啦,这个就是我们post方法提交的链接
下面的使我们要提交的表单信息
import requests
get_url = 'https://www.douban.com/people/233318987/'
header = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36',
}
url = 'https://accounts.douban.com/j/mobile/login/basic'
data = {
'remember': 'true',
'name': 账号,
'password': 密码
}
session = requests.Session()
resopnse = session.post(url, headers=header, data=data)
new_response = session.get(get_url, headers=header)
if new_response.status_code == 200:
with open('new-html.html','wb')as f:
f.write(new_response.content)
f.close()
else:
print('wrong')
这样 不就给整出来了嘛,nice
但是结果怎么和我们想要的不一样呢?那是因为我们请求的得到的只是网页的1.0版本,他还用到了Ajax,所以这个和渲染后的页面,也就是我们的目标页面是有差别的。而想要获取目标页面中的信息,可以找到相应的json文件,再用session.get获取就可以了。
第二种添加cookie
这是刚才那个登录文件内的cookie,将其添加到header中,然后直接使用requests.get方法请求就可以了。
get_url = 'https://www.douban.com/people/233318987/'
cookie = 'bid=VghJOH4JtUY; douban-fav-remind=1; ll="108297"; apiKey=; __utma=30149280.1885368446.1589424246.1589424246.1613568406.2; __utmc=30149280; __utmz=30149280.1613568406.2.1.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmt=1; ap_v=0,6.0; user_data={%22area_code%22:%22+86%22%2C%22number%22:%2217375102926%22%2C%22code%22:%224588%22}; vtoken=phone_register%20a383ec9cce484a08b7fc967787d8f557; last_login_way=phone; push_noty_num=0; push_doumail_num=0; __utmv=30149280.23331; UM_distinctid=177b030f2912d1-0e882d9b96217e-70266a36-8dcc0-177b030f292216; Hm_lvt_19fc7b106453f97b6a84d64302f21a04=1613568734; Hm_lpvt_19fc7b106453f97b6a84d64302f21a04=1613568734; _ga=GA1.2.1885368446.1589424246; _gid=GA1.2.1147932004.1613568734; _gat=1; __utmb=30149280.10.10.1613568406; login_start_time=1613568763410'
header = {
'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.104 Mobile Safari/537.36',
'Cookie': cookie
}
new_response = requests.get(get_url, headers=header)
if new_response.status_code == 200:
with open('new-html.html','wb')as f:
f.write(new_response.content)
f.close()
else:
print('wrong')
这种方法就不需要在代码中添加账号和密码了
第三种selenium模拟浏览器
这种方法的速度相对较慢,但操作简单,是直接模仿浏览器的操作,通过元素的查抄,实现账号,密码的输入,并点击登录按钮,我这里就不多说了,有兴趣的大家可以去搞一下。我 xiao python爬虫,无非是因为写一些脚本,所以速度是优先考虑的,这个方法我就pass掉了。