python爬虫学习第一章 urllib库

1.1 urllib的基本使用

import urllib.request

# (1)定义一个url 就是你要访问的地址
url="http://www.baidu.com"

# (2)模拟浏览器向服务器发送请求 response响应
response=urllib.request.urlopen(url)

#(3)获取响应中页面的源码
# read()方法 返回的是字节形式的二进制数据
# 我们要将二进制数据转换成字符串
# 二进制--》字符串 解码 decode('编码的格式')
content=response.read().decode('utf-8')

# (4)打印数据
print(content)

1.2 一个类型和六个方法

import urllib.request

url="http://www.baidu.com"

# 模拟浏览器向服务器发送请求 response响应
response=urllib.request.urlopen(url)

# 一个类型和6个方法
# response是HTTPResponse的类型
# print(type(response))

# read(5)是一个字节一个字节的去读  5表示读取5个字节
# content=response.read(5)
# print(content)

# readline() 读取一行
# content=response.readline()
# print(content)

# readline() 读取全部
# content=response.readlines()
# print(content)

# getcode():返回HTTP请求的响应状态码
# print(response.getcode())

# geturl():用于获取响应页面的URL,该方法可以验证发送的HTTP请求是否被重新调配
# print(response.geturl())

# 获取状态信息
print(response.getheaders())

# 一个类型是HTTPResponse
# 六个方法 read readline readlines getcode geturl getheaders

1.3 urlretrieve()方法的使用

import urllib.request

# 下载网页
# url_page="http://www.baidu.com"

# url代表的是下载链接 filename文件的名字
# 在python中给方法传值时,可以是变量,也可以直接写值
# 不过直接写值是一定要保证所传参数和方法中的参数位置一致
# urllib.request.urlretrieve(url_page,'baudu.html')

# 下载图片
# url_img="https://img0.baidu.com/it/u=2616975297,1777334773&fm=253&fmt=auto&app=120&f=JPEG?w=892&h=500"
# urllib.request.urlretrieve(url=url_img,filename='sgqt.jpg')

# 下载视频
url_video="https://vdept3.bdstatic.com/mda-qe3jnwgpe49ufz6v/cae_h264/1714881494015477411/mda-qe3jnwgpe49ufz6v.mp4?v_from_s=hkapp-haokan-nanjing&auth_key=1722710358-0-0-55eb8fb7ac63a4095443282be1a05173&bcevod_channel=searchbox_feed&pd=1&cr=0&cd=0&pt=3&logid=2358225956&vid=13433973294682325294&klogid=2358225956&abtest=101830_1-102148_1-17451_2"
urllib.request.urlretrieve(url=url_video,filename='sgqt.mp4')

1.4 请求对象的定制

请求对象的定制是为了解决反爬的第一种手段

import urllib.request

url="https://www.baidu.com"

# url的组成
# https/http   www.baidu.com  80/443
# 协议             主机          端口号

headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}

# 将url作为Request()方法的参数,构造并返回一个Request对象
# 请求对象的定制
# 注意 因为参数顺序的问题 不能直接写url和headers 中间还有一个参数data 所以我们需要关键字传参
request=urllib.request.Request(url=url,headers=headers)

response=urllib.request.urlopen(request)

content=response.read().decode("utf-8")

print(content)

1.5 get请求的quote()方法

import urllib.request
import urllib.parse

url="https://www.baidu.com/s?wd="

headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}

# 将中文变成Unicode编码的格式
# 我们需要依赖于urllib.parse
name=urllib.parse.quote("十个勤天")
# print(name)
url=url+name

# 请求对象的定制
request=urllib.request.Request(url=url,headers=headers)

# 模拟浏览器向服务器发送请求
response=urllib.request.urlopen(request)

# 获取响应的内容
content=response.read().decode('utf-8')

print(content)

1.6 get请求的urlencode()方法

import urllib.request
import urllib.parse

# urlencode()方法应用场景:多个参数的时候
# ?后面的字符串包含了要查询的关键字
base_url="https://www.baidu.com/s?"

data={
    'wd':'周杰伦',
    'sex':'男'
}

new_data=urllib.parse.urlencode(data)

# 请求资源路径
url=base_url+new_data

headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}

# 请求对象的定制
request=urllib.request.Request(url=url,headers=headers)

# 模拟浏览器向服务器发送请求
response=urllib.request.urlopen(request)

# 获取响应的内容
content=response.read().decode('utf-8')

print(content)

1.7 post请求之百度翻译

注意点:
(1)post请求的参数 必须要进行编码 data = urllib.parse.urlencode(data)
(2)编码之后 必须调用encode方法 data = urllib.parse.urlencode(data).encode(‘utf-8’)
(3)参数是放在请求对象定制的方法中 request = urllib.request.Request(url=url,data=data,headers=headers)

import urllib.request
import urllib.parse
import json

# post请求的参数 必须要进行编码 data = urllib.parse.urlencode(data)
# 编码之后 必须调用encode方法 data = urllib.parse.urlencode(data).encode('utf-8')
# 参数是放在请求对象定制的方法中 request = urllib.request.Request(url=url,data=data,headers=headers)

# post请求
url="https://fanyi.baidu.com/sug"

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}

data = {
    'kw':'spider'
}

# post请求的参数 必须要进行编码
data = urllib.parse.urlencode(data).encode('utf-8')

# post请求的参数 是不会拼接在url后面的 而是需要放在请求对象定制的参数中
request = urllib.request.Request(url=url,data=data,headers=headers)

# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

# 字符串--》json对象
obj = json.loads(content)
print(obj)

1.8

1.9 ajax的get请求豆瓣电影第一页

