爬虫spider

爬虫简介

  • 前提知识:html、css、js、Ajax、re、Xpath、XML、url、HTTP协议

  • 爬虫定义:网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),
    是一种按照一定的规则,自动抓取万维网信息的程序或者脚本。

  • 两大特征:

    • 能按作者要求下载数据或内容
    • 能自动在网络上流传
  • 三大步骤:

    • 下载信息
    • 提取正确的信息
    • 根据一定规则自动跳到另外的网页上执行上两步内容
  • 爬虫分类

    • 通用爬虫
    • 专用爬虫(聚焦爬虫)
  • python网络包简介:

    • python2.x:urllib,urllib2,urllib3,httplib,httplib2,requests
    • python3.x:urllib,urllib3,httplib2,requests
    • python2: urllib和urllib2配合使用,或者requests
    • python3:urllib,requests

urllib

  • 包含模块:
    • urllib.request:打开和读取urls
    • urllib.error:包含urllib.request产生的常见的错误,使用try捕捉
    • urllib.parse:包含解析url的方法
    • urllib.robotparse:解析robots.txt文件
    • 案例1
#案例1
'''
使用urllib.request请求一个网页内容,并把内容打印出来
'''
from urllib import request

if __name__ == "__main__":
    url = "https://job.youkuaiyun.com/c/513576"
    # 打开相应url并把相应页面作为返回
    rsp = request.urlopen(url)
    
    # 把返回结果读取出来
    # 读取出来内容类型为bytes
    html = rsp.read()
    print(type(html))
    
    # 如果想把bytes内容转换成字符串,需要解码
    html = html.decode("utf-8")
    print(html)
    

网页编码问题解决

- chardet 可以自动检测页面文件的编码格式,但是,可能有误
- 需要安装:conda install chardet 或 pip install chardet
- 案例2
# 案例2
'''
利用request下载页面
自动检测页面编码
'''
import urllib
import chardet

if __name__ == "__main__":
    url= "https://www.21wecan.com/rsdl/"
    rsp = urllib.request.urlopen(url)
    
    html = rsp.read()
    
    # 利用 chardet自动检测
    cs = chardet.detect(html)
    print(type(cs))
    print(cs)
    
    html = html.decode(cs.get("encoding","utf-8"))
    print(html)

urlopen的返回对象

  • geturl: 返回请求对象的url
  • info:请求反馈对象的meta信息
  • getcode:返回的http code 200
  • 案例3
# 案例3
'''
使用urllib.request请求一个网页内容,并把内容打印出来
'''
from urllib import request

if __name__ == "__main__":
    url = "https://job.youkuaiyun.com/c/513576"
    # 打开相应url并把相应页面作为返回
    rsp = request.urlopen(url)
    print(type(rsp))
    print(rsp)
    
    print("URL:{0}".format(rsp.geturl()))
    print("Info:{0}".format(rsp.info()))
    print("Code:{0}".format(rsp.getcode()))
    
    # 把返回结果读取出来
    # 读取出来内容类型为bytes
    html = rsp.read()
    print(type(html))
    
    # 如果想把bytes内容转换成字符串,需要解码
    html = html.decode("utf-8")
    print(html)

request.data的使用

  • 访问网络的两种方法
    • get

      • 利用参数给服务器传递信息
      • 参数为dict,然后用parse编码
    • 案例4,爬取不能用https,用http才行

    • post

      • 一般向服务器传递参数使用
      • post是把信息自动加密处理
      • 我们如果用post信息,需要用到data参数
      • 使用post,意味着HTTP的请求头可能需要更改:
        • Content-Type: application/x-www.form-urlencode
        • Content-Length: 数据长度
        • 简而言之,一旦更改请求方法,请注意其他请求头部信息相适应
      • urllib.parse.urlencode可以将字符串自动转换成上面的
    • 案例5

    • 为了更多的设置请求信息,单纯的通过urlopen函数已经不太好用了

    • 需要用到request.Request类

    • 案例6

