post 爬虫request_python爬虫

dbfd93f116d49d6a036b8f70bf91be05.png

一、概述

简介

  • 网络爬虫是一种按照一定的规则,自动地抓取信息的程序或脚本

特征

  • 能按要求下载数据或内容
  • 能自动在网络上流串

三大步骤

  • 下载网页
    • 获取网页地址
    • 模拟浏览器发起http请求
  • 提取正确的信息
    • 格式化数据
    • 非格式化数据
  • 根据一定规则自动跳转到另外的网页上执行上两部内容

分类

  • 通用爬虫
  • 专用爬虫

二、下载网页

  • 使用到的包
    • python3:urllib, urllib3, httplib2, requests

urllib使用

  • 包含模块
    • urllib.request:打开和读取urls
    • urllib.error:包含urllib.request产生的常见的错误(使用try可以捕捉)
    • urllib.parse:负责解析url的方法
    • urllib.rebotparse:解析robots.txt文件
  • 对网址进行编码
    • urllib.parse.urlencode({'key':'value})

urllib.request模块

  • 访问一个网页的方式
    • 打开URL地址
      • 简单的GET请求:urllib.request.urlopen(url, data)
      • 用于POST请求: urllib.request.Request(url, headers)
  • urlopen的返回对象
    • urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT, *, cafile=None, capath=None, cadefault=False, context=None)
    • 是一个类文件的对象,可以通过read方法、readline方法、read lines方法获取数据
      • rsp.read() 是一个byte类型的
      • rsp.read().decode() 需要进行解码
        • chardet:(第三方包,需要install)可以自动检测页面的编码格式,但是,可能有误
    • urlopen遇到301会自动跳转
    • urlopen返回对象包含的方法
      • geturl:返回请求对象的url
      • info:请求返回对象的meta信息
      • getcode:返回的http code
  • request.data的使用
    • 访问网络的两种方法
      • get
        • 利用url参数给服务器传递信息
        • 参数为dict,然后用parse编码
        • urlopen(url) data为None发起GET请求
      • post
        • post是把信息自动加密处理
        • 我们如果想使用post信息,需要用到data参数
        • 使用post,意味着http的请求头可能需要更改
          • content-type:application/x-www.form-urlencode
          • content-length:数据长度
          • 简而言之,一旦更改请求方法,请注意其他请求头部信息相适应
        • data参数需要编码,urllib.parse.urlencode(data)
        • 为了更多的设置请求信息,单纯的通过urlopen已经不满足需求
        • 需要利用request.Request类
          • request.Request(url, data=None, headers={})

urllib.error模块

  • urllib.error
    • URLError产生的原因:
      • 没网
      • 服务器链接失败
      • 不知道指定的服务器
    • HTTPError,是URLError的一个子类
      • HTTPError: Not Found
    • URLError和HTTPError区别
      • HTTPError是对应HTTP请求的返回码错误,如果返回错误码是400以上的,则引发HTTPError
      • URLError对应的是网络出现问题,包括url问题
      • 关系区别:OSError--URLError--HTTPError

urllib.request高级

  • 上面都是最简单的爬虫使用,随着反爬虫的出现以及对爬虫的要求增多,需要去了解更多高级的功能
  • UserAgent(让服务器把爬虫当作浏览器)
    • 用户代理;属于headers的一部分,服务器通过UA来判断访问者的身份
    • 常见的UA值,使用的时候可以直接复制,也可以用浏览器访问的时候抓包
    • 两种方法添加:
      • urllib.request.Request("http://www.baidu.com", headers = {"User-Agent": "xxx"} )
      • urllib.request.Request.add_header() 添加/修改一个特定的header
  • 一直在使用urlopen,它是一个特殊的opener,不支持代理、cookie等其他的HTTP/HTTPS高级功能,所有要支持这些功能:
    • 1.使用相关的Handler处理器来创建特定功能的处理器对象;
    • 2.然后通过urllib2.build_opener()方法使用这些处理器对象,创建自定义opener对象;
    • 3.使用自定义的opener对象,调用open()方法发送请求
    • ps:如果程序里所有的请求都使用自定义的opener,可以使用urllib2.install_open()将自定义的opener对象定义为全局opener
  • ProxyHandler(代理服务器)
    • 使用代理IP,是爬虫的常用手段
    • 获取代理服务器的地址:
      • http://www.goubanjia.com
    • 代理用来隐藏真实访问客户端,代理也不允许频繁访问某一个固定网站,所以代理一定要很多
    • 使用步骤
      • 设置代理地址
      • 创建ProxyHandler
        • httpproxy_handler = urllib.request.ProxyHandler({"https": "27.191.234.69:9999"})
      • 创建Opener
        • opener = urllib.request.build_opener(httpproxy_handler)
      • 应用代理
        • response = opener.open(request) #只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理
        • urllib.request.install_opener(opener) #将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理
  • cookie & session
    • 初始于http协议的无状态特性,为了弥补这个缺陷,所以采用了一个补充协议
    • cookie是服务器发放给用户的一段信息,session是保存在服务器上的对应的另一半信息,用来记录用户信息
    • 二者区别
      • 存放位置不同
      • cookie不安全,主要用来做用户验证
      • session会保存着服务器上(一般是放在内存中或者数据库中),会过期
      • 单个cookie保存数据不超过4k,很多浏览器限制一个站点最多保存20个
    • 使用cookie登录
      • 手动 req = request.Request(url, headers=headers)
      • 自动
        • 模块
          • CookieJar
          • 管理存储cookie,向传出的http请求添加cookie,cookie存储在内存中
          • FileCookieJar(filename, delayload=None, policy=None)
          • 使用文件管理cookie,filename是保存cookie的文件
          • MozillaCookieJar(filename, delayload=None, policy=None)
          • 创建与mozilla浏览器兼容的FileCookieJar实例
          • LwpCookieJar
          • 创建与libwww-perl标准兼容的Set-Cookie3格式的FileCookieJar实例
          • CookieJar -> FileCookieJar -> MozillaCookieJar & LwpCookieJar
        • 使用方法
          • 创建cookie对象
          • cookie = cookiejar.CookieJar()
          • 创建cookie_handler
          • cookie_handler = request.HTTPCookieProcessor(cookie)
          • 创建opener
          • opener = request.build_opener(cookie_handler)
          • cookie作为一个变量,包含属性
        • name:名称
        • value:值
        • domain:可以访问此cookie的域名
        • path:
        • expires:过期时间
        • size:大小
        • Http字段 - cookie 保存
        • cookie = cookiejar.FileCookieJar('cookie.txt')
        • cookie.save(ignore_discard=True, ignore_expires=True) 保存cookie到文件,文件名叫cookie.txt
        • 需要在opener.open()后执行,即相当于要在打开网页的时候获取 - cookie 读取
        • cookie.load(cookie_file, ignore_discard=True, ignore_expires=True)
  • SSL
    • SSL 是指安全套接字层,简而言之,它是一项标准技术,可确保互联网连接安全,保护两个系统之间发送的任何敏感数据,防止网络犯罪分子读取和修改任何传输信息,包括个人资料
    • SSL 证书安装在服务器上
    • 单独处理SSL证书,让程序忽略SSL证书验证错误
  • js加密
    • 参考 https://my.oschina.net/u/4004713/blog/3067132
    • 是一种反爬措施
    • 经过加密传输的就是密文,但是加密函数或者过程一定是在浏览器完成,也就是一定会把js代码暴露给使用者
    • 怎样判断网站有没有使用js加密
      • 在请求中,找到Form Data,可以看到有salt和sign
      • 最初的账号密码明文传输--->对其进行md5加密--->对其进行加盐
    • 加盐原理
      • 在密码任意固定位置插入特定的字符串,使得进行MD5计算结果和原始密码的MD5结果不同
      • 加盐的关键是如何选择盐
  • ajax
    • 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值