python爬虫-requests初步学习


Fiddler这玩意怎么用,用起来没有chrome舒服啊


Requests库的七个主要方法:
requests.request():构造一个请求,支撑一下各方法的基础方法----我的理解是下面六种方法的另一种写法:requests.request(method,url,**kwargs)
requests.get():获取HTML网页的主要方法,对应HTTP的GET
requests.head():获取HTML网页头的信息方法,对应HTTP的HEAD
requests.post():向HTML网页提交POST请求方法,对应HTTP的POST
requests.put():向HTML网页提交PUT请求的方法,对应HTTP的RUT
requests.patch():向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete():向HTML页面提交删除请求,对应HTTP的DELETE


URL是通过HTTP协议存取资源的Internet路径,一个URL对应一个数据资源。
URL格式:http://host[:port][path]
host:合法的Internet主机域名或IP地址
port:端口号,缺省端口为80
path:请求资源的路径

def request(self, method, url,
params=None, data=None, headers=None, cookies=None, files=None,
auth=None, timeout=None, allow_redirects=True, proxies=None,
hooks=None, stream=None, verify=None, cert=None, json=None):
各种方法的参数**kwargs:控制访问的参数,均为可选项:
params:字典或字节序列,作为参数增加到url中----------GET方法的数据传输:---那么所谓的字节序列是指????
data:字典,字节序列或文件对象,作为Request的内容--------POST方法的数据传输,不仅可以发送字典,应该也可以发送json字符串?
json:JSON格式的数据,作为Request的内容
headers:字典,HTTP定制头(模拟浏览器进行访问)
cookies:字典或CpplieJar,Request中的cookie #这个经过测试,貌似不是请求头里的cookies,而是响应头的cookies:同一个url,使用session连续访问2次,第一次有cookies,第二次没有;也就是说只会储存新的cookies????
auth:元祖,支持HTTP认证功能
files:字典类型,传输文件
timeout:设定超时时间,秒为单位
proxies:字典类型,设定访问代理服务器,可以增加登陆认证
allow_redirects:True//False,默认为True,重定向开关
stream:True/False,默认为True,获取内容立即下载开关
verify:True/False,默认为True,认证SSL证书开关
cert:本地SSL证书路径"""

Response对象的属性及方法
r.status_code #响应状态码
r.raw #返回原始响应体,也就是 urllib 的 response 对象,使用 r.raw.read() 读取
r.content #字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
r.text #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
r.headers #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
r.requests.headers #可以查看请求头的内容
r.encoding来获取网页编码
r.history查看是否有跳转记录
#*特殊方法*#
r.json() #Requests中内置的JSON解码器
r.raise_for_status() #失败请求(非200响应)抛出异常


上传文件
url = 'http://127.0.0.1:5000/upload'
files = {'file': open('/home/lyb/sjzl.mpg', 'rb')}
#files = {'file': ('report.jpg', open('/home/lyb/sjzl.mpg', 'rb'))} #显式的设置文件名
r = requests.post(url, files=files)
可以把字符串当做文件上传
url = 'http://127.0.0.1:5000/upload'
files = {'file': ('test.txt', b'Hello Requests.')} #必需显式的设置文件名

r = requests.post(url, files=files)


基本身份认证(HTTP Basic Auth)这个暂时还没碰到需求
import requests
from requests.auth import HTTPBasicAuth
r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=HTTPBasicAuth('user', 'passwd'))
# r = requests.get('https://httpbin.org/hidden-basic-auth/user/passwd', auth=('user', 'passwd')) # 简写

另一种非常流行的HTTP身份认证形式是摘要式身份认证,Requests对它的支持也是开箱即可用的:
requests.get(URL, auth=HTTPDigestAuth('user', 'pass'))

会话对象让你能够跨请求保持某些参数,最方便的是在同一个Session实例发出的所有请求之间保持cookies,且这些都是自动处理的,甚是方便。
这里未复制实例

https://www.cnblogs.com/puyangsky/p/5326384.html
通过chrome检查浏览器登录知乎时,需要提交数据的参数有四个分别是:_xsrf、password、remember_me和email
XSRF为跨站请求伪造(Cross-site request forgery)这个参数目的就是为了防范XSRF攻击而设置的一个hash值,每次访问主页都会生成这样一个唯一的字符串。
经过代码查看,每次访问知乎首页都会有一个隐藏的input标签,name=_xsrf

所以登录知乎,第一次先去获取_xsrf的值,第二次访问登录的url,同时提交数据

import requests
import re

def getContent(url):
  #使用requests.get获取知乎首页的内容
    r = requests.get(url)
  #request.get().content是爬到的网页的全部内容
    return r.content

#获取_xsrf标签的值
def getXSRF(url):
  #获取知乎首页的内容
    content = getContent(url)
  #正则表达式的匹配模式
    pattern = re.compile('.*?<input type="hidden" name="_xsrf" value="(.*?)"/>.*?')
  #re.findall查找所有匹配的字符串
    match = re.findall(pattern, content)
    xsrf = match[0]
  #返回_xsrf的值
    return xsrf

#登录的主方法
def login(baseurl,email,password):
  #post需要的表单数据,类型为字典
    login_data = {
            '_xsrf': getXSRF(baseurl),
            'password': password,
            'remember_me': 'true',
            'email': email,
    }
  #设置头信息
    headers_base = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, sdch',
        'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2',
        'Connection': 'keep-alive',
        'Host': 'www.zhihu.com',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/43.0.2357.130 Safari/537.36', 
        'Referer': 'http://www.zhihu.com/',
    }
  #使用seesion登录,这样的好处是可以在接下来的访问中可以保留登录信息
    session = requests.session()
  #登录的URL
    baseurl += "/login/email"
  #requests 的session登录,以post方式,参数分别为url、headers、data
    content = session.post(baseurl, headers = headers_base, data = login_data)
  #成功登录后输出为 {"r":0,
  #"msg": "\u767b\u9646\u6210\u529f"
  #}
    print content.text
  #再次使用session以get去访问知乎首页,一定要设置verify = False,否则会访问失败
    s = session.get("http://www.zhihu.com", verify = False)
    print s.text.encode('utf-8')
  #把爬下来的知乎首页写到文本中
    f = open('zhihu.txt', 'w')
    f.write(s.text.encode('utf-8'))

url = "http://www.zhihu.com"
#进行登录,将星号替换成你的知乎登录邮箱和密码即可
login(url,"******@***.com","************")
python requests模拟登录知乎


这个网址的整理了一半
https://www.cnblogs.com/mrchige/p/6409444.html

猜你喜欢

转载自www.cnblogs.com/AllenWoo/p/9493735.html