# 案例4
from urllib import request,parse
'''
掌握对url进行参数编码的方法
需要使用parse模块
'''
if __name__ == "__main__":
    url = "http://www.baidu.com/s?"
    wd = input("Input your keyword:")
    
    #要想使用data,需要使用字典结构
    qs = {
        "wd": wd
    }
    #转换url编码
    qs = parse.urlencode(qs)
    print(qs)
    
    fullurl = url + qs
    print(fullurl)
    
    # 打开相应url并把相应页面作为返回
    rsp = request.urlopen(fullurl)
    
    
    # 把返回结果读取出来
    # 读取出来内容类型为bytes
    html = rsp.read()
    print(type(html))
    
    # 如果想把bytes内容转换成字符串,需要解码
    html = html.decode("utf-8")
    print(html)
# 案例5
'''
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Heards查看,发现FormDate的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式==》需要用到json包
'''
from urllib import request,parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''

baseurl = "http://fanyi.baidu.com/sug"

wd = input("Input your keyword")

# 存放用来模拟form的数据一定是dict格式
data = {
    #girl 是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
    'kw':wd
}

# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode('utf-8')

# 有了data,url,就可以发出请求了
rsp = request.urlopen(baseurl,data=data)

json_data = rsp.read().decode('utf-8')
print(json_data)

#把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)

for item in json_data['data']:
    print(item['k']--item['v'])
# 案例6,本案例只是利用Request类来实现案例五的内容
'''
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Heards查看,发现FormDate的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式==》需要用到json包
'''
from urllib import request,parse
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''

baseurl = "http://fanyi.baidu.com/sug"

wd = input("Input your keyword")

# 存放用来模拟form的数据一定是dict格式
data = {
    #girl 是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
    'kw':wd
}
# 需要使用parse模块对data进行编码
data = parse.urlencode(data).encode('utf-8')

headers = {
    #因为使用post模块对data进行编码,至少包含content-length字段
    'Content-Length':len(data)
}

#构造一个Request的实例
req = request.Request(url=baseurl,data=data,headers=headers)


# 因为已经构造了一个Request的请求,则所有的请求信息可以封装在Request实例中
rsp = request.urlopen(req)

json_data = rsp.read().decode('utf-8')
print(json_data)

#把json字符串转化成字典
json_data = json.loads(json_data)
print(type(json_data))
print(json_data)

# for item in json_data['data']:
#     print(item['k']--item['v'])

urllib.error(OSErroe的子类)

- URLError产生的原因:
    - 没网
    - 服务器连接失败
    - 找不到指定服务器
    - 案例1
- HTTPError,是URLError的一个子类
    - 案例2

- 两者区别:
    - HTTPError是对应的HTTP请求的返回码错误,如果返回错误码是400以上的,则引发HTTPError
    - URLError对应的一般是网络出现问题,包括url问题
    - 包含关系区别:OSError->URLError->HTTPError
from urllib import request,error

if __name__ == "__main__":
    url = "http://www.baidu.com"
    try:
        req = request.Request(url)
        rsp = request.urlopen(req)
        html = rsp.read().decode()
        print(html)
    except error.URLError as e:
        print("URLError: {0}".format(e.reason))
        print("URLError: {0}".format(e))        
        
    except Exception as e:
        print(e)
from urllib import request,error

if __name__ == "__main__":
    url = "http://www.sipo.gov.cn/www"
    try:
        req = request.Request(url)
        rsp = request.urlopen(req)
        html = rsp.read().decode()
        print(html)
        
    except error.HTTPError as e:
        print("HTTPError:{0}".format(e.reason))
        print("HTTPError:{0}".format(e))
    except error.URLError as e:
        print("URLError: {0}".format(e.reason))
        print("URLError: {0}".format(e))        
        
    except Exception as e:
        print(e)

