Urllib模块: 一个基于HTTP访问请求的Python内置模块库 。
包括以下子模块:1. urllib.request 请求模块2. urllib.error 异常处理模块3. urllib.parse url解析模块4. urllib.robotparser robots.txt 解析模块。
urlib.request 模块的主要作用是向互联网服务器发送请求,并获取网络服务器的反馈数据信息。
Requests 模块:一个基于 urllib 模块简单易用的第三方网络HTTP请求模块库。
Requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。
它比 urllib 更加方便,可以节约我们大量的工作,完全满足 HTTP 访问操作需求。
#1.定义一个地址
url="http://www.chinasofti.com/r/cms/www/default/css/jquery.fullpage.css"
resp=urllib.request.urlopen(url)#urlopen( ) 函数的作用是与指定的网络资源建立一个连接(主要通过网址,即 url,Uniform Resource Location)
print(resp.geturl()) #获取请求url地址
print(resp.getcode()) #获取返回码(200正常)
print(resp.info()) # 获取网页返回信息
if resp.getcode()==200: #如果获取成功
with open("video-js.css",'w',encoding='utf-8') as fp:
fp.write(resp.read().decode('utf-8')) #我们使用 response.read( ) 函数可以轻松获取指定网页的源代码。(建议使用decode()函数设置字符集,防止中文乱码)
pass
import requests #引入requests模块
#定义url
#get请求
url='https://movie.douban.com/subject_search'
resp=requests.get(url,params={'search_text':'哪吒','cat':'1002'}) #以GET请求方式向服务器发送请求并获取服务器响应的数据集对象。
print(resp.status_code) #获取服务器反馈的状态码使用 resposne对象的status_code属性即可输出。
print(resp.content.decode('utf-8')) #r.content 字节方式的响应体,会自动为你解码 gzip 和 deflate 压缩
resp.close() #关闭请求
#post请求
url='https://httpbin.org/post'
resp=requests.post(url,data={'name':'alvin'}) #以POST请求带json请求参数并方式向服务器发送请求并获取服务器响应的数据集对象。
print(resp.status_code)
print(resp.text) #获取服务器反馈的资源数据使用 resposne对象的text属性即可得到
print(resp.json()) #r.json() #Requests中内置的JSON解码器
resp.close()
#批量采集百度图库图片数据
import time
import requests
import re
import urllib.request,urllib.response
import threading
import sys
from day17.demo04 import *
#实现多线程下载器
#定义下载器下载
class DownLoader(threading.Thread):
def __init__(self,url,fileName):
threading.Thread.__init__(self)
self.__url=url
self.__fileName=fileName
pass
#重写run方法
def run(self):
try:
#获得资源文件名称和资源信息(封装在响应头)
fileName,headers=urllib.request.urlretrieve(self.__url)
print('正在下载:')
urllib.request.urlretrieve(self.__url,self.__fileName,self.download)
print('下载完成')
except Exception as e:
logger.error('下载文件失败')
print(e)
pass
@staticmethod
def download(bockNum,blockSize,contentLength):
p=100*bockNum*blockSize/contentLength
if p>100:
p=100
sys.stdout.write('下载进度{0}%'.format(p))
sys.stdout.flush()
pass
pass
if __name__=='__main__':
import uuid
def decode_url(url):
"""
对百度加密后的地址进行解码\n
:param url:百度加密的url\n
:return:解码后的url
"""
table = {'w': "a", 'k': "b", 'v': "c", '1': "d", 'j': "e", 'u': "f", '2': "g", 'i': "h",
't': "i", '3': "j", 'h': "k", 's': "l", '4': "m", 'g': "n", '5': "o", 'r': "p",
'q': "q", '6': "r", 'f': "s", 'p': "t", '7': "u", 'e': "v", 'o': "w", '8': "1",
'd': "2", 'n': "3", '9': "4", 'c': "5", 'm': "6", '0': "7",
'b': "8", 'l': "9", 'a': "0", '_z2C$q': ":", "_z&e3B": ".", 'AzdH3F': "/"}
url = re.sub(r'(?P_z2C\$q|_z\&e3B|AzdH3F+)' , lambda matched: table.get(matched.group('value')), url)
return re.sub(r'(?P[0-9a-w])' , lambda matched: table.get(matched.group('value')), url)
pn = 0
gsm=1
# 初始化url地址
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'}
# 通过对比两个网址可以发现只有pn和gsm的值发生了改变。pn代表的是页数,rn代表每页显示的图片数量。gsm是pn 的 16位显示。
while True:
url = "https://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=" \
"&fp=result&queryWord=%E5%8A%A8%E6%BC%AB%E5%9B%BE%E7%89%87&cl=2&lm=-1&ie=utf-8&oe=" \
"utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=©right=&word=%E5%8A%A8%E6%BC%AB%E5%9B%BE%E7%89%87&s" \
"=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&pn=30&rn=30&gsm=" \
"1e&1565850898082=".format(pn,gsm)
try:
response=requests.get(url,headers=headers)
#print(response)
obj=response.json()
#print(obj)
for temp in obj['data']:
if temp.get('middleURL'):
imgURL=temp['middleURL']
downloader=DownLoader(imgURL,str(uuid.uuid4())+'.jpg')
downloader.start()
pass
pass
time.sleep(10)
pn+=30
gsm+=2
except Exception as e:
logger.error('URL地址访问数据异常'+url)
print(e)
if pn==120:
break
pass