python学习-第30课-爬虫

一、requests模块

1.1.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")

1.2. 传递参数

1.2.1.get方式

params = {'key1': 'hello', 'key2': 'world'}
url = 'https://www.jd.com'
r = requests.get(url=url, params=params)
print(r.url)

结果为:

https://www.jd.com/?key1=hello&key2=world

1.2.2.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"
}

1.3.响应http的请求

import requests
url="https://www.qiushibaike.com/"
header={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"}
r=requests.get(url=url,headers=header)
print(r.request)
print(r.headers)
print(r.encoding)
print(r.cookies)
print(r.url)
print(r.status_code)#状态码
print(type(r.text))          
print(type(r.content))

Requests中text和content的区别是什么
r.text返回的是str类型的数据。
r.content返回的是bytes型也就是二进制的数据。
也就是说,如果你想取文本,可以通过r.text。
如果想取图片,文件,则可以通过r.content。

1.4.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)

import requests
url="https://www.qiushibaike.com/"
#添加自定义的请求头信息
header={"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"}
r=requests.get(url=url,headers=header)  #通过headers=header将自定义的请求头信息添加到请求信息中

print(type(r.text))
print(r.headers)

可以通过定义一个list,然后通过random模块随机取一个header信息进行访问,防止反爬虫的操作。

1.5.Request的会话对象

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

所有一次会话的信息都保存在server服务端,只需要对server服务端进行操作就可以了。
s.get(url)
 

1.6.cookie信息

1.6.1.Cookie的五要素:


Name   value   domain   path  expires

import requests

def save_cookie():
    s = requests.session()
    s.get('https://www.hao123.com/')
    print(s.cookies)

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()

1.6.2.Cookie的常用属性:

Cookie常用的一些属性:
1. Domain  域
2. Path       路径
3. Expires  过期时间
4. name    对应的key值
5. value        key对应的value值
cookie中的domain代表的是cookie所在的域,默认情况下就是请求的域名,例如请求http://www.server1.com/files/hello, 那么响应中的set-Cookie默认会使用www.server1.com作为cookie的domain,在浏览器中也是按照domain来组织cookie的。 我们可以在响应中设置cookie的domain为其他域,但是浏览器并不会去保存这些domain为其他域的cookie。
cookie中的path能够进一步的控制cookie的访问,当path=/; 当前域的所有请求都可以访问到这个cookie。 如果path设为其他值,比如path=/test,那么只有/test下面的请求可以访问到这个cookie。

1.6.3.使用已知cookie信息,如何访问网站

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

1.6.4.代理访问

代理访问:
采集时为避免被封IP,经常会使用代理。requests也有相应的proxies属性。
西刺代理(http://www.xicidaili.com/)

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)

如果代理需要账户和密码,则需这样:

proxies = {
    "http": "http://user:pass@10.10.1.10:3128/",
}

1.6.5.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)

1.7.总结

Requests给你提供的所有接口,在传输数据的时候,都可以以key:value的形式进行传输,这个也是我为什么特别喜欢使用requests的原因

如果你使用urllib,那么你就没有这么幸运了,很多事情都需要你自己去处理,并不可以直接通过dict的形式进行传输,需要进行装换

二、Urllib模块

2.1.在python2和python3中的差异

在python2中,urllib和urllib2各有各个的功能,虽然urllib2是urllib的升级版,但是urllib2还是不能完全替代urllib,但是在python3中,全部封装成一个类,urllib

2.2.python2中urllib2和urllib的区别

Urllib2可以接受一个Request对象,并以此可以来设置一个URL的headers,但是urllib只接受一个URL。这就意味着你不能通过urllib伪装自己的请求头。
Urllib模板可以提供运行urlencode的方法,该方法用于GET查询字符串的生成,urllib2的不具备这样的功能,而且urllib.quote等一系列quote和unquote功能没有被加入urllib2中,因此有时也需要urllib的辅助。这就是urllib和urllib2一起使用的原因.
quote用来url转码的

import urllib,urllib2
url="http://www.baidu.com"
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/60.0",
    "Host":"www.baidu.com"
}

