会员登录|免费注册|忘记密码|管理入口 返回主站||保存桌面
6.用python写网络爬虫,表单交互
2024-12-31IP属地 湖北0
    我们最先要实施 自 动化提交的 是登录表单 , 其网址为 http : / / exampl e . webscraping . com/user/ l ogin o 要想理解该表单 , 我们需要用 到 Firebug Lite 。 如果使用完整版的 Firebug 或者 Chrome 的 开发者工具 , 我们只需要提 交表单就可 以在 网 络选项卡 中检查传输的 数据 。 但是 , Lite 版本 限制我们只 能查看结构 ,如下图所示
   
     上图中包括几个重要组成部分,分别是form标签的action...enctype 和method属性,以及两个 input域。action属性用于设置表单数据提交的地址,本例中为,也就是和登录表单相同的URL。 enctype属性用于设置数据提交的编码,本例中为 application/x-www- form-urlencoded。而me thod 属性被设为 post,表示通过请求体向服务器端提交表单数据。对于input标签,重要的属性是 name,用于设定提交到服务器端时某个域的名称。
    很遗憾,这个版本依然不能正常工作,运行时还是会打印出登录URL。这是因为我们缺失了一个重要的组成部分一一 cookie。当普通用户加载登录表单时_formkey的值将会保存在cookie中,然后该值会与提交的登录表单数据中的_formkey值进行对比。下面是使用urllib2.HTTPCookie Process or 类增加了cookie支持之后的代码。
    这次我们终于成功了!服务器端接受了我们提交的表单值,response的U也 是主页。该代码片段以及本章中其他登录示例代码都可以从https : //bitbucket.org/wswp/code/src/tip/chapter06/login.py 获取。
    从前面的例子可以看出,如何向服务器提交它所需的登录信息,有时候会很复杂。幸好,对于这种麻烦的网站还有一个变通方法,即先在浏览器中手工执行登录,然后在Python脚本中复用之前得 到的cookie,从而实现自动登录。不同浏览器采用不同的格式存储 cookie ,这里我们仅以Firefox 浏览器为例。
    Firefox在sqlite数据库中存储cookie,在JSON文件中存储session,这两种存储方式都可以直接通过Python获取。对于登录操作来说,我们只需要获取session,其存储结构如下所示。

    下面是把 session 解析到 Cookie Ja r 对象的函数代码 。 

6.用python写网络爬虫,表单交互

    这段代码比之前的例子要简单得多,因为我们不再需要管理 cookie,而且访问表单输入框也更加容易。该脚本首先创建一个 Mechanize 浏览器对象,然后定位到登录 URL,选择登录表单我们可以直接向浏览器对象传递名称和值,来设置选定表单的输入框内容。调试时,我们可以直接调用 br.form,获取提交之前的表单状态,如下面的代码所示。
 
    设定好登录表单的参数之后,调用br.submit)提交选定的登录表单,然后脚本就处于登录态 了。现在,定位到国家的编辑页面,继续使用表单界面增加人口数量。需要注意的是,人口数量的输入框需要字符串类型的值,否则Mechanize会抛出TypeError异常。
    要检查上面的代码是否运行成功,可以使用 Mechanize 返回到国家表单,查询当前的人口数量 如下所示。