大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

爬虫 Requests模块 和 webdriver模块

Requests模块

在学习爬虫之前,我们先来了解http定义的与服务器交互的几种方法:
get 仅仅获取资源的信息,不增加或者修改数据。
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")

传递参数:

post方式:

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

http://httpbin.org/post是requests提供的官网地址,通过json的方式给大家返回。可以看到我们返回的数据。Post的数据参数是data,都是字典的类型,但是urllib就没法接受字典类型,必须是字符串.
结果:

{
  "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的区别是什么
r.text返回的是str类型的数据。
r.content返回的是bytes型也就是二进制的数据。
也就是说,如果你想取文本,可以通过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的状态返回码

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 requestsdef 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信息,如何访问网站:

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

代理访问:

采集时为避免被封IP,经常会使用代理。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公司开发的一套Web自动化测试工具。
它分为三个组件:
Selenium IDE
Selenium RC (Remote Control)
Selenium Webdriver
Selenium IDE是firefox的一个插件,允许测试人员录制脚本并回放。
Selenium RC和Selenium Webdriver是测试框架,提供多种语言的API。不同的是,Selenium Webdriver以一种更底层、更灵活的方式来操作浏览器,并不仅仅使用JavaScript。这样它可以绕开浏览器的沙箱限制,实现Selenium RC不支持的框架、弹出窗口、页面导航、下拉菜单、基于AJAX的UI元素等控件的操作。以及,Selenium Webdriver不需要本地服务器。
Selenium 1.x版本只包含前两个组件。从2.0开始Webdriver加入其中。
主要是来解决https的加密问题

Webdriver在使用之前,不需要下载一个浏览器所对应用的驱动插件,请根据自己不同的浏览器版本,进行下载:
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 href="http://www.google.com/search?q=baidu">baidu</a>
代码:
element = browser.find_elements_by_link_text("baidu")

6 xpath 这个特别强大,所有的元素都可以通过这个可以找到。
XPath是XML Path的简称,由于HTML文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
绝对路径: 根元素开始,及html开始用/
相对路劲: 任意符合条件的元素 //
查找页面上所有的input元素:

//input

查找页面上第一个form元素内的直接子input元素(即只包括form元素的下一级input元素,使用绝对路径表示,单/号):

//form[1]/input

查找页面上第一个form元素内的所有子input元素(只要在form元素内的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()  清空输入框数据
element.sendkeys(“username”)   发送数据
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("//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()