Python网络数据采集6-隐含输入字段

selenium的get_cookies可以轻松获取所有cookie。

from pprint import pprint
from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'C:\Program Files (x86)\phantomjs\bin\phantomjs.exe')
driver.get('https://pythonscraping.com')
# 可以隐式等待几秒
driver.implicitly_wait(1)
pprint(driver.get_cookies())
driver.close()
[{'domain': '.pythonscraping.com',
  'expires': '周三, 19 7月 2017 01:54:21 GMT',
  'expiry': 1500429261,
  'httponly': False,
  'name': '_gat',
  'path': '/',
  'secure': False,
  'value': '1'},
 {'domain': '.pythonscraping.com',
  'expires': '周四, 20 7月 2017 01:53:21 GMT',
  'expiry': 1500515601,
  'httponly': False,
  'name': '_gid',
  'path': '/',
  'secure': False,
  'value': 'GA1.2.1017155976.1500429202'},
 {'domain': '.pythonscraping.com',
  'expires': '周五, 19 7月 2019 01:53:21 GMT',
  'expiry': 1563501201,
  'httponly': False,
  'name': '_ga',
  'path': '/',
  'secure': False,
  'value': 'GA1.2.548627101.1500429202'},
 {'domain': 'pythonscraping.com',
  'httponly': False,
  'name': 'has_js',
  'path': '/',
  'secure': False,
  'value': '1'}]

除此之外,还可以使用

  • get_cookie(name) 获取Cookie字典中键为name的值
  • add_cookie(cookie_dict) 添加Cookie
  • delete_cookie(name) 删除Cookie中某个键
  • delete_all_cookies() 删除所有Cookie

陷阱--隐含输入字段

在HTML表单中,“隐含”字段可以让字段的值对浏览器可见,但是对用户不可见(除非看网页源代码)。隐含字段主要用于阻止爬虫自动提交表单。用隐含字段组织网络采集的方式主要有两种。

第一种是表单页面上的某个字段可以用服务器生成的随机变量表示。如果提交时候这个值没有填写或者填写错误(与服务端存储的“答案”不一致),那么服务器就会拒绝我们的请求。

第二种方式是有些隐藏起来的普通字段,比如usernameemail写爬虫的可能看到这些字段就像填写,这是一个圈套。服务器会将所有填入的隐含字段的值(或者与表单提交页面默认值不同的值)忽略,而且填写了这些隐含字段的用户可能被网站封杀。比如这个网站网页源码如下。

<html><head>
    <title>A bot-proof form</title>
<style>
body {
    overflow-x:hidden;
}
.customHidden {
    position:absolute;
    right:50000px;
}
</style><style></style></head>

<body>
    <h2>A bot-proof form</h2>
<a style="display:none;" href="http://pythonscraping.com/dontgohere">Go here!</a>
<a href="http://pythonscraping.com">Click me!</a>
<form>
<input name="phone" type="hidden" value="valueShouldNotBeModified"><p>
<input name="email" class="customHidden" type="text" value="intentionallyBlank"></p><p>
<input name="firstName" type="text"></p><p>
<input name="lastName" type="text"></p><p>
<input type="submit" value="Submit"></p><p>
</p></form>

</body></html>

看到有一段<style>了吗?这个页面包含了两个链接,一个通过CSS隐藏了,另外一个可见(Click me!)另外页面还有两个隐含字段。他们分别是:

  • 第一个链接通过CSS属性设置 style="display:none"进行隐藏
  • 电话号码name="phone"指定了type="hidden"
  • 邮箱地址name="email"指定了一个自定义的隐藏,它将元素向右移动50000像素,应该都超出电脑显示器的边界了,而且隐藏了滚动条。

使用selenium的is_displayed()可以区分页面上的可见元素和不可见元素。

from selenium import webdriver

driver = webdriver.PhantomJS(executable_path=r'C:\Program Files (x86)\phantomjs\bin\phantomjs.exe')
driver.get('http://pythonscraping.com/pages/itsatrap.html')
links = driver.find_elements_by_tag_name('a')

for link in links:
    if not link.is_displayed():
        print(link.get_attribute('href'), 'is a trap!')

fields = driver.find_elements_by_tag_name('input')
for field in fields:
    if not field.is_displayed():
        print("Don't change the value of", field.get_attribute('name'))
http://pythonscraping.com/dontgohere is a trap!
Don't change the value of phone
Don't change the value of email

by @sunhaiyu

2017.7.19

