为什么我用python爬京东的网页爬下来的是空标签
现在几乎所有的大网站都在主要的栏目 做了防爬行的处理。 象这样的还算是简单的。 大不了你分析一下JS。 如果不想分析JS。就麻烦 些。
你安装一个pyqt,里面有一个qtbrowser, 你可以驱动这个浏览器去爬行。要几百行代码才能搞定。
用浏览器打开这个网站,然后通过浏览器的一个功能,获得渲染后的HTML网页。这样就解决 JS的问题了。 不过爬行速度很受限制。因为浏览器打开一个网页的速度很慢 。
博客园
首页
联系
管理
python中使用token模拟登录
背景:在接口测试中我们经常是需要一个登陆token,或者获取其他用到的参数来关联下一个接口用到的参数。
Token的意义及用法
一Token的来源:
当客户端多次向服务端请求数据时,服务端就需要多次从数据库中查询用户名和密码并进行对比,判断用户名和密码是否正确,并作出相应提示。但这样无疑会增加服务器端的运行压力,是否可以有一种方式只需要验证用户就是之前的用户而不需要每次在客户端请求数据时都需要查询数据库判断用户名和密码是否正确。在这种请求下,引入了token来解决服务器端多次访问数据库问题。
1、什么是Token:
Token是服务端生成的一串字符串,作为客户端进行请求时辨别客户身份的的一个令牌。当用户第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
2、使用Token的目的:
Token的目的是为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
二 Token的运用流程:
1、当用户首次登录成功之后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端;
2、客户端拿到 token 值之后,进行保存 (保存位置由服务器端设置);
3、以后客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器;
4、服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值进行比较;
5、如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态;
6、如果没有这个 token 值, 没有登录成功;
7、如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录;
案例实践
本案例中登录接口返回的sign,作用类似于token值,即用该值关联下一个接口。
整体思路
1、先进行登录 *** 作,并从响应体中提取sign值;
2、将提取到的sign值传参到下一个接口的请求头he模拟账户登录系统Python的特点包括:
1 灵活性:Python在编写模拟登录脚本时非常灵活,可通过第三方库和模块快速搭建。
2 易学易用:Python语法简洁明了,易于入门,即使没有编程经验的人员也能够轻松学习。
3 强大的第三方库支持:Python拥有丰富的第三方库,如BeautifulSoup、Requests、Selenium等,这些库可以帮助我们更加便捷地完成模拟登录的各种 *** 作。
4 高效性:Python使用C语言编写,具有强大的运行效率和优异的性能表现。
5 可移植性:由于Python是跨平台语言,因此编写的模拟登录代码可在多个 *** 作系统上运行,并且不需要进行任何修改。
import time
import json
import os
import re
import sys
import subprocess
from bs4 import BeautifulSoup as BS
class ZhiHuClient(object):
"""连接知乎的工具类,维护一个Session
20151111
用法:
client = ZhiHuClient()
# 第一次使用时需要调用此方法登录一次,生成cookie文件
# 以后可以跳过这一步
clientlogin("username", "password")
# 用这个session进行其他网络 *** 作,详见requests库
session = clientgetSession()
"""
# 网址参数是账号类型
TYPE_PHONE_NUM = "phone_num"
TYPE_EMAIL = "email"
loginURL = r"{0}"
homeURL = r"
captchaURL = r"
headers = {
"User-Agent": "Mozilla/50 (Windows NT 51) AppleWebKit/53736 (KHTML, like Gecko) Chrome/460249086 Safari/53736",
"Accept": "text/html,application/xhtml+xml,application/xml;q=09,image/webp,/;q=08",
"Accept-Encoding": "gzip, deflate",
"Host": ",
"Upgrade-Insecure-Requests": "1",
}
captchaFile = ospathjoin(syspath[0], "captchagif")
cookieFile = ospathjoin(syspath[0], "cookie")
def __init__(self):
oschdir(syspath[0]) # 设置脚本所在目录为当前工作目录
self__session = requestsSession()
self__sessionheaders = selfheaders # 用self调用类变量是防止将来类改名
# 若已经有 cookie 则直接登录
self__cookie = self__loadCookie()
if self__cookie:
print("检测到cookie文件,直接使用cookie登录")
self__sessioncookiesupdate(self__cookie)
soup = BS(selfopen(r")text, "htmlparser")
print("已登陆账号: %s" % soupfind("span", class_="name")getText())
else:
print("没有找到cookie文件,请调用login方法登录一次!")
# 登录
def login(self, username, password):
"""
验证码错误返回:
{'errcode': 1991829, 'r': 1, 'data': {'captcha': '请提交正确的验证码 :('}, 'msg': '请提交正确的验证码 :('}
登录成功返回:
{'r': 0, 'msg': '登陆成功'}
"""
self__username = username
self__password = password
self__loginURL = selfloginURLformat(self__getUsernameType())
# 随便开个网页,获取登陆所需的_xsrf
html = selfopen(selfhomeURL)text
soup = BS(html, "htmlparser")
_xsrf = soupfind("input", {"name": "_xsrf"})["value"]
# 下载验证码
while True:
captcha = selfopen(selfcaptchaURL)content
with open(selfcaptchaFile, "wb") as output:
outputwrite(captcha)
# 人眼识别
print("=" 50)
print("已打开验证码,请识别!")
subprocesscall(selfcaptchaFile, shell=True)
captcha = input("请输入验证码:")
osremove(selfcaptchaFile)
# 发送POST请求
data = {
"_xsrf": _xsrf,
"password": self__password,
"remember_me": "true",
self__getUsernameType(): self__username,
"captcha": captcha
}
res = self__sessionpost(self__loginURL, data=data)
print("=" 50)
# print(restext) # 输出脚本信息,调试用
if resjson()["r"] == 0:
print("登录成功")
self__saveCookie()
break
else:
print("登录失败")
print("错误信息 --->", resjson()["msg"])
def __getUsernameType(self):
"""判断用户名类型
经测试,网页的判断规则是纯数字为phone_num,其他为email
"""
if self__usernameisdigit():
return selfTYPE_PHONE_NUM
return selfTYPE_EMAIL
def __saveCookie(self):
"""cookies 序列化到文件
即把dict对象转化成字符串保存
"""
with open(selfcookieFile, "w") as output:
cookies = self__sessioncookiesget_dict()
jsondump(cookies, output)
print("=" 50)
print("已在同目录下生成cookie文件:", selfcookieFile)
def __loadCookie(self):
"""读取cookie文件,返回反序列化后的dict对象,没有则返回None"""
if ospathexists(selfcookieFile):
print("=" 50)
with open(selfcookieFile, "r") as f:
cookie = jsonload(f)
return cookie
return None
def open(self, url, delay=0, timeout=10):
"""打开网页,返回Response对象"""
if delay:
timesleep(delay)
return self__sessionget(url, timeout=timeout)
def getSession(self):
return self__session
if __name__ == '__main__':
client = ZhiHuClient()
# 第一次使用时需要调用此方法登录一次,生成cookie文件
# 以后可以跳过这一步
# clientlogin("username", "password")
# 用这个session进行其他网络 *** 作,详见requests库
session = clientgetSession()两种方法:
1带cookielib和urllib2
import urllib2
import urllib
import cookielib
def login():
email = raw_input("请输入用户名:")
pwd = raw_input("请输入密码:") data={"email":email,"password":pwd}
post_data=urlliburlencode(data) cj=cookielibCookieJar()
opener=urllib2build_opener(urllib2>
你安装一个pyqt,里面有一个qtbrowser, 你可以驱动这个浏览器去爬行。要几百行代码才能搞定。
用浏览器打开这个网站,然后通过浏览器的一个功能,获得渲染后的HTML网页。这样就解决 JS的问题了。 不过爬行速度很受限制。因为浏览器打开一个网页的速度很慢 。
你的订单量有多少,如果不是上千上万那种的话可以手动把所有订单页面下载下来,后再用python去处理,这样可行性及工作量比你直接模拟登录再做一堆 *** 作来得快,而且爬京东这样的大公司网站要是被检测出来,警告还好,要是账号被封那就不值得了。
已实现autoit代码下载html源码
我自己下载好的html源码
返回主页Maruying博客园
首页
联系
管理
python中使用token模拟登录
背景:在接口测试中我们经常是需要一个登陆token,或者获取其他用到的参数来关联下一个接口用到的参数。
Token的意义及用法
一Token的来源:
当客户端多次向服务端请求数据时,服务端就需要多次从数据库中查询用户名和密码并进行对比,判断用户名和密码是否正确,并作出相应提示。但这样无疑会增加服务器端的运行压力,是否可以有一种方式只需要验证用户就是之前的用户而不需要每次在客户端请求数据时都需要查询数据库判断用户名和密码是否正确。在这种请求下,引入了token来解决服务器端多次访问数据库问题。
1、什么是Token:
Token是服务端生成的一串字符串,作为客户端进行请求时辨别客户身份的的一个令牌。当用户第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
2、使用Token的目的:
Token的目的是为了验证用户登录情况以及减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
二 Token的运用流程:
1、当用户首次登录成功之后, 服务器端就会生成一个 token 值,这个值,会在服务器保存token值(保存在数据库中),再将这个token值返回给客户端;
2、客户端拿到 token 值之后,进行保存 (保存位置由服务器端设置);
3、以后客户端再次发送网络请求(一般不是登录请求)的时候,就会将这个 token 值附带到参数中发送给服务器;
4、服务器接收到客户端的请求之后,会取出token值与保存在本地(数据库)中的token值进行比较;
5、如果两个 token 值相同, 说明用户登录成功过!当前用户处于登录状态;
6、如果没有这个 token 值, 没有登录成功;
7、如果 token 值不同: 说明原来的登录信息已经失效,让用户重新登录;
案例实践
本案例中登录接口返回的sign,作用类似于token值,即用该值关联下一个接口。
整体思路
1、先进行登录 *** 作,并从响应体中提取sign值;
2、将提取到的sign值传参到下一个接口的请求头he模拟账户登录系统Python的特点包括:
1 灵活性:Python在编写模拟登录脚本时非常灵活,可通过第三方库和模块快速搭建。
2 易学易用:Python语法简洁明了,易于入门,即使没有编程经验的人员也能够轻松学习。
3 强大的第三方库支持:Python拥有丰富的第三方库,如BeautifulSoup、Requests、Selenium等,这些库可以帮助我们更加便捷地完成模拟登录的各种 *** 作。
4 高效性:Python使用C语言编写,具有强大的运行效率和优异的性能表现。
5 可移植性:由于Python是跨平台语言,因此编写的模拟登录代码可在多个 *** 作系统上运行,并且不需要进行任何修改。
给你一个例子,可以看看:
import time
import json
import os
import re
import sys
import subprocess
from bs4 import BeautifulSoup as BS
class ZhiHuClient(object):
"""连接知乎的工具类,维护一个Session
20151111
用法:
client = ZhiHuClient()
# 第一次使用时需要调用此方法登录一次,生成cookie文件
# 以后可以跳过这一步
clientlogin("username", "password")
# 用这个session进行其他网络 *** 作,详见requests库
session = clientgetSession()
"""
# 网址参数是账号类型
TYPE_PHONE_NUM = "phone_num"
TYPE_EMAIL = "email"
loginURL = r"{0}"
homeURL = r"
captchaURL = r"
headers = {
"User-Agent": "Mozilla/50 (Windows NT 51) AppleWebKit/53736 (KHTML, like Gecko) Chrome/460249086 Safari/53736",
"Accept": "text/html,application/xhtml+xml,application/xml;q=09,image/webp,/;q=08",
"Accept-Encoding": "gzip, deflate",
"Host": ",
"Upgrade-Insecure-Requests": "1",
}
captchaFile = ospathjoin(syspath[0], "captchagif")
cookieFile = ospathjoin(syspath[0], "cookie")
def __init__(self):
oschdir(syspath[0]) # 设置脚本所在目录为当前工作目录
self__session = requestsSession()
self__sessionheaders = selfheaders # 用self调用类变量是防止将来类改名
# 若已经有 cookie 则直接登录
self__cookie = self__loadCookie()
if self__cookie:
print("检测到cookie文件,直接使用cookie登录")
self__sessioncookiesupdate(self__cookie)
soup = BS(selfopen(r")text, "htmlparser")
print("已登陆账号: %s" % soupfind("span", class_="name")getText())
else:
print("没有找到cookie文件,请调用login方法登录一次!")
# 登录
def login(self, username, password):
"""
验证码错误返回:
{'errcode': 1991829, 'r': 1, 'data': {'captcha': '请提交正确的验证码 :('}, 'msg': '请提交正确的验证码 :('}
登录成功返回:
{'r': 0, 'msg': '登陆成功'}
"""
self__username = username
self__password = password
self__loginURL = selfloginURLformat(self__getUsernameType())
# 随便开个网页,获取登陆所需的_xsrf
html = selfopen(selfhomeURL)text
soup = BS(html, "htmlparser")
_xsrf = soupfind("input", {"name": "_xsrf"})["value"]
# 下载验证码
while True:
captcha = selfopen(selfcaptchaURL)content
with open(selfcaptchaFile, "wb") as output:
outputwrite(captcha)
# 人眼识别
print("=" 50)
print("已打开验证码,请识别!")
subprocesscall(selfcaptchaFile, shell=True)
captcha = input("请输入验证码:")
osremove(selfcaptchaFile)
# 发送POST请求
data = {
"_xsrf": _xsrf,
"password": self__password,
"remember_me": "true",
self__getUsernameType(): self__username,
"captcha": captcha
}
res = self__sessionpost(self__loginURL, data=data)
print("=" 50)
# print(restext) # 输出脚本信息,调试用
if resjson()["r"] == 0:
print("登录成功")
self__saveCookie()
break
else:
print("登录失败")
print("错误信息 --->", resjson()["msg"])
def __getUsernameType(self):
"""判断用户名类型
经测试,网页的判断规则是纯数字为phone_num,其他为email
"""
if self__usernameisdigit():
return selfTYPE_PHONE_NUM
return selfTYPE_EMAIL
def __saveCookie(self):
"""cookies 序列化到文件
即把dict对象转化成字符串保存
"""
with open(selfcookieFile, "w") as output:
cookies = self__sessioncookiesget_dict()
jsondump(cookies, output)
print("=" 50)
print("已在同目录下生成cookie文件:", selfcookieFile)
def __loadCookie(self):
"""读取cookie文件,返回反序列化后的dict对象,没有则返回None"""
if ospathexists(selfcookieFile):
print("=" 50)
with open(selfcookieFile, "r") as f:
cookie = jsonload(f)
return cookie
return None
def open(self, url, delay=0, timeout=10):
"""打开网页,返回Response对象"""
if delay:
timesleep(delay)
return self__sessionget(url, timeout=timeout)
def getSession(self):
return self__session
if __name__ == '__main__':
client = ZhiHuClient()
# 第一次使用时需要调用此方法登录一次,生成cookie文件
# 以后可以跳过这一步
# clientlogin("username", "password")
# 用这个session进行其他网络 *** 作,详见requests库
session = clientgetSession()两种方法:
1带cookielib和urllib2
import urllib2
import urllib
import cookielib
def login():
email = raw_input("请输入用户名:")
pwd = raw_input("请输入密码:") data={"email":email,"password":pwd}
post_data=urlliburlencode(data) cj=cookielibCookieJar()
opener=urllib2build_opener(urllib2>
去年在公司写过一个爬虫工具,用于抓取自动化报告通过率、自动发送报告。由于当时是第一次接触爬虫,难免会遇到各种问题,解决方案全都是按照网上的一些爬虫文章示例,照猫画虎写的。虽然能正常使用,但其实很多地方都没弄明白。最近学习了一些前端和后台的原理,了解了cookie与session的机制,总算弄明白了爬虫登录过程中的一个疑问。
编写爬虫第一步,在登录公司的自动化平台时就遇到了一个难题,登录请求中必须包含一个authenticity_token字段。令人头大的是,完全不知道这个字段从何而来,而且该字段还每次都不一样,参考的爬虫登录示例也没教啊!真是急坏苯宝宝了
0条评论