爬虫之urllib.request模块和urllib.parse模块使用

1. urllib.requst使用

1.1 基本介绍

(1)介绍: urllib 的 request 模块可以发送请求,返回 response。
(2)用法:urllib.request 模块提供了基本的构造 http 请求的方法,同时可以处理 authentication(身份授权验证)、redirections(重定向)、cookies 等内容。

1.2 urllib.request.urlopen

'''
urllib.request.urlopen:不支持User-Agent(User-Agent:可以起到反爬作用)
'''

import urllib.request
# response 是响应对象
response = urllib.request.urlopen('https://qq.yh31.com/zjbq/2920180.html')

# read是把response里面的内容存储起来
html = response.read().decode('utf-8')  # decode是解码,把字节码解读为字符串
# encode() 字符串--> bytes数据类型
# decode() bytes数据类型 --> 字符串

1.3 urllib.request.Request

代码中的知识点是:(1)urllib.request.Request解决网页设置了User-Agent不能获取全部源代码;(2)响应对象的读取内容、返回响应码、返回实际url

'''
urllib.request.Request: 解决网页设置了User-Agent不能获取全部源代码
# 使用流程
# 1.利用Request()方法构建请求对象
# 2.利用urlopen()方法获取响应对象
# 3.利用响应对象中的read().decode('utf-8')中的内容
'''
import urllib.request

url = 'http://www.baidu.com/'
headers = headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
# 1.利用Request()方法构建请求对象
req = urllib.request.Request(url,headers)
# 2.利用urlopen()方法获取响应对象
response = urllib.request.urlopen(url)
# 3.利用响应对象中的read().decode('utf-8')中的内容
html = response.read().decode('utf-8')

'''
响应对象(response):
读取响应对象:response.read()
返回http的响应码:response.getcode()
返回实际数据的URL(防⽌重定向问题): response.geturl()
'''
print(response.read().decode('utf-8'))  # 读取响应对象
print(response.getcode())  # 返回状态码
print(response.geturl())  # 返回实际给我们数据的url

2 urllib.parse 模块使用

2.1 urllib.parse.encode()

urllib.parse.urlencode() 传入字典,将字符串变为字节

'''
# https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B  (百度搜索海贼王:%E6%B5%B7%E8%B4%BC%E7%8E%8B)
urllib.parse.urlencode()  传入字典,将字符串变为字节

'''
import urllib.parse
name = {'wd':'海贼王'}
name = urllib.parse.urlencode(name)
print(name)  # wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B

import urllib.request
import urllib.parse

#将字符串变为字节
name = input('请输入要查找的内容:')
wd = {'wd':name}
name = urllib.parse.urlencode(wd)

2.2 urllib.parse.quote()的使用

'''
https://www.baidu.com/s?wd=%E6%B5%B7%E8%B4%BC%E7%8E%8B  (百度搜索海贼王:%E6%B5%B7%E8%B4%BC%E7%8E%8B)
urllib.parse.quote:传入变量,将字符串变为字节
'''
import urllib.parse

name = '海贼王'
name = urllib.parse.quote(name)
print(name) # 结果为%E6%B5%B7%E8%B4%BC%E7%8E%8B
# 拼接时 baseurl为 'https://www.baidu.com/s?wd='

2.3 综合练习

