爬蟲 Requests模塊 和 webdriver模塊

Requests模塊

在學習爬蟲之前履磨,我們先來了解http定義的與服務器交互的幾種方法:
get 僅僅獲取資源的信息,不增加或者修改數(shù)據(jù)巷送。
post 一般丟該服務器上的資源综苔,一般我們通過form表單進行提交請求
put 增加
delete 刪除

import requests
requests.get("http://www.baidu.com")
requests.post("http://www.jd.com")
requests.put("http://www.jd.com")
requests.delete("http://www.jd.com")

傳遞參數(shù):

post方式:

params = {'key1': 'hello', 'key2': 'world'}
r = requests.post("http://httpbin.org/post", data=params)
print(r.text)

http://httpbin.org/post是requests提供的官網(wǎng)地址位岔,通過json的方式給大家返回⊙钆伲可以看到我們返回的數(shù)據(jù)擦剑。Post的數(shù)據(jù)參數(shù)是data,都是字典的類型赚抡,但是urllib就沒法接受字典類型,必須是字符串.
結(jié)果:

{
  "args": {}, 
  "data": "", 
  "files": {}, 
  "form": {
    "key1": "hello", 
    "key2": "world"
  }, 
  "headers": {
    "Accept": "*/*", 
    "Accept-Encoding": "gzip, deflate", 
    "Connection": "close", 
    "Content-Length": "21", 
    "Content-Type": "application/x-www-form-urlencoded", 
    "Host": "httpbin.org", 
    "User-Agent": "python-requests/2.18.4"
  }, 
  "json": null, 
  "origin": "1.202.119.5", 
  "url": "http://httpbin.org/post"
}

響應http的請求

url = 'https://www.qiushibaike.com/'
r = requests.get(url=url)
print(r.text)
print(r.encoding)  查看編碼

print(type(r.text))         <class 'str'>
print(type(r.content))          <class 'bytes'>

Requests中text和content的區(qū)別是什么
r.text返回的是str類型的數(shù)據(jù)涂臣。
r.content返回的是bytes型也就是二進制的數(shù)據(jù)售担。
也就是說,如果你想取文本族铆,可以通過r.text哥攘。
如果想取圖片,文件逝淹,則可以通過r.content。

Request的其他常用方法:

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
r = requests.get('https://www.qiushibaike.com/', headers=header)
print(r.text)       文本
print(r.request)        #<PreparedRequest [GET]>
print(r.headers)
#{'Server': 'nginx', 'Date': 'Sun, 14 Jan 2018 12:37:48 GMT', 'Content-Type': 'text/html; charset=UTF-8', 'Content-Length': '17011', 'Connection': 'keep-alive', 'Content-Encoding': 'gzip', 'Set-Cookie': '_xsrf=2|5f47375e|e7eb37220e28518c03d1ea75a2c374e7|1515936871; Path=/', 'Vary': 'User-Agent, Accept-Encoding', 'Etag': '"d0c332a18dc290c35570931f9d699ef756db2450"'}
print(r.cookies)             #cookies的信息
print(r.cookies[‘_xsrf’])       #可以通過字典的方式取值
print(r.url)            #請求的url是多少
print(r.status_code)        #http的狀態(tài)返回碼

Request更改請求頭信息:

header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36'}
r = requests.get('https://www.qiushibaike.com/', headers=header)
print(r.text)
print(r.headers)

可以通過定義一個list,然后通過random模塊隨機取一個header信息進行訪問妥畏,防止飯爬蟲的操作。

Request的會話對象

s = requests.session()
Python2   
S = requests.Session()

所有一次會話的信息都保存在s中燃辖,只需要對s進行操作就可以了。
s.get(url)

Requests通過會話信息來獲取cookie信息

Cookie的五要素:
Name value domain path expires

import requests
def save_cookie():
    s = requests.session()
    s.get('https://www.hao123.com/')
    print(s.cookies) import requests???def save_cookie():?    s = requests.session()?    s.get('https://www.hao123.com/')?    print(s.cookies)?    print(s.cookies.keys())?    print(s.cookies.values())?    for i in s.cookies:?        print(i)?        print(i.name, i.value, i.domain, i.path, i.expires)?if __name__ == '__main__':?    save_cookie()
    print(s.cookies.keys())
    print(s.cookies.values())
    for i in s.cookies:
        print(i)
        print(i.name, i.value, i.domain, i.path, i.expires)
if __name__ == '__main__':
    save_cookie()

使用已知cookie信息妇智,如何訪問網(wǎng)站:

url = 'http://httpbin.org/cookies'
r = requests.get(url, cookies={'key1': 'value1', 'key2': 'value2'})
print(r.text)
結(jié)果:
{
  "cookies": {
    "key1": "value1", 
    "key2": "value2"
  }
}

