python爬虫系列4--requests

+ Requests是用Python语言编写,基于 urllib,采用 Apache2 Licensed开源协议的HTTP库。它比 urllib更加方便,可以节约我们大量的工作,完全满足HTTP测试需求。Requests的哲学是以PEP20的习语为中心开发的,所以它比urllib更加 Pythoner。更重要的一点是它支持 Python3。

Requests使用的是urllib3,因此继承了它的所有特性。Requests支持HTTP连接保持和连接池,支持使用 cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的URL和POST数据自动编码。

中文文档链接:http://docs.python-requests.org/zh_CN/latest/index.html

+ 发送请求

r = requests.get(url_xxx)返回一个Response对象,包含需要的信息

r = requests.post('http://httpbin.org/post', data = {'key':'value'})

Requests简便的API意味着所有HTTP请求类型都是显而易见的,例如put、delete、head、options

+ 传递url参数

payload = {'key1': 'value1', 'key2': 'value2'}

r = requests.get("http://httpbin.org/get", params=payload)访问的是诸如 http://httpbin.org/get?key2=value2&key1=value1的链接

+ r.text,Requests 会自动解码来自服务器的内容。大多数 unicode 字符集都能被无缝地解码。请求发出后,Requests 会基于 HTTP 头部对响应的编码作出有根据的推测。当你访问 r.text 之时,Requests 会使用其推测的文本编码。你可以找出 Requests使用了什么编码,并且能够使用 r.encoding 属性来改变它。

+ r.content访问二进制响应内容,Requests 会自动为你解码 gzip 和 deflate 传输编码的响应数据。

+ r.json(),Requests 中也有一个内置的 JSON 解码器,助你处理 JSON 数据:r.json()

+ r.raw,获取来自服务器的原始套接字响应

+ 定制请求头,如果你想为请求添加 HTTP 头部,只要简单地传递一个dict给 headers 参数就可以了。Requests不会基于定制header的具体情况改变自己的行为。

+ 检测响应状态码,r.status_code,如果发送了一个错误请求(一个 4XX 客户端错误,或者 5XX 服务器错误响应),我们可以通过 Response.raise_for_status() 来抛出异常

+ 响应头,r.headers

+ 访问cookie,r.cookies['example_cookie_name'],要想发送你的cookie到服务器,r=requests.get(url,cookies=cookies)

+ 重定向与请求历史 默认情况下,除了 HEAD, Requests 会自动处理所有重定向,Response.history 是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序

+ 超时处理,你可以告诉 requests 在经过以 timeout 参数设定的秒数时间之后停止等待响应。基本上所有的生产代码都应该使用这一参数。如果不使用,你的程序可能会永远失去响应

+ requests库的session会话对象可以跨请求保持某些参数,说白了,就是比如你使用session成功的登录了某个网站,则在再次使用该session对象求求该网站的其他网页都会默认使用该session之前使用的cookie等参数

+ 相比urllib.request使用起来的优点:

(1)不用手工设置解码,自动推断网页编码方式

(2)各种网页访问方法清晰明了

+ requests + re + bs4 爬取百度贴吧图片实例源码


import re,requests

from bs4 import BeautifulSoup


headers = {

# 'Host': 'i.meizitu.net',

'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',

'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36 OPR/52.0.2871.64',

'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',

'Connection': 'keep-alive',

'Accept-Encoding':'gzip, deflate',

'Upgrade-Insecure-Requests':'1'

} # 请求头,蛇无头不行,带上吧,后面会讲到用Cookie实现单账号免密登录


s = requests.session() # 保留会话


def re_test(text):

'''

:param text: 网页源文件

:return: 返回图片的链接

'''

# https://imgsa.baidu.com/forum/w%3D580/sign=20bec30aa0ec8a13141a57e8c7029157/2508562c11dfa9ecfd81b1f26bd0f703938fc180.jpg

img_url = re.findall('https://imgsa.baidu.com/forum/.*?jpg',text)

return img_url


def bs_test(text):

'''

:param text: 网页源文件

:return: 返回图片的链接

'''

# <img class="BDE_Image" src="https://imgsa.baidu.com/forum/w%3D580/sign=44312fe1a5af2eddd4f149e1bd110102/1c3477094b36acaf1ce5c71b75d98d1000e99c2f.jpg" size="201260" width="479" height="852">

soup = BeautifulSoup(text, "lxml")

img_urls = soup.find_all('img',{'class':'BDE_Image'})

img_url = [i.get('src') for i in img_urls]

return img_url


def img_size(content):

# 熟悉下面这个图片处理库,对于验证码处理和AI有很大帮助哦。

from PIL import Image

from io import BytesIO

img = Image.open(BytesIO(content))

# width,height = img.size # 获取图片大小,更改图片大小,拼接照片墙自己先试试

return img.size


def save_img(url):

'''

:param url: 图片地址

:return: 木有返回值

'''

img_name = url.strip().split('/')[-1]

print(img_name)

url_re = s.get(url.strip(),headers=headers)

if url_re.status_code == 200: # 200是http响应状态

# print('准备保存')

import os

if not os.path.exists('baidu_img'): # 没有文件夹,则创建文件夹

os.mkdir('baidu_img')

if img_size(url_re.content)[0] > 400 and img_size(url_re.content)[1] > 600: # 图片宽*高大于400*600像素才保存

print('尺寸不错,留下了')

open('baidu_img/' + img_name, 'wb').write(url_re.content)



if __name__ == '__main__':

for i in range(2) : # 用2页测试一下

url = 'https://tieba.baidu.com/p/5033202671?pn='+str(i+1) # 构造和Page相关的链接

req_text = s.get(url).text

# print(re_test(req_text)) # 正则

# urls = re_test(req_text)

# print(bs_test(req_text)) # BS

urls = bs_test(req_text)

for img_url in re_test(req_text): # 采用正则获取图片链接

save_img(img_url)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值