alt+ctrl+l:格式化json文件

import urllib.request

url="https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20"

headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}

# 请求对象的定制
request=urllib.request.Request(url=url,headers=headers)

# 模拟浏览器向服务器发送请求
response=urllib.request.urlopen(request)

# 获取响应的内容
content=response.read().decode('utf-8')

# 数据下载到本地  由于默认的是gbk方法,所以要设置编码格式为utf-8
with open('douban.json','w',encoding='utf-8') as fp:
    fp.write(content)

1.10 ajax的get请求豆瓣电影前10页

import urllib.request
import urllib.parse

# https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&
# start=80&limit=20

# 下载豆瓣电影前10页的数据
# (1) 请求对象的定制
# (2) 获取响应的数据
# (3) 下载数据

def crete_request(page):
    base_url="https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&"

    data={
        'start':(page-1)*20,
        'limit':20
    }
    data = urllib.parse.urlencode(data)

    url=base_url+data

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
    }

    request=urllib.request.Request(url=url,headers=headers)

    return request

def get_content(request):
    response = urllib.request.urlopen(request)

    content = response.read().decode('utf-8')

    return content

def down_load(page,content):
    # 如果要和字符串拼接,加号的两端必须都是字符串
    with open('douban'+str(page)+'.json','w',encoding='utf-8') as fp:
        fp.write(content)

# 程序的入口
if __name__ == '__main__':
    start_page=int(input("请输入起始的页码:"))
    end_page=int(input("请输入结束的页码:"))

    for page in range(start_page,end_page+1):
        # 每一页都有自己的请求对象的定制
        request = crete_request(page)
        # 获取响应的数据
        content = get_content(request)
        # 下载
        down_load(page,content)

1.11 ajax的post请求KFC官网

# 第一页
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10

# 第二页
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10

# 第三页
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# cname: 北京
# pid:
# pageIndex: 3
# pageSize: 10

import urllib.parse
import urllib.request
def create_request(page):
    base_url="https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname"

    data = {
        'cname': '北京',
        'pid':'',
        'pageIndex': page,
        'pageSize': '10'
    }

    data = urllib.parse.urlencode(data).encode('utf-8')

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
    }

    request = urllib.request.Request(url=base_url,data=data,headers=headers)
    return request

def get_content(request):
    response = urllib.request.urlopen(request)

    content = response.read().decode('utf-8')
    return  content

def down_load(page,content):
    with open('kfc_'+str(page)+'.json','w',encoding='utf-8') as fp:
        fp.write(content)

if __name__ == '__main__':
    start_page = int(input("请输入起始的页码:"))
    end_page = int(input("请输入结束的页码:"))

    for page in range(start_page,end_page+1):
        # 请求对象的定制
        request = create_request(page)
        # 获取网页源码
        content = get_content(request)
        # 下载
        down_load(page,content)

1.12 urllib_异常

import urllib.request
import urllib.error

# url = "https://blog.csdn.net/talentT/article/details/1371469641"

# 一般报url错误,是主机地址和参数有问题
url = "https://sgqt111.com"

headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}

try:
    request = urllib.request.Request(url=url,headers=headers)

    response = urllib.request.urlopen(request)

    content = response.read().decode('utf-8')
    print(content)
except urllib.error.HTTPError:
    print("系统正在升级。。。")
except urllib.error.URLError:
    print("都说了系统正在升级。。。")

1.13 微博的cookie登录

# 使用场景:数据采集的时候,需要绕过登录 然后进入某个页面
# 个人信息页面是utf-8 但还是报了编码错误 因为没有进入到个人信息页面 而是跳转到了登录页面
# 而登录页面不是utf-8 所以报错

# 什么情况下访问不成功?
# 因为请求头的信息不够 所以访问不成功

import urllib.request

url= "https://weibo.cn/7468850232/info"

headers = {
    # cookie中携带着你的登录信息 如果有登录之后的cookie 那么我们就可以携带cookie进入任何页面
    'cookie':'_T_WM=5be67dfc5545c91fa4f2ab1d047ad149; SCF=AhUnogVlh7AAVHwU_CbgUkjiXbuGsrsOh9wfSiUgGHJZ2mISIkUIU893EYmYIhTdhasWS-ORIJyjDBKRb5G9HTw.; SUB=_2A25LtMrhDeRhGeFK7VoZ9S7OyD6IHXVoyEIprDV6PUJbktANLRfYkW1NQzfYFULvhNqqdF0VImRRbyI_EzpLvbCz; SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9Whf.vDBFAgRvwlyERCHBPko5NHD95QNShqR1h-7eoeEWs4DqcjMi--NiK.Xi-2Ri--ciKnRi-zNS0Bc1hnfehz0entt; SSOLoginState=1722858162; ALF=1725450162',
    # referer 判断当前路径是不是由上一个路径进来的 一般情况下 是做图片防盗链
    'referer':'https://weibo.cn/?tf=5_009',
    'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
}

request = urllib.request.Request(url=url, headers=headers)

response = urllib.request.urlopen(request)

content = response.read().decode('utf-8')

# 将数据保存到本地
with open('weibo.html','w',encoding='utf-8') as fp:
    fp.write(content)

1.14 handler处理器的基本使用

# 需求 使用handler来访问百度 获取网页源代码

import urllib.request

url = "httpa://www.baidu.com"

headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36"
}

request = urllib.request.Request(url=url, headers=headers)

# handler build_opener open
# (1) 获取handler对象
handler = urllib.request.HTTPSHandler()

# (2) 获取opener对象
opener = urllib.request.build_opener(handler)

# (3)调用open方法
response = opener.open(request)

content = response.read().decode('utf-8')

print(content)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值