代理訪問:

采集時為避免被封IP巍棱,經(jīng)常會使用代理蛋欣。requests也有相應的proxies屬性。
西刺代理

import requests
proxies = {
  "http": "http://182.108.5.246:8118",
  # "https": "http://112.117.184.219:9999",
}
r1 = requests.get("http://2017.ip138.com/ic.asp", proxies=proxies)
r2 = requests.get("http://2017.ip138.com/ic.asp")
print(r1.text)
print(r2.text)
[182.108.5.246]
[106.38.115.34]
如果代理需要賬戶和密碼到踏,則需這樣:
proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}

requests的中文亂碼問題:

import requests

param = {"key1": "hello", "key2": "world"}
url = 'https://www.baidu.com/'
r = requests.get(url=url)
print(r.encoding)              #ISO-8859-1默認使用的是這個
r.encoding = "utf-8"
print(r.text)

這樣就可以正常顯示了

webdriver模塊

Selenium是ThroughtWorks公司開發(fā)的一套Web自動化測試工具尚猿。
它分為三個組件:
Selenium IDE
Selenium RC (Remote Control)
Selenium Webdriver
Selenium IDE是firefox的一個插件,允許測試人員錄制腳本并回放讹躯。
Selenium RC和Selenium Webdriver是測試框架缠劝,提供多種語言的API。不同的是秉馏,Selenium Webdriver以一種更底層脱羡、更靈活的方式來操作瀏覽器,并不僅僅使用JavaScript锉罐。這樣它可以繞開瀏覽器的沙箱限制脓规,實現(xiàn)Selenium RC不支持的框架、彈出窗口、頁面導航绢陌、下拉菜單熔恢、基于AJAX的UI元素等控件的操作。以及秤掌,Selenium Webdriver不需要本地服務器鹰霍。
Selenium 1.x版本只包含前兩個組件。從2.0開始Webdriver加入其中椒拗。
主要是來解決https的加密問題

Webdriver在使用之前获黔,不需要下載一個瀏覽器所對應用的驅(qū)動插件在验,請根據(jù)自己不同的瀏覽器版本,進行下載:
Google的我推薦給大家一個百度地址:
鏈接:https://pan.baidu.com/s/1qZ2LfmW 密碼:qixa
下載以后盏触,并把chromdriver放在google.exe那個當前目錄下面

import os
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

chromedriver = "C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe"
os.environ["webdriver.chrome.driver"] = chromedriver
driver = webdriver.Chrome(chromedriver)

driver.get("http://www.python.org")
driver.quit()

八種選擇器:

1. find_elements_by_name(“test”)
頁面:
<input type="text" name="passwd" id="passwd-id"  class=”input-class”/>
代碼:
element = driver.find_elements_by_name(“passwd”)
2. find_elements_by_id()
element = driver.find_element_by_id(“passwd-id”)
    By.tagname()
element = driver.find_element_by_tagname(“input”)
3. find_element_by_class_name(‘input-class’)
4. find_elements_by_tag_name(‘iframe’)

DOM的Tag元素
用Tag name 定位元素的例子:
<iframe src="..."></iframe>
element = driver.find_elements_by_tag_name("iframe")
5. find_element_by_link_text()
頁面:
<a >baidu</a>
代碼:
element = browser.find_elements_by_link_text("baidu")

6 xpath 這個特別強大赞辩,所有的元素都可以通過這個可以找到授艰。
XPath是XML Path的簡稱,由于HTML文檔本身就是一個標準的XML頁面淮腾,所以我們可以使用XPath的語法來定位頁面元素谷朝。
絕對路徑: 根元素開始,及html開始用/
相對路勁: 任意符合條件的元素 //
查找頁面上所有的input元素:

//input

查找頁面上第一個form元素內(nèi)的直接子input元素(即只包括form元素的下一級input元素圆凰,使用絕對路徑表示,單/號):

//form[1]/input