UserAgent

  • UserAgent: 用户代理,简称UA。属于heads的一部分,服务器通过UA来判断访问者身份

  • 常见的UA值,使用的时候可以直接复制粘贴,也可以用浏览器访问的时候抓包

    • Opera
      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60
      Opera/8.0 (Windows NT 5.1; U; en)
      Mozilla/5.0 (Windows NT 5.1; U; en; rv:1.8.1) Gecko/20061208 Firefox/2.0.0 Opera 9.50
      Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; en) Opera 9.50

    • Firefox
      Mozilla/5.0 (Windows NT 6.1; WOW64; rv:34.0) Gecko/20100101 Firefox/34.0
      Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10

    • Safari
      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2

    • chrome
      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36
      Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
      Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16

    • 360
      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36
      Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko

    • 淘宝浏览器
      Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11

  • 设置UA可以通过两种方式:

    • heads
    • add_header
'''
访问一个网址
更改自己的UserAgent进行伪装
'''
from urllib import request,error

if __name__ == "__main__":
    url = "http://www.baidu.com"
    
    try:
        #使用head方法伪装UA
        headers = {}
        headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11"
        
        req = request.Request(url,headers=headers)
        
        
        #正常访问
        rsp = request.urlopen(req)
        html = rsp.read().decode()
        print(html)
        
    except error.HTTPError as e:
        print(e)
    except error.URLError as e:
        print(e)
    except Exception as e:
        print(e)

'''
访问一个网址
更改自己的UserAgent进行伪装
'''
from urllib import request,error

