urllib提供了一系列用于操作URL的功能。通过urllib我们可以很方便的抓取网页内容。

    抓取网页内容

    1. import urllib.request
    2. url = 'https://api.douban.com/v2/book/2129650'
    3. with urllib.request.urlopen(url) as f:
    4. headers = f.getheaders() # 报文头部
    5. body = f.read() # 报文内容
    6. print(f.status, f.reason) # 打印状态码、原因语句
    7. for k,v in headers:
    8. print(k + ': ' + v)
    9. print(body.decode('utf-8'))

    抓取百度搜索图片

    1. import urllib.request
    2. import os
    3. import re
    4. import time
    5. url=r'http://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=result&fr=&sf=1&fmq=1488722322213_R&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E5%A3%81%E7%BA%B8%E5%B0%8F%E6%B8%85%E6%96%B0&f=3&oq=bizhi%E5%B0%8F%E6%B8%85%E6%96%B0&rsp=0'
    6. imgPath=r'E:\img'
    7. if not os.path.isdir(imgPath):
    8. os.mkdir(imgPath)
    9. imgHtml=urllib.request.urlopen(url).read().decode('utf-8')
    10. #test html
    11. #print(imgHtml)
    12. urls=re.findall(r'"objURL":"(.*?)"',imgHtml)
    13. index=1
    14. for url in urls:
    15. print("下载:",url)
    16. #未能正确获得网页 就进行异常处理
    17. try:
    18. res=urllib.request.urlopen(url)
    19. if str(res.status)!='200':
    20. print('未下载成功:',url)
    21. continue
    22. except Exception as e:
    23. print('未下载成功:',url)
    24. filename=os.path.join(imgPath,str(time.time()) + '_' + str(index)+'.jpg')
    25. with open(filename,'wb') as f:
    26. f.write(res.read())
    27. print('下载完成\n')
    28. index+=1
    29. print("下载结束,一共下载了 %s 张图片"% (index-1))

    python2.7的用户需要把urllib.request替换成urllib

    批量下载图片

    1. # coding: utf-8
    2. import os,urllib.request
    3. url_path = 'http://www.ruanyifeng.com/images_pub/'
    4. imgPath=r'E:\img'
    5. if not os.path.isdir(imgPath):
    6. os.mkdir(imgPath)
    7. index=1
    8. for i in range(1,355):
    9. url = url_path + 'pub_' + str(i) + '.jpg'
    10. print("下载:",url)
    11. try:
    12. res = urllib.request.urlopen(url)
    13. if(str(res.status) != '200'):
    14. print("下载失败:", url)
    15. continue
    16. except:
    17. print('未下载成功:',url)
    18. filename=os.path.join(imgPath,str(i)+'.jpg')
    19. with open(filename,'wb') as f:
    20. f.write(res.read())
    21. print('下载完成\n')
    22. index+=1
    23. print("下载结束,一共下载了 %s 张图片"% (index-1))

    模拟GET请求附带头信息

    urllib.request.Request实例化后有个add_header()方法可以添加头信息。

    1. # coding: utf-8
    2. import urllib.request
    3. url = 'http://www.douban.com/'
    4. req = urllib.request.Request(url)
    5. req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
    6. with urllib.request.urlopen(req) as f:
    7. headers = f.getheaders()
    8. body = f.read()
    9. print(f.status, f.reason)
    10. for k,v in headers:
    11. print(k + ': ' + v)
    12. print(body.decode('utf-8'))

    这样会返回适合iPhone的移动版网页。

    发送POST请求

    urllib.request.urlopen()第二个参数可以传入需要post的数据。

    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3. import json
    4. from urllib import request
    5. from urllib.parse import urlencode
    6. #----------------------------------
    7. # 手机号码归属地调用示例代码 - 聚合数据
    8. # 在线接口文档:http://www.juhe.cn/docs/11
    9. #----------------------------------
    10. def main():
    11. #配置您申请的APPKey
    12. appkey = "*********************"
    13. #1.手机归属地查询
    14. request1(appkey,"GET")
    15. #手机归属地查询
    16. def request1(appkey, m="GET"):
    17. url = "http://apis.juhe.cn/mobile/get"
    18. params = {
    19. "phone" : "", #需要查询的手机号码或手机号码前7位
    20. "key" : appkey, #应用APPKEY(应用详细页查询)
    21. "dtype" : "", #返回数据的格式,xml或json,默认json
    22. }
    23. params = urlencode(params).encode('utf-8')
    24. if m =="GET":
    25. f = request.urlopen("%s?%s" % (url, params))
    26. else:
    27. f = request.urlopen(url, params)
    28. content = f.read()
    29. res = json.loads(content.decode('utf-8'))
    30. if res:
    31. error_code = res["error_code"]
    32. if error_code == 0:
    33. #成功请求
    34. print(res["result"])
    35. else:
    36. print("%s:%s" % (res["error_code"],res["reason"]) )
    37. else:
    38. print("request api error")
    39. if __name__ == '__main__':
    40. main()

    Requests

    虽然Python的标准库中urllib2模块已经包含了平常我们使用的大多数功能,但是它的API使用起来让人实在感觉不好。它已经不适合现在的时代,不适合现代的互联网了。而Requests的诞生让我们有了更好的选择。

    正像它的名称所说的,HTTP for Humans,给人类使用的HTTP库!在Python的世界中,一切都应该简单。Requests使用的是urllib3,拥有了它的所有特性,Requests 支持 HTTP 连接保持和连接池,支持使用 cookie 保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。现代、国际化、人性化。

    官网:http://python-requests.org/
    文档:
    Github主页:https://github.com/kennethreitz/requests

    需要先安装:

    1. $ pip3 install requests
    2. Collecting requests
    3. Downloading requests-2.13.0-py2.py3-none-any.whl (584kB)
    4. 100% |████████████████████████████████| 593kB 455kB/s
    5. Installing collected packages: requests
    6. Successfully installed requests-2.13.0

    请求示例

    1. #!/usr/bin/python
    2. # -*- coding: utf-8 -*-
    3. import requests
    4. url = 'https://api.github.com/user'
    5. # r = requests.request('get', url, auth=('52fhy', ''))
    6. r = requests.get(url, auth=('', ''))
    7. print('Status: %s' % r.status_code) # 状态码
    8. # 头信息
    9. for k,v in r.headers.items():
    10. print(k + ': ' + v)
    11. print('encoding: ' , r.encoding)
    12. print('body: ' , r.text)
    13. print('json body: ' , r.json())

    POST请求

    基于表单的:

    1. # coding: utf-8
    2. import requests
    3. payload = {'name': 'python', 'age': '11'}
    4. r = requests.post("http://httpbin.org/post", data=payload)
    5. print(r.text)

    基于text的:

    1. # coding: utf-8
    2. import requests,json
    3. payload = {'name': 'python', 'age': '11'}
    4. r = requests.post("https://api.github.com/some/endpoint", data=json.dumps(payload))
    5. print(r.text)

    hashlib

    1. import hashlib
    2. md5 = hashlib.md5()
    3. md5.update('how to use md5 in python hashlib?'.encode('utf-8'))
    4. print(md5.hexdigest())

    结果如下:

    1. d26a53750bc40b38b65a520292f69306

    update(),用于将内容分块进行处理,适用于大文件的情况。示例:

    1. import hashlib
    2. def get_file_md5(f):
    3. m = hashlib.md5()
    4. while True:
    5. data = f.read(10240)
    6. if not data:
    7. break
    8. m.update(data)
    9. return m.hexdigest()
    10. with open(YOUR_FILE, 'rb') as f:
    11. file_md5 = get_file_md5(f)

    对于普通字符串的md5,可以封装成函数:

    1. def md5(string):
    2. import hashlib

    SHA1

    1. import hashlib
    2. sha1 = hashlib.sha1()
    3. sha1.update('py'.encode('utf-8'))
    4. sha1.update('thon'.encode('utf-8'))
    5. print(sha1.hexdigest())

    等效于:

    1. hashlib.sha1('python'.encode('utf-8')).hexdigest()

    SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。

    此外,hashlib还支持sha224, sha256, , sha512

    Base64是一种用64个字符来表示任意二进制数据的方法。Python内置的base64可以直接进行base64的编解码:

    1. >>> import base64
    2. >>> base64.b64encode(b'123')
    3. b'MTIz'
    4. >>> base64.b64decode(b'MTIz')
    5. b'123'

    由于标准的Base64编码后可能出现字符+/,在URL中就不能直接作为参数,所以又有一种”url safe”的base64编码,其实就是把字符+/分别变成-_

    1. >>> base64.b64encode(b'i\xb7\x1d\xfb\xef\xff')
    2. b'abcd++//'
    3. >>> base64.urlsafe_b64encode(b'i\xb7\x1d\xfb\xef\xff')
    4. b'abcd--__'
    5. >>> base64.urlsafe_b64decode('abcd--__')
    6. b'i\xb7\x1d\xfb\xef\xff'

    时间日期

    该部分在前面的笔记里已做详细介绍:

    1. # coding:utf-8
    2. import time
    3. # 获取时间戳
    4. timestamp = time.time()
    5. print(timestamp)
    6. # 格式时间
    7. print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()))
    8. # 返回当地时间下的时间元组t
    9. print(time.localtime())
    10. # 将时间元组转换为时间戳
    11. print(time.mktime(time.localtime()))
    12. t = (2017, 2, 11, 15, 3, 38, 1, 48, 0)
    13. print(time.mktime(t))
    14. # 字符串转时间元组:注意时间字符串与格式化字符串位置一一对应
    15. print(time.strptime('2017 02 11', '%Y %m %d'))
    16. # 睡眠
    17. print('sleeping...')
    18. time.sleep(2) # 睡眠2s
    19. print('sleeping end.')

    输出:

    datetime

    方法概览:

    1. datetime.now() # 当前时间,datetime类型
    2. datetime.timestamp() # 时间戳,浮点类型
    3. datetime.strftime('%Y-%m-%d %H:%M:%S') # 格式化日期对象datetime,字符串类型
    4. datetime.strptime('2017-2-6 23:22:13', '%Y-%m-%d %H:%M:%S') # 字符串转日期对象
    5. datetime.fromtimestamp(ts) # 获取本地时间,datetime类型
    6. datetime.utcfromtimestamp(ts) # 获取UTC时间,datetime类型

    示例:

    1. # coding: utf-8
    2. from datetime import datetime
    3. import time
    4. now = datetime.now()
    5. print(now)
    6. # datetime模块提供
    7. print(now.timestamp())
    1. 2017-02-06 23:26:54.631582
    2. 1486394814.631582

    小数位表示毫秒数。

    PIL(Python Imaging Library)已经是Python平台事实上的图像处理标准库了。PIL功能非常强大,但API却非常简单易用。

    安装:

    1. $ pip install Pillow
    2. Collecting Pillow
    3. Downloading Pillow-4.0.0-cp34-cp34m-win32.whl (1.2MB)
    4. Successfully installed Pillow-4.0.0

    图像缩放:

    1. # coding: utf-8
    2. from PIL import Image
    3. im = Image.open('test.jpg')
    4. print(im.format, im.size, im.mode)
    5. im.thumbnail((200, 100))
    6. im.save('thumb.jpg', 'JPEG')

    模糊效果:

    1. # coding: utf-8
    2. from PIL import Image,ImageFilter
    3. im = Image.open('test.jpg')
    4. im2 = im.filter(ImageFilter.BLUR)
    5. im2.save('blur.jpg', 'jpeg')

    验证码:

    1. from PIL import Image, ImageDraw, ImageFont, ImageFilter
    2. import random
    3. # 随机字母:
    4. def rndChar():
    5. return chr(random.randint(65, 90))
    6. # 随机颜色1:
    7. def rndColor():
    8. return (random.randint(64, 255), random.randint(64, 255), random.randint(64, 255))
    9. # 随机颜色2:
    10. def rndColor2():
    11. return (random.randint(32, 127), random.randint(32, 127), random.randint(32, 127))
    12. # 240 x 60:
    13. width = 60 * 4
    14. height = 60
    15. image = Image.new('RGB', (width, height), (255, 255, 255))
    16. # 创建Font对象:
    17. font = ImageFont.truetype('Arial.ttf', 36)
    18. # 创建Draw对象:
    19. draw = ImageDraw.Draw(image)
    20. # 填充每个像素:
    21. for x in range(width):
    22. for y in range(height):
    23. draw.point((x, y), fill=rndColor())
    24. # 输出文字:
    25. for t in range(4):
    26. draw.text((60 * t + 10, 10), rndChar(), font=font, fill=rndColor2())
    27. # 模糊:
    28. image = image.filter(ImageFilter.BLUR)
    29. image.save('code.jpg', 'jpeg')

    注意示例里的字体文件必须是绝对路径。

    下载

    you-get

    安卓you-get

      需要有ffmpeg的支持。windows下载地址:
      https://ffmpeg.zeranoe.com/builds/win64/static/ffmpeg-3.4.1-win64-static.zip
      解压后添加环境变量,例如:

      然后就可以下载各大视频网站的视频了。示例:

      如果提示201:客户端未授权,可以安装Adobe Flash Player 28 PPAPI试试。

      如果你在使用Mac,可以下载客户端:

      作者: 飞鸿影
      版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
      出处:https://www.cnblogs.com/52fhy/p/6507378.html