查找頁面上第一個form元素內(nèi)的所有子input元素(只要在form元素內(nèi)的input都算娘荡,不管還嵌套了多少個其他標簽,使用相對路徑表示争群,雙//號):

//form[1]//input

查找頁面上第一個form元素:

//form[1]

查找頁面上id為loginForm的form元素:

//form[@id='loginForm']

查找頁面上具有name屬性為username的input元素:

//input[@name='username']

查找頁面上id為loginForm的form元素下的第一個input元素:

//form[@id='loginForm']/input[1]

查找頁面具有name屬性為contiune并且type屬性為button的input元素:

//input[@name='continue'][@type='button']

查找頁面上id為loginForm的form元素下第4個input元素:

//form[@id='loginForm']/input[4]

控件操作:

輸入框大年;

element.clear()  清空輸入框數(shù)據(jù)
element.sendkeys(“username”)   發(fā)送數(shù)據(jù)
element.text         獲取文本的值

按鈕:

element.click()

表單提交

element.submit()

單選和多選框

element.clear()
element = browser.find_elements_by_id(' checkbox')

選擇某個單選項:

element.click();

常用方法:

browser.get_cookies()
browser.title           頭名字
browser.close()
forward()
前進翔试,browser.foeward()
.back()
后退,browser.back()
.refresh()
刷新冲泥,browser.refresh()
.current_url
返回當前頁面url壁涎,browser.current_url

登錄12306:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from selenium import webdriver

import random
import time

def randomSleep(minS, maxS):
    time.sleep((maxS - minS) * random.random() + minS)
browser = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")

url = "https://kyfw.12306.cn/otn/login/init"

browser.get(url=url)
print(browser.find_element_by_id("username").text)
browser.find_element_by_id("username").clear()
browser.find_element_by_id("username").send_keys("974644081@qq.com")
randomSleep(2, 5)
browser.find_element_by_id("password").send_keys(“xxxxxxxxx")
randomSleep(1, 4)
time.sleep(6)
browser.find_element_by_id("loginSub").click()
randomSleep(2, 5)
print(browser.get_cookies())
browser.quit()

登錄京東:

from selenium import webdriver

import random
import time

def randomSleep(minS, maxS):
    time.sleep((maxS - minS) * random.random() + minS)
browser = webdriver.Chrome(r"C:\Program Files (x86)\Google\Chrome\Application\chromedriver.exe")
# browser = webdriver.Chrome()

# Home
browser.get("https://passport.jd.com/new/login.aspx")

# Login by username and password
randomSleep(1, 2)
browser.find_element_by_xpath("http://a[@clstag='pageclick|keycount|201607144|2']").click()
# browser.find_element_by_tag_name("pageclick|keycount|201607144|2").click()

# Username and password
randomSleep(1, 2)
browser.find_element_by_id("loginname").send_keys(“xxxxxxx")
print(browser.find_element_by_id("loginname").text)

randomSleep(1, 3)
browser.find_element_by_id("nloginpwd").send_keys(“xxxxxx")

# Submit, wait for a long time
randomSleep(5, 10)
browser.find_element_by_id("loginsubmit").click()


print(browser.get_cookies())
randomSleep(3, 5)


browser.quit()
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怔球,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子闽巩,更是在濱河造成了極大的恐慌担汤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隅很,死亡現(xiàn)場離奇詭異驾荣,居然都是意外死亡,警方通過查閱死者的電腦和手機审编,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門歧匈,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人勘究,你說我怎么就攤上這事∶逖簦” “怎么了景描?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長向族。 經(jīng)常有香客問我棠绘,道長,這世上最難降的妖魔是什么氧苍? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任候引,我火速辦了婚禮敦跌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘麸俘。我一直安慰自己惧笛,他們只是感情好,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布拜效。 她就那樣靜靜地躺著各谚,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赴穗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天了赵,我揣著相機與錄音甸赃,去河邊找鬼。 笑死埠对,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的妓羊。 我是一名探鬼主播稍计,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼臣嚣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了硅则?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤暑认,失蹤者是張志新(化名)和其女友劉穎大审,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粮彤,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡姜骡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年圈澈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闯两。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖重慢,靈堂內(nèi)的尸體忽然破棺而出逊躁,到底是詐尸還是另有隱情,我是刑警寧澤稽煤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布酵熙,位于F島的核電站,受9級特大地震影響匾二,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜皮璧,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望譬猫。 院中可真熱鬧,春花似錦裂垦、人聲如沸肌索。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽午乓。三九已至,卻和暖如春梢灭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敏释。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工钥顽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人蜂大。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓奶浦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親澳叉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 這篇文章在介紹官網(wǎng)的同時使用了比較多的腳本示例,示例里遇到的問題有部分在本篇文章進行了解釋泌枪,還有一篇文章專門記錄了...
    顧顧314閱讀 12,927評論 3 32
  • Selenium 官網(wǎng)Selenium WebDriver官網(wǎng)webdriver實用指南python版本 WebD...
    顧顧314閱讀 47,008評論 0 34
  • Selenium是一款強大的基于瀏覽器的開源自動化測試工具碌燕,最初由 Jason Huggins 于 2004 年在...
    FifiZhuang閱讀 7,615評論 5 71
  • selenium用法詳解 selenium主要是用來做自動化測試修壕,支持多種瀏覽器,爬蟲中主要用來解決JavaScr...
    陳_CHEN_陳閱讀 3,897評論 1 5
  • 洞見SELENIUM自動化測試 寫在最前面:目前自動化測試并不屬于新鮮的事物蓝谨,或者說自動化測試的各種方法論已經(jīng)層出...
    厲鉚兄閱讀 6,728評論 3 47