Python网络数据采集6-隐含输入字段的更多相关文章

  1. 笔记之Python网络数据采集

    笔记之Python网络数据采集 非原创即采集 一念清净, 烈焰成池, 一念觉醒, 方登彼岸 网络数据采集, 无非就是写一个自动化程序向网络服务器请求数据, 再对数据进行解析, 提取需要的信息 通常, ...

  2. Python网络数据采集PDF高清完整版免费下载|百度云盘

    百度云盘:Python网络数据采集PDF高清完整版免费下载 提取码:1vc5   内容简介 本书采用简洁强大的Python语言,介绍了网络数据采集,并为采集新式网络中的各种数据类型提供了全面的指导.第 ...

  3. Python网络数据采集7-单元测试与Selenium自动化测试

    Python网络数据采集7-单元测试与Selenium自动化测试 单元测试 Python中使用内置库unittest可完成单元测试.只要继承unittest.TestCase类,就可以实现下面的功能. ...

  4. 20190715《Python网络数据采集》第 1 章

    <Python网络数据采集>7月8号-7月10号,这三天将该书精读一遍,脑海中有了一个爬虫大体框架后,对于后续学习将更加有全局感. 此前,曾试验看视频学习,但是一个视频基本2小时,全部拿下 ...

  5. 《python 网络数据采集》代码更新

    <python 网络数据采集>这本书中会出现很多这一段代码: 1 from urllib.request import urlopen 2 from bs4 import Beautifu ...

  6. Python网络数据采集4-POST提交与Cookie的处理

    Python网络数据采集4-POST提交与Cookie的处理 POST提交 之前访问页面都是用的get提交方式,有些网页需要登录才能访问,此时需要提交参数.虽然在一些网页,get方式也能提交参.比如h ...

  7. Python网络数据采集3-数据存到CSV以及MySql

    Python网络数据采集3-数据存到CSV以及MySql 先热热身,下载某个页面的所有图片. import requests from bs4 import BeautifulSoup headers ...

  8. Python网络数据采集2-wikipedia

    Python网络数据采集2-wikipedia 随机链接跳转 获取维基百科的词条超链接,并随机跳转.可能侧边栏和低栏会有其他链接.这不是我们想要的,所以定位到正文.正文在id为bodyContent的 ...

  9. Python网络数据采集1-Beautifulsoup的使用

    Python网络数据采集1-Beautifulsoup的使用 来自此书: [美]Ryan Mitchell <Python网络数据采集>,例子是照搬的,觉得跟着敲一遍还是有作用的,所以记录 ...

随机推荐

  1. 如何将mysql数据导入Hadoop之Sqoop安装

    Sqoop是一款开源的工具,主要用于在Hadoop(Hive)与传统的数据库(mysql.postgresql...)间进行数据的传递,可以将一个关系型数据库(例如 : MySQL ,Oracle , ...

  2. css实现选项卡

    <style> *{ margin: ; padding: ; text-decoration: none; list-style: none; outline:none; } .box{ ...

  3. javascript 闭包 转载

    http://www.jb51.net/article/24101.htm var name = "the window"; var object = { name:"m ...

  4. linux软件包介绍

    一. 软件包的种类 源码包 二进制包(rpm包.系统默认包) 二. 优缺点对比 源码包 源码包的优点 1) 开源,源码可见,且可以修改 2) 配置更加灵活,可以自由选择所需的功能 3) 软件是编译安装 ...

  5. Python 编码错误的本质原因

    转载自:https://foofish.net/python-unicode-error.html 不论你是有着多年经验的 Python 老司机还是刚入门 Python 不久的新贵,你一定遇到过Uni ...

  6. django-xadmin数字输入框不支持小数点小数问题

    环境:https://github.com/y2kconnect/xadmin-for-python3.git python3.5.2 django1.9.12 原因:数字输入框用的是html5 in ...

  7. WCF学习——构建第二个WCF应用程序(五)

    一.创建数据服务 1.在“解决方案资源管理器”中,使用鼠标左键选中“WcfService”项目,然后在菜单栏上,依次选择“项目”.“添加新项”. 2.在“添加新项”对话框中,选择“Web”节点,然后选 ...

  8. Web自动化之Headless Chrome概览

    Web自动化 这里所说的Web自动化是所有跟页面相关的自动化,比如页面爬取,数据抓取,页面内容检测,页面功能测试,页面加载性能测试,页面回归测试等等,当前主要由如下几种解决方式: 文本数据获取 这就是 ...

  9. 处理input标签的border-radius

    给input设置border-radius效果时一定要先设置border属性,否则会出现左上部有阴影的效果.

  10. alibaba druid 在springboot start autoconfig 下的bug

    alibaba druid 在springboot start autoconfig下的bug 标签(空格分隔):druid springboot start autoconfig 背景 发现.分析过 ...