if __name__ == "__main__":
    url = "http://www.baidu.com"
    
    try:
        # 使用添加的方式进行访问
        req = request.Request(url)
        req.add_header("User-Agent","Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
        
        
        #正常访问
        rsp = request.urlopen(req)
        html = rsp.read().decode()
        print(html)
        
    except error.HTTPError as e:
        print(e)
    except error.URLError as e:
        print(e)
    except Exception as e:
        print(e)

ProxyHandler处理(代理服务器)

  • 使用代理IP,是爬虫的常用手段
  • 获取代理服务器的地址:
    • www.xicidaili.com
    • www.goubanjia.com
  • 代理用来隐藏真实访问中,代理也不允许频繁访问某一个固定网站,所以,代理一定要很多很多
  • 基本使用步骤:
      1. 设置代理地址
      1. 创建ProxyHandler
      1. 创建Opener
      1. 安装Opener
from urllib import request,error

if __name__ == "__main__":
    url = "http://www.baidu.com"
    
    #1.设置代理地址
    proxy = {'http':'101.4.136.34:81'}
    
    #2. 创建ProxyHandler
    proxy_handler = request.ProxyHandler(proxy)
    
    #3. 创建Opener
    opener = request.build_opener(proxy_handler)
    
    #4. 安装Opener
    request.install_opener(opener)
    
    #现在如果访问url,则使用代理服务器
    try:
        rsp = request.urlopen(url)
        html = rsp.read().decode()
        print(html)
    except error.URLError as e:
        print(e)
    except Exception as e:
        print(e)

cookie & session

  • 由于http协议的无记忆性,人们为了弥补这个缺憾,所采用的的一个补充协议
  • cookie是发放给客户(即http浏览器)的一段信息,session是保存在服务器上对应的另一半信息,用来记录用户信息
    • cookie和session的区别
      • 存放位置不同
      • cookie不安全
      • session会保存在服务器上一定时间,会过期
      • 单个cookie保存数据不超过4k,很多浏览器限制一个站点最多保存20个
    • session的存放位置
      • 存在服务端
      • 一般情况,session是放在内存中或者数据库中
    • 使用cookie登录
      • 直接把cookie复制下来,然后手动放入请求头
      • http模块包含一些关于cookie的模块,通过他们我们可以自动使用cookie
        • CookieJar
          • 管理存储cookie,向传出的Http请求添加cookie
          • cookie存储在内库中,CookieJar实例回收后cookie将消失
        • FileCookieJar(filename,delayload=None,policy=None)
          • 使用文件管理cookie
          • filename是保存cookie的文件
        • MozillaCookieJar
          • 创建与mozilla浏览器cookie.txt兼容的FileCookieJar实例
        • LwpCookieJar
          • 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookJar实例
        • 他们的关系是:CookieJar–>FileCookieJar–>MozillaCookieJar & LwpCookieJar
  • handler是Handler的实例,常用参数案例:
    • 用来处理复杂请求:
      • 生成cookie的管理器
        cookie_handler = request.HTTPCookieProcessor(cookie)

      • 创建http请求管理器
        http_handler = request.HTTPHandler()

      • 生成https管理器
        https_handler = request.HTTPSHandler()

    • 创立handler后,使用opener打开,打开后相应的业务由相应的handler处理
# 没有cookie案例,可以看到,没有使用cookie则反馈网页为未登录状态
from urllib import request
if __name__ == "__main__":
    url = "http://www.renren.com/965187997/profile"
    
    rsp = request.urlopen(url)
    
    print(rsp.read().decode())
    with open("rsp.html","w") as f:
        f.write(html)
# 使用cookie登录,一般情况下可以登入进去
from urllib import request
if __name__ == "__main__":
    url = "http://www.renren.com/965187997/profile""
    
    headers = {
        'cookie':'uuid_tt_dd=10_17345372890-1586250378297-983245; dc_session_id=10_1586250378297.482255; dc_sid=c3ce3079ece244a407693b04945e17c3; Hm_ct_6bcd52f51e9b3dce32bec4a3997715ac=6525*1*10_17345372890-1586250378297-983245!5744*1*weixin_45935720; __gads=ID=196a2d6d196fa927:T=1586250383:S=ALNI_MZU4J6olnW8vV9JNlWQM4AnxRAD6Q; c-toolbar-writeguide=1; c_ref=https%3A//www.baidu.com/link%3Furl%3DgfVTiNXbCbhGCkHDgxu0JJnh1Nupef2BtdZf_VrEEARpegm-6xs3zIsazprMkM_f9kQ5LAsTeHKK6euXqx5Fh0q3GXKp97rn9i0Z1r-f1ma%26wd%3D%26eqid%3D8a2d92b5002f3ab2000000035e8c59d1; Hm_lvt_6bcd52f51e9b3dce32bec4a3997715ac=1586069706,1586069915,1586250382,1586256372; SESSION=6e69097e-2e66-4938-abc8-525ab1622fb3; UserName=weixin_45935720; UserInfo=c234eda1036b4e389f645402240ffc3a; UserToken=c234eda1036b4e389f645402240ffc3a; UserNick=info_foo; AU=7F6; UN=weixin_45935720; BT=1586259045549; p_uid=U000000; announcement=%257B%2522isLogin%2522%253Atrue%252C%2522announcementUrl%2522%253A%2522https%253A%252F%252Fblog.youkuaiyun.com%252Fblogdevteam%252Farticle%252Fdetails%252F105203745%2522%252C%2522announcementCount%2522%253A0%252C%2522announcementExpire%2522%253A3600000%257D; Hm_lpvt_6bcd52f51e9b3dce32bec4a3997715ac=1586261385; dc_tos=q8f349'
    }
    req = request.Request(url,headers=headers)
    
    rsp = request.urlopen(req)
    
    html = rsp.read().decode('utf-8')
    
    with open("rpo.html","w") as f:
        f.write(html)
# 利用CookieJar访问人人网
'''
自动使用cookie登录,大致流程是:
1.打开登录页面后自动通过用户名密码登录
2.自动提取反馈回来的cookie
3.利用提取的cookie登录隐私页面
'''
from urllib import request,parse
from http import cookiejar

#创建cookiejar的实例
cookie = cookiejar.CookieJar()

#生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)

#创建http请求管理器
http_handler = request.HTTPHandler()

#生成https管理器
https_handler = request.HTTPSHandler()
opener = request.build_opener(http_handler,https_handler,cookie_handler)

def login():
    '''
    负责初次登录
    需要输入用户名密码,用来获取登录cookie凭证
    '''
    # 此url需要从登录form的action属性中提取
    url = "http://www.renren.com/PLogin.do"
    
    # 此键值需要从登录form的两个对应input中提取name属性
    data = {
        "email":"13119144223",
        "password":"123456"
    }
    
    #把数据进行编码
    data = parse.urlencode(data)
    
    #创建一个请求对象
    req = request.Request(url,data=data.encode())
    
    #使用opener发起请求
    rsp = opener.open(req)
    
def getHomePage():
    url = "http://www.renren.com/965187997/profile"
    
    #如果已经执行了login函数,则opener自动已经包含相应的cookie值
    rsp = opener.open(url)
    
    html = rsp.read().decode('utf-8')
    
    with open("rsp.html","w") as f:
        f.write(html)

if __name__ == "__main__":
    login()
    getHomePage()
    
#cookie作为一个变量,打印出来
# 利用CookieJar访问人人网
'''
自动使用cookie登录,大致流程是:
1.打开登录页面后自动通过用户名密码登录
2.自动提取反馈回来的cookie
3.利用提取的cookie登录隐私页面
'''
from urllib import request,parse
from http import cookiejar

#创建cookiejar的实例
cookie = cookiejar.CookieJar()

#生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)

#创建http请求管理器
http_handler = request.HTTPHandler()

#生成https管理器
https_handler = request.HTTPSHandler()
opener = request.build_opener(http_handler,https_handler,cookie_handler)

def login():
    '''
    负责初次登录
    需要输入用户名密码,用来获取登录cookie凭证
    '''
    # 此url需要从登录form的action属性中提取
    url = "http://www.renren.com/PLogin.do"
    
    # 此键值需要从登录form的两个对应input中提取name属性
    data = {
        "email":"13119144223",
        "password":"123456"
    }
    
    #把数据进行编码
    data = parse.urlencode(data)
    
    #创建一个请求对象
    req = request.Request(url,data=data.encode())
    
    #使用opener发起请求
    rsp = opener.open(req)
    
if __name__ == "__main__":
    '''
    执行完login之后,会得到授权之后的cookie凭证
    我们尝试把cookie打印出来
    '''
    login()
    print(cookie)
    for item in cookie:
        print(type(item))
        print(item)
        for i in dir(item):
            print(i)
# cookie的保存-FileCookieJar
#cookie作为一个变量,打印出来
# 利用FileCookieJar访问人人网
'''
自动使用cookie登录,大致流程是:
1.打开登录页面后自动通过用户名密码登录
2.自动提取反馈回来的cookie
3.利用提取的cookie登录隐私页面
'''
from urllib import request,parse
from http import cookiejar

#创建cookiejar的实例
filename = "cookie.txt"
cookie = cookiejar.MozillaCookieJar(filename)

#生成cookie的管理器
cookie_handler = request.HTTPCookieProcessor(cookie)

#创建http请求管理器
http_handler = request.HTTPHandler()

#生成https管理器
https_handler = request.HTTPSHandler()
opener = request.build_opener(http_handler,https_handler,cookie_handler)

def login():
    '''
    负责初次登录
    需要输入用户名密码,用来获取登录cookie凭证
    '''
    # 此url需要从登录form的action属性中提取
    url = "http://www.renren.com/PLogin.do"
    
    # 此键值需要从登录form的两个对应input中提取name属性
    data = {
        "email":"13119144223",
        "password":"123456"
    }
    
    #把数据进行编码
    data = parse.urlencode(data)
    
    #创建一个请求对象
    req = request.Request(url,data=data.encode())
    
    #使用opener发起请求
    rsp = opener.open(req)
    
    #保存cookie到文件
    #ignore_discard表示即使cookie将要被丢弃也要保存下来
    #ignore_expires表示如果该文件中cookie即使已经过期,保存
    cookie.save(ignore_discard=True,ignore_expires=True)
if __name__ == "__main__":
    '''
    执行完login之后,会得到授权之后的cookie凭证
    我们尝试把cookie打印出来
    '''
    login()

SSL(SercureSockrtLayer)

  • SSL证书就是指遵守SSL安全套接层协议的服务器数字证书
  • 美国网景公司开发
  • CA(CertifacateAuthority)是数字证书认证中心,是发放,管理,废除数字证书的收信人的第三方机构
  • 遇到不信任的SSL证书,需要单独处理
  • 忽略安全问题:

import ssl ssl.create_default_https_context =
ssl._create_unverified_context

JS加密

  • 有的反爬虫策略采用js对需要传输的数据进行加密处理(通常是取md5值)
  • 经过加密,传输的就是秘文,但是加密函数或者过程一定是在浏览器完成,也就是一定会把代码(js代码)暴露给使用者
  • 通过阅读加密算法,就可以模拟出加密过程,从而达到破解

ajax

  • 异步请求
  • 一定会有url,请求方法,可能有数据
  • 一般使用json格式
#爬取豆瓣电影剧情数据
from urllib import request
import json

url = 'https://movie.douban.com/j/chart/top_list?type=11&interval_id=100%3A90&action=&start=40&limit=20'

 #使用head方法伪装UA
headers = {}
headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11"

req = request.Request(url,headers=headers)
rsp = request.urlopen(req)
data = rsp.read().decode()

data = json.loads(data)

print(data)

Requests-献给人类

  • HTTP for Hunmans,更简洁友好
  • 继承了urllib的所有特征
  • 底层使用的是urllib3
  • 第三方,所以需要安装:pip install requests
  • get请求
    • requests.get(url)
    • requests.request(“get”,url)
    • 可以带有headers和params参数
  • post
    • rsp = requests.post(url,data=data)
    • data,headers要求dict类型
  • proxy
    • 代理有可能报错,如果使用人数多,考虑安全问题,可能会被强行关闭
import requests

url = "http://www.baidu.com"
# 两种请求方式
rsp = requests.get(url)
print(rsp.text)

rsp = requests.request("get",url)
print(rsp.text)
#get案例,使用参数headers和params参数,get返回内容
import requests

url = "http://www.baidu.com/s?"
kw = {
    "wd":"girl"
}

headers = {
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11"
}

rsp = requests.get(url,params=kw,headers=headers)

print(rsp.text)
print(rsp.content)
print(rsp.encoding)
# post案例,少了parse.urlencode(data),urlopen,read,decode
'''
利用parse模块模拟post请求
分析百度词典
分析步骤:
1. 打开F12
2. 尝试输入单词girl,发现每敲一个字母后都有请求
3. 请求地址是 http://fanyi.baidu.com/sug
4. 利用NetWork-All-Heards查看,发现FormDate的值是 kw:girl
5. 检查返回内容格式,发现返回的是json格式==》需要用到json包
'''
import requests
# 负责处理json格式的模块
import json
'''
大致流程是:
1. 利用data构造内容,然后urlopen打开
2. 返回一个json格式的结果
3. 结果就应该是girl的释义
'''

baseurl = "http://fanyi.baidu.com/sug"

# 存放用来模拟form的数据一定是dict格式
data = {
    #girl 是翻译输入的英文内容,应该是由用户输入,此处使用硬编码
    'kw':"girl"
}

headers = {
    #因为使用post模块对data进行编码,至少包含content-length字段
    'Content-Length': str(len(data))
}


req = requests.post(url=baseurl,data=data,headers=headers)

print(req.text)
print(req.json())
#proxy案例
import requests

if __name__ == "__main__":
    url = "http://www.baidu.com"
    
    #1.设置代理地址
    proxy = {'http':'101.4.136.34:81'}
    
    #2. 创建ProxyHandler
    proxy_handler = request.ProxyHandler(proxy)
    
    #3. 创建Opener
    opener = request.build_opener(proxy_handler)
    
    #4. 安装Opener
    request.install_opener(opener)
    
    #现在如果访问url,则使用代理服务器
#     rsp = requests.request("get",url,proxies=proxy)
    rsp = requests.get(url,proxies=proxy)
    print(rsp.text)

用户验证

  • 代理验证
    • 可能需要使用HTTP basic Auth,格式为:
      • 用户名:密码@代理地址:端口地址

proxy = {“http”:"tianhao:123456@“101.4.136.34:81”}
rsp = requests.get(“http://www.baidu.com”,proxies=proxy)

  • web客户端验证
    • 如果遇到web客户端验证,需要添加auth=(用户名,密码)

auth = (“text1”,“123456”) #授权信息
rsp = requests.get(“http://www.baidu.com”,auth=auth)

动态HTML

爬虫跟反爬虫

动态HTML介绍

  • JavaScript
  • jQuery
  • Ajax
  • DHTML
  • Python采集动态数据
    • 从JavaScript代码入手采集
    • Python第三方库运行JavaScript,直接采用你在浏览器看到的页面

Selenium + PhantomJS

  • Selenium: web自动化测试工具
    • 自动加载页面
    • 获取数据
    • 截屏
    • 安装:pip install selenium==2.48.0
  • PhantomJS(幽灵)
    • 基于Webkit 的无界面的浏览器
    • 安装:官网下载
  • Selenium 库有一个WebDriver的API
    • WebDriver可以跟页面上的元素进行各种交互,用它可以进行爬虫
#通过WebDriver操作
from selenium import webdriver

#通过Keys模拟键盘
from selenium.webdriver.common.keys import Keys

# 操作哪个浏览器就对哪个浏览器建一个实例
# 自动按照环境变量查找相应的浏览器
driver = webdriver.PhantomJS()
# 如果浏览器没有在相应环境变量中,需要指定浏览器位置

driver.get("http://www.baidu.com")

# 通过函数查找title标签
print("Title:{0}:".format(driver.title))

Chrome + Chromedriver(驱动)

- 下载安装Chrome
- 下载安装Chromedriver
  • Selenium操作主要分为两大类:
    • 得到UI元素

      • find_element_by_id
      • find_elemen_by_name
      • find_element_by_xpath
      • find_element_by_link_text
      • find_element_by_partial_link_text
      • find_element_by_tag_name
      • find_element_by_class_name
      • find_element_by_css_selector
    • 基于UI元素操作的模拟

      • 单击
      • 右键
      • 拖拽
      • 输入
      • 可以通过导入ActionChains类来做
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys

# 可能需要手动添加路径
driver = webdriver.Chrome()

url = "http://www.baidu.com"

driver.get(url)

text = driver.find_element_by_id("wrapper").text

print(text)
print(text.title)

# 得到页面的快照
driver.save_screenshot("index.png")

# id="kw"是百度的输入框,我们得到输入框的UI元素后直接输入大熊猫
driver.find_element_by_id("kw").send_keys(u"哈士奇")

# id="su"是百度搜索的按钮,click模拟点击
driver.find_element_by_id('su').click

time.sleep(5)
driver.save_screenshot("hashiqi.png")

# 获取当前页面的cookie
print(driver.get_cookies())

# 模拟输入两个按键 ctrl + a
driver.find_element_by_id("kw").send_keys(Keys.CONTROL,'a')
# ctrl + x ,是剪切快捷键
driver.find_element_by_id('kw').send_keys(Keys.CONTROL,'X')

driver.find_element_by_id('kw').send_keys(u'航空母舰')
driver.save_screenshot("hkmj.png")

driver.find_element_by_id('su').send_keys(Keys.RETURN)
time.sleep(5)

driver.save_screenshot("hkmj2.png")

# 清空输入框,clear
driver.find_element_by_id('kw').clear
driver.save_screenshot("clear.png")

# 关闭浏览器
driver.quit()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值