php 抓取网页数据(浏览器模拟登录的实现过程1、获取所需要的参数)
优采云 发布时间: 2021-09-13 08:01php 抓取网页数据(浏览器模拟登录的实现过程1、获取所需要的参数)
模拟登录原理
通常,当用户通过浏览器登录网站时,他会在特定的登录界面输入自己的个人登录信息,提交后可以返回一个收录数据的网页。浏览器层面的机制是浏览器提交一个收录必要信息的http Request,服务器返回一个http Response。 HTTP请求内容包括以下5项:
URL=基本 URL+可选查询字符串
请求标头:必需或可选
Cookie:可选
发布数据:当时的POST方法需要
http Response的内容包括以下两项:Html源代码或图片、json字符串等
Cookies:如果后续访问需要cookies,返回的内容中会收录cookies
URL是Uniform Resource Locator的缩写,是互联网上可用资源的位置和访问方式的简明表示,包括主机部分和文件路径部分; Request Headers 从服务中请求信息 Header信息包括编码格式、用户代理、提交主机、路径等信息; post数据是指提交的用户、内容、格式参数等。cookies是服务器发送给浏览器的文件,存储在本地,服务器用来识别用户,用于判断用户是否合法和一些登录信息。
网页抓取原理
如上所述,模拟登录后,网站服务器会返回一个html文件。 HTML 是一种文本文件,具有更严格的语法和带有标签的格式。不同的标签有不同的内容,可以根据相关的标签。除了数据特征之外,还可以使用正则表达式来捕获所需的数据或表示可以进一步挖掘的数据的链接。
模拟登录的实现过程
1、获取所需参数 IE浏览器为开发者提供了强大的工具。获取参数的过程为:
打开浏览器
输入网址
开发者工具
网络激活
网络流量捕获
输入密码和账号登录
找到启动程序的第一条记录为“点击”
详细信息
“请求头”和“请求正文”
请求头和请求体收录客户端和浏览器交互的参数。有些参数是默认的,不需要设置;一些参数与用户本身有关,如用户名、密码、是否记住密码等;
有些参数是客户端和服务器交互产生的。确定参数的步骤,首先从字面上理解,其次在交互记录中搜索参数名称,观察参数产生的过程。请求正文中看到的一些参数是经过编码的,需要进行解码。
2、获取登录百度账号所需的参数
按照上面的步骤,使用IE9浏览器自带的工具轻松获取相关参数。 staticpage 是跳转页面。解码后或在“摘要”记录中,它是已知的 .html。搜索后发现token参数首先出现在URL的响应体中,需要在返回的页码中捕获; apiver 参数设置返回的文本是 json 格式还是 html 格式。除了请求头中的一般设置参数外,还有一个cookie,需要在登录过程中获取,才能与服务器进行交互。
3、登录的具体代码实现
3.1 导入登录过程中用到的库
重新导入;
导入cookielib;
导入urllib;
导入 urllib2;
re库是解析正则表达式,进行爬取和匹配; cookielib 库获取和管理cookies; urllib 和 urllib2 库根据 URL 和 post 数据参数从服务器请求和解码数据。
3.2 cookie 检测功能
通过检查cookiejar返回的cookie key是否与cookieNameList完全匹配来判断是否登录成功。
def checkAllCookiesExist(cookieNameList, cookieJar) :
cookiesDict = {};
对于 cookieNameList 中的 eachCookieName :
cookiesDict[eachCookieName] = False;
allCookieFound = True;
用于 cookieJar 中的 cookie :
if(cookie.name in cookiesDict.keys()) :
cookiesDict[cookie.name] = True;
用于 cookiesDict.keys() 中的 Cookie :
if(not cookiesDict[eachCookie]) :
allCookieFound = False;
中断;
return allCookieFound;
3.3 模拟登录百度
def emulateLoginBaidu():
cj = cookielib.CookieJar(); .
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj));
urllib2.install_opener(opener);
创建一个 cookieJar 对象来存储 cookie,将其与 http 处理器绑定,然后打开安装。
打印“[step1]获取cookie BAIDUID”;
baiduMainUrl = "";
resp = urllib2.urlopen(baiduMainUrl);
打开百度首页,获取cookie BAIDUID。
print "[step2] to get token value";
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标准库中的search函数搜索匹配,返回布尔值表示匹配是否成功。
if(IsfoundToken):
tokenVal = IsfoundToken.group("tokenVal");
打印 "tokenVal=",tokenVal;
print "[step3] 模拟登录百度";
staticpage = "";
baiduMainLoginUrl = "";
postDict = {
'charset': "utf-8",
'token': tokenVal,
'isPhone': "false",
'索引': "0",
'safeflg': "0",
'staticpage': 静态页面,
'登录类型': "1",
'tpl': "mn",
'用户名': "用户名",
'password': "密码",
'mem_pass': "on",
}[3];
设置postdata参数值,不是每个参数都需要设置,有些参数是默认的。
postData = urllib.urlencode(postDict);
编码postdata,例如编码结果为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 处理数据,也就是数据中间的数据
以下程序用于抓取*敏*感*词*电影吧帖子的标题作为演示:
导入 HTMLParser
导入 urllib2