'''
小练习:利用百度搜索关键词,并且存储在结果里面
'''
# 拼接url
baseurl = 'https://www.baidu.com/s?'
url = baseurl + name

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36','Cookie': 'PSTM=1582094483; BAIDUID=8F990E30034CDA3119553480B495C931:FG=1; BIDUPSID=B663A1F6E460EBCEB8F650086AA076DA; BD_UPN=12314753; BDUSS=V1WlhRN1NKUDhlaW81a1A2T0FIZTZFbWRHVGpEaDNpSDlvWDdzVTR3OC1CblplSVFBQUFBJCQAAAAAAAAAAAEAAACuKFyEzM7MznJ5YW5zdW5ueQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD55Tl4-eU5eVk; H_WISE_SIDS=141750_142978_143219_142067_142113_141182_143858_132921_143452_142697_143133_142210_143879_141875_140631_139051_141745_143789_142511_139172_141901_142779_131246_137749_136687_138883_140259_141942_127969_142874_140066_142991_140593_134047_143059_143492_139550_140350_138426_143469_143276_141930_131423_107312_138596_139884_140974_143477_142911_140312_140798_141364_110085; MSA_WH=1280_578; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; H_PS_PSSID=31356_1452_31325_21121_31422_31341_30910_31464_31228_30824_26350_31164_31475_22159; BD_HOME=1; delPer=0; BD_CK_SAM=1; PSINO=6; H_PS_645EC=6b6b5RMMiRCSKi%2B0hw4%2Fj9yFYrF5jD4Z0hyVuidqsbDBCnL0Dx7WeqVUfpU; COOKIE_SESSION=8325_0_4_5_5_6_1_0_3_2_0_1_10053_0_7_0_1588131414_0_1588131407%7C9%23151359_19_1586660480%7C8' }
# header加入一个cookie,阻止反爬

# 创建请求对象
req = urllib.request.Request(url,headers=headers)
# 获取相应对象
response = urllib.request.urlopen(req)
# 读取响应对象内容
html = response.read().decode('utf-8')

# 写入文件
with open('结果.html','w',encoding='utf-8') as f :
    f.write(html)

3 爬虫百度贴吧练习

(1)普通代码

'''
百度贴吧练习需求:
需求:输入要爬取贴吧的名称(如:python),在输入爬取的起始页和终止页,把每一页保存到本地
'''
## 导入模块
import urllib.request
import urllib.parse
import random

## 寻找url的规律
# https://tieba.baidu.com/f?kw=python&ie=utf-8&pn=0  第一页
# https://tieba.baidu.com/f?kw=python&ie=utf-8&pn=50  第二页
# https://tieba.baidu.com/f?kw=python&ie=utf-8&pn=100 第三页
# 规律为: (页数-1)* 50

## 随机获取一个headers
headers_list = [{'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'},{'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'}]
headers = random.choice(headers_list)

## 输入贴吧查找的关键词,以及起始页和终止页
name = input('请输入查找的贴吧关键词: ')
name = urllib.parse.quote(name)
start = int(input('请输入起始页: '))
end = int(input('请输入终止页: '))

## 拼接url 发请求 或响应 保存数据
for i in range(start,end+1):
    # 拼接url
    baseurl = 'https://tieba.baidu.com/f?kw='
    url = baseurl + name + '&pn=' + str(i)

    # 发请求
    req = urllib.request.Request(url,headers=headers)
    response = urllib.request.urlopen(req)
    html = response.read().decode('utf-8')

    # 写入并保存文件
    with open('第%d页结果'%i,'w',encoding='utf-8') as f :
        f.write(html)

(2)函数形式

'''
函数形式完成
'''
import urllib.request
import  urllib.parse
import random

# 随机获取一个headers
headers_list = [{'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'},{'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'}]
headers = random.choice(headers_list)
baseurl = 'https://tieba.baidu.com/f?kw='

def tieba(name,start,end):
    for i in range(start,end+1):
        # 转义字符串为字节码
        name = urllib.parse.quote(name)
        # 拼接url
        url = baseurl + name + '&pn=' + str(i)
        # 发请求
        req = urllib.request.Request(url, headers=headers)
        response = urllib.request.urlopen(req)
        html = response.read().decode('utf-8')
        # 写入并保存文件
        with open('第%d页结果' % i, 'w', encoding='utf-8') as f:
            f.write(html)

name = input('请输入查找的贴吧关键词: ')
start = int(input('请输入起始页: '))
end = int(input('请输入终止页: '))
tieba(name,start,end)
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值