网页抓取数据百度百科(浏览器模拟登录的实现过程1、获取所需要的参数)
优采云 发布时间: 2022-04-12 14:10网页抓取数据百度百科(浏览器模拟登录的实现过程1、获取所需要的参数)
模拟登录原理
一般情况下,用户通过浏览器登录网站时,会在特定的登录界面输入个人登录信息,提交后可以返回收录数据的网页。浏览器层面的机制是浏览器提交一个收录必要信息的http Request,服务器返回一个http Response。HTTP Request 内容包括以下 5 项:
URL = 基本 URL + 可选查询字符串
请求标头:必需或可选
饼干:可选
发布数据:当时的 POST 方法需要
http Response的内容包括以下两项:Html源码或图片、json字符串等。
Cookies:如果后续访问需要cookie,返回的内容会收录cookie
其中,URL是Uniform Resource Locator的缩写,是对可以从互联网上获取的资源的位置和访问方式的简明表示,包括主机部分和文件路径部分;Request Headers 是向服务请求信息的头部信息。收录编码格式、用户代理、提交主机和路径等信息;发布数据是指提交的用户、内容、格式参数等。Cookies是服务器发送给浏览器的文件,保存在本地,服务器用来识别用户,以及判断用户是否合法和一些登录信息。
网页抓取的工作原理
如上所述,模拟登录后,网站服务器会返回一个html文件。HTML 是一个带有严格语法和格式的标签的文本文件。数据特征,使用正则表达式来获取您需要的数据或表示可以进一步挖掘的数据的链接。
模拟登录的实现流程
1、获取所需参数 IE浏览器为开发者提供了强大的工具。获取参数的过程如下:
打开浏览器
输入网址
开发者工具
启用网络
网络流量捕获
输入密码和账号登录
查找发起者为“click”的第一条记录
细节
“请求标头”和“请求正文”
请求头和请求体收录客户端和浏览器交互的参数。有些参数是默认的,不需要设置;一些参数与用户本身有关,如用户名、密码、是否记住密码等;
一些参数是由客户端和服务器交互产生的。确定参数的步骤是,首先从字面上理解它们,其次在交互记录中搜索参数名称,观察这些参数是在哪个过程中产生的。请求正文中看到的一些参数是编码的,需要解码。
2、 获取登录百度账号需要的参数
按照以上步骤,使用IE9浏览器自带的工具,即可轻松获取相关参数。其中staticpage是跳转页面,解码后还是在“摘要”记录中知道.html。查找后发现token参数首先出现在URL的响应体中,需要在返回的页码中捕获;apiver 参数设置返回的文本是 json 格式还是 html 格式。除了请求头中的一般设置参数外,还有cookies,需要在登录过程中获取,以便与服务器交互。
3、 登录的具体代码实现
3.1 导入登录进程使用的库
重新*敏*感*词*;
导入 cookielib;
导入 urllib;
导入 urllib2;
re库解析正则表达式并爬取匹配;cookielib 库获取和管理 cookie;urllib 和 urllib2 库根据 URL 和 post 数据参数从服务器请求和解码数据。
3.2 cookie检测函数
通过检查cookiejar返回的cookie key是否与cookieNameList完全匹配来判断登录是否成功。
def checkAllCookiesExist(cookieNameList, cookieJar) :
cookiesDict = {};
对于 cookieNameList 中的每个CookieName:
cookiesDict[eachCookieName] = 假;
allCookieFound =真;
对于 cookieJar 中的 cookie:
if(cookie.name in cookiesDict.keys()) :
cookiesDict[cookie.name] = True;
对于 cookiesDict.keys() 中的 Cookie:
如果(不是 cookiesDict[eachCookie]):
allCookieFound = False;
休息;
返回所有CookieFound;
3.3 模拟登录百度
def emulateLoginBaidu():
cj = cookielib.CookieJar(); .
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
urllib2.install_opener(opener);
创建一个 cookieJar 对象来存储 cookie,与 http 处理程序绑定并打开安装。
print "[step1] 获取cookie BAIDUID";
baiduMainUrl = "";
resp = urllib2.urlopen(baiduMainUrl);
打开百度首页,获取cookie BAIDUID。
print "[step2]获取token值";
getapiUrl = "";
getapiResp = urllib2.urlopen(getapiUrl);
getapiRespHtml = getapiResp.read();
打印“getapiResp=”,getapiResp;
isfoundToken= re.search("bdPass\.api\.params\.login_token='(?P\w+)';",
getapiRespHtml);
上述程序用于获取post数据中的token参数。首先获取getapiUrl URL的html,然后使用re标准库中的搜索函数搜索匹配,返回一个表示匹配是否成功的布尔值。
如果(IsfoundToken):
tokenVal = IsfoundToken.group("tokenVal");
打印“tokenVal=”,tokenVal;
print "[step3] 模拟登录百度";
静态页面 = "";
baiduMainLoginUrl = "";
postDict = {
'字符集' : "utf-8",
“令牌”:令牌值,
'isPhone' : "假",
“索引”:“0”,
'safeflg' : "0",
“静态页面”:静态页面,
“登录类型”:“1”,
'tpl' : "mn",
'用户名' : "用户名",
'密码' : "密码",
'mem_pass' : "开",
}[3];
设置postdata参数值,不是每个参数都需要设置,有些参数是默认的。
postData = urllib.urlencode(postDict);
编码后数据。比如l编码的结果是http%3A%2F%2F%2Fcache%2Fuser%2Fhtml%2Fjump.html,其他参数类似。
req = urllib2.Request(baiduMainLoginUrl, postData);
resp = urllib2.urlopen(req);
Python标准库urllib2的两个函数分别提交用户请求和数据,并接受返回的数据
cookiesToCheck = ['BDUSS', 'PTOKEN', 'STOKEN', 'SAVEUSERID', 'UBI', 'HISTORY', 'USERNAMETYPE'];
爬取网页的实现过程
以上使用正则表达式成功抓取返回网页中的token。Python 的标准库 HTMLParser 提供了一个强大的功能来识别 html 文本标签和数据。使用时,从 HTMLParser 派生一个新的类,然后重新定义这些以 handler_ 开头的函数。几个常用的功能包括:
handle_startendtag 处理开始和结束标签
handle_starttag 处理开始标签,例如
handle_endtag 处理结束标签,例如
handle_charref 处理以 开头的特殊字符串,一般是内部代码表示的字符
handle_entityref 处理一些以&开头的特殊字符,比如
handle_data 处理数据,也就是数据中间的数据
下面的程序是用来抓取*敏*感*词*Movie Bar帖子的header做示范:
导入 HTMLParser
导入 urllib2