data={"k1":"v1","k2":"v2"}
data=urllib.urlencode(data)#http在授受请求时只接受以字符串格式的数据
print(data)
response=urllib2.Request(url=url,headers=headers,data=data)

2.3.python3和python2编码及传参区别

'''
python3
data=urlib.parse.urlencode(data)
urllib.request.Request(url,data)

python2
data=urllib.urlencode(data)
urllib.Reqeuset(url.data)
'''
import urllib
from urllib import parse
from urllib.request import Request

url="http://www.baidu.com"
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/60.0",
    "Host":"www.baidu.com"
}

data={"k1":"v1","k2":"v2"}
data=parse.urlencode(data)
print(data)
response=Request(url=url,headers=headers,data=data)

2.4.http的头信息传输

http的头信息可以直接使用字典的形式进行传输

import urllib.request
urllib.request.Request(url, data=None, headers = {}, method= None)

headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) '
                    'Chrome/45.0.2454.85 Safari/537.36 115Browser/6.0.3',
      'Referer': 'http://www.lagou.com/zhaopin/Python/?labelWords=label',
      'Connection': 'keep-alive'
 }

2.5.data参数传输

Request如果要发送data,并无法直接传入字典类型的参数,需要进行数据转换,你可以直接使用类似于get传出参数的方法,也可以使用urllib给我们提供的类

from urllib import request, parse
data = {
    'first': 'true',
    'pn': 1,
    'kd': 'Python'
}
data = parse.urlencode(data).encode('utf-8')
print(data)

结果:
b'first=true&pn=1&kd=Python‘
urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None)
urlencode()主要作用就是将url附上要提交的数据。Post的数据必须是bytes或者iterable of bytes,不能是str,因此需要进行encode()编码

2.6.打开网站

urllib.request.urlopen(url, data=None, timeout=None)

url    需要打开的网站
data    psot提交的数据
Timeout       网站访问的超时时间

但是没法伪装我们的头信息
from urllib import request
req = request.Request(url, headers=headers, data=data)
html = request.urlopen(req).read()
 

2.7.requests模块和urllib模块使用

2.7.1.使用requests爬图片和视频

官网学习网站:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html

示例:下载图片

import codecs

import requests

url="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1529385351638&di=f4693b8440f472950d15670a77a4788f&imgtype=0&src=http%3A%2F%2Fpic35.photophoto.cn%2F20150402%2F0011024033183316_b.jpg"
res=requests.get(url=url,stream=True)
with codecs.open("fj.jpg","wb") as f:
    for chunk in res.iter_content(10000):
        f.write(chunk)

2.7.2.使用urllib爬图片和视频

使用urllib爬数据时,可以通过以下两种方法

方法1:通过request.urlretrieve访问下载数据

示例:

import urllib
from urllib.request import Request
from urllib import request

url="https://cloud.video.taobao.com/play/1u/2074441006/p/1/e/6/t/1/50166326429.mp4"
request.urlretrieve(url,"hd.mp4")

方法2:通过urlopen方法

示例

from urllib import request

url = "http://inews.gtimg.com/newsapp_match/0/2711870562/0"
req = request.Request(url)
res = request.urlopen(req)
text = res.read()
with open("2.jpg", "wb") as f:
    f.write(text)

2.8.urllib的代理

from urllib import request, parse

data = {
        'first': 'true',
        'pn': 1,
        'kd': 'Python'
    }
url = 'http://2017.ip138.com/ic.asp'

proxy = request.ProxyHandler({'http': '112.95.61.146:8118'})  # 设置proxy
opener = request.build_opener(proxy)  # 挂载opener
# opener = request.build_opener()  # 挂载opener
request.install_opener(opener)  # 安装opener
data = parse.urlencode(data).encode('utf-8')
page = opener.open(url, data).read()
print(type(page))
print(page.decode("gbk"))

结果:<body style="margin:0px"><center>您的IP是:[112.95.61.146] 来自:广东省深圳市 联通</center></body></html>

转载于:https://my.oschina.net/u/3865353/blog/1831059

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值