Python網(wǎng)絡(luò)數(shù)據(jù)采集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中某個(gè)鍵 -
delete_all_cookies()
刪除所有Cookie
陷阱--隱含輸入字段
在HTML表單中夭咬,“隱含”字段可以讓字段的值對(duì)瀏覽器可見,但是對(duì)用戶不可見(除非看網(wǎng)頁(yè)源代碼)铆隘。隱含字段主要用于阻止爬蟲自動(dòng)提交表單卓舵。用隱含字段組織網(wǎng)絡(luò)采集的方式主要有兩種。
第一種是表單頁(yè)面上的某個(gè)字段可以用服務(wù)器生成的隨機(jī)變量表示膀钠。如果提交時(shí)候這個(gè)值沒有填寫或者填寫錯(cuò)誤(與服務(wù)端存儲(chǔ)的“答案”不一致)掏湾,那么服務(wù)器就會(huì)拒絕我們的請(qǐng)求裹虫。
第二種方式是有些隱藏起來(lái)的普通字段,比如username
和email
寫爬蟲的可能看到這些字段就像填寫忘巧,這是一個(gè)圈套恒界。服務(wù)器會(huì)將所有填入的隱含字段的值(或者與表單提交頁(yè)面默認(rèn)值不同的值)忽略,而且填寫了這些隱含字段的用戶可能被網(wǎng)站封殺砚嘴。比如這個(gè)網(wǎng)站網(wǎng)頁(yè)源碼如下十酣。
<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;" >Go here!</a>
<a >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>
了嗎?這個(gè)頁(yè)面包含了兩個(gè)鏈接际长,一個(gè)通過(guò)CSS隱藏了耸采,另外一個(gè)可見(Click me!)另外頁(yè)面還有兩個(gè)隱含字段。他們分別是:
- 第一個(gè)鏈接通過(guò)CSS屬性設(shè)置
style="display:none"
進(jìn)行隱藏 - 電話號(hào)碼
name="phone"
指定了type="hidden"
- 郵箱地址
name="email"
指定了一個(gè)自定義的隱藏工育,它將元素向右移動(dòng)50000像素虾宇,應(yīng)該都超出電腦顯示器的邊界了,而且隱藏了滾動(dòng)條如绸。
使用selenium的is_displayed()
可以區(qū)分頁(yè)面上的可見元素和不可見元素嘱朽。
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