首页 > 编程语言 >Python爬虫之urllib

Python爬虫之urllib

时间:2024-03-13 17:02:52浏览次数:29  
标签:headers Python request 爬虫 urllib content url response

urllib

1.1 urllib基本使用

# 使用urllib来访问百度首页的源码

import urllib.request

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

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

# 3.获取响应中的页面的源码
content = response.read()

# 4.打印数据
print(content)

# 使用urllib来访问百度首页的源码

import urllib.request

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

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

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

# 4.打印数据
print(content)

1.2一个类型和六个方法

import urllib.request
url = 'http://www.baidu.com'

response = urllib.request.urlopen(url)

# 一个类型六个方法
print(type(response))
# response是HTTPResponse类型

# 1.按照一个字节一个字节的去读
# content = response.read()

# 括号内数字是多少就读多少字节的数据
content1 = response.read(10)
print(content1)

# 2.读一行
content2 = response.readline()
print(content2)

# 3.按行读完
content3 = response.readlines()
print(content3)

# 4.返回状态码,如果是200,就证明没错
print(response.getcode())

# 5.返回URL地址
print(response.geturl())

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

1.3 下载


import urllib.request

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

urllib.request.urlretrieve(url_page,'baidu.html')

# 下载图片
url_img = 'https://tse4-mm.cn.bing.net/th/id/OIP-C.-A719q8dZGMnEBxUVJoL5AHaJQ?w=135&h=180&c=7&r=0&o=5&dpr=1.5&pid=1.7'
urllib.request.urlretrieve(url_img,'lisa.jpg')

# 下载视频
url_video = '视频网站'
urllib.request.urlretrieve(url_video,'视频网站')

1.4请求对象的定制

import urllib.request
url = 'https://www.baidu,com'

# https://cn.bing.com/search?q=周杰伦
# url的组成
# http/https    cn.bing.com   80/443      search   q=周杰伦    #
#    协议         主机              端口      路径      参数      锚点
# https是指该网站使用了ssl加密

headers = {'User-Agent':
'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
           }
# UA是一个特殊字符串头,使服务器能够识别客户使用的操作系统及版本、CPU类型、浏览器及版本等等
# 查看UA:右键网页空白处-》检查-》network/网络-》刷新页面-》点击第一行(接口/域名)-》最后一行就是User-Agent

# 因为urlopen不能存储字典,所以headers不能储存进去

# 请求对象的定制
# 注意,因为参数顺序的问题,不能直接写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 编解码

1.5.1get请求的quote方式

# 需求  获取 https://cn.bing.com/search?q=周杰伦 的网页源码

import urllib.request
import urllib.parse

url = 'https://cn.bing.com/search?q='

# 请求对象的定制是为了解决反爬的第一种手段
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}
# 我们需要将周杰伦三个字变成Unicode编码
# 这依赖于urllib.parse
name = urllib.parse.quote('周杰伦')
url = url+name

# 请求对象的定制
request = urllib.request.Request(url = url,headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(url)
# 获取响应的内容
content = response.read().decode('utf-8')

print(content)

1.5.2 get请求的urlencode方式

# urlencode应用场景:多个参数  相当于 &
# https://cn.bing.com/search?q=周杰伦&sex=男

import urllib.request
import urllib.parse

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

a = urllib.parse.urlencode(data)
print(a)

# 输出q=%E5%91%A8%E6%9D%B0%E4%BC%A6&sex=%E7%94%B7
# 获取 https://cn.bing.com/search?q=%E5%91%A8%E6%9D%B0%E4%BC%A6&sex=%E7%94%B7 的网页源码

import urllib.request
import urllib.parse

base_url = 'https://cn.bing.com/search?'

data = {
    'q':'周杰伦',
    '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/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}

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

response = urllib.request,urlopen(request)

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

print(content)

1.5.3 post请求

这里以百度翻译为例子

在我们依次输入s p i d e r的时候,网页发生了很多次请求,其中我们需要找到我们每次输入字母之后的请求,这里是sug,里面有我们要的url,UA等等信息

import urllib.request
import urllib.parse

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/120.0.0.0 Safari/537.36 Edg/120.0.0.0'
}

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')

print(content)
# 这是字符串类型的

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

# 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)

1.5.3 post请求之百度翻译详细翻译

在这里找到表单数据,这是我们data里的数据

在找到请求标头,这里的Accept到X-...使我们需要的headers内容

editplus使用

由于data和headers都是字典内容,而我们输入的内容又太多不好一步一步操作,这里推荐使用editplus,详细下载汉化参考EditPlus下载安装和汉化_editplus汉化包-CSDN博客

进入后粘贴内容,按Ctrl+H之后按图输入,点击全部替换就可以得到我们需要的东西了。

import urllib.request
import urllib.parse
import json

url = 'https://fanyi.baidu.com/v2transapi?from=en&to=zh'

headers ={
    # 'Accept': '*/*',
    # # 'Accept-Encoding': 'gzip, deflate, br',
    # # 这一句话必须要注释掉,不然编码会不成功
    # 'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    # 'Acs-Token': '1709985606131_1710051090138_6eV/ODO/3uTIQ4xMZONKhpt4UQEK7FUwa6f7PP5BN3PTFdLLNg89TOCh7I80d18en8PSVLX37yYqNvDupbLHI5P1kh4zNDC0DCQIHQVzpQVyBcKsiZ5gzmdtfRdMjBsx7OHcjwTQ+Q0tXqRpKycPrG7Jw5S802GJtwGUXEZ1TeEx7YzCHRzkRNUJr7B66s57GAYvSGSfHyhzds8UMMM/rxpiauYmNxy5OEa6ZEUMGKa5B/2urjJlPI/1EppAVWzFEtpaWyr683DluA/JboMCNwS8IAs4FHKA1mr7jf8/LX0m/AyoHCHnN+72ybwp/pOiIawk+thwS3UNf6DbosRI2O/GDXVMUwaUz2OyPpHmVERz2HNlapWZSjzthNBmZt35jAwjgHvzC9USKDSolVrWg28iw04A3MPPiWEw2Kenl/43aZ+RBCy7tuMnO8uyPWKm',
    # 'Connection': 'keep-alive',
    # 'Content-Length': '152',
    # 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
    'Cookie': 'BAIDUID_BFESS=21142DA9C902AF45599C14E458764454:FG=1; BDUSS=RZQ0c0NFFsUEhYcHp0cmFseFMwakR0V2twb29uTURVR3ZofmI1VTl6YW5DdGRsSVFBQUFBJCQAAAAAAQAAAAEAAABV1RsPx7DNvrXEw9TNvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKd9r2Wnfa9lZU; BDUSS_BFESS=RZQ0c0NFFsUEhYcHp0cmFseFMwakR0V2twb29uTURVR3ZofmI1VTl6YW5DdGRsSVFBQUFBJCQAAAAAAQAAAAEAAABV1RsPx7DNvrXEw9TNvgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAKd9r2Wnfa9lZU; ZFY=ilsG5NTXHpfgILIaA988z4S51DtFtE4q:Ab3zQ8c8mK4:C; APPGUIDE_10_7_0=1; REALTIME_TRANS_SWITCH=1; FANYI_WORD_SWITCH=1; HISTORY_SWITCH=1; SOUND_SPD_SWITCH=1; SOUND_PREFER_SWITCH=1; Hm_lvt_64ecd82404c51e03dc91cb9e8c025574=1709976202,1710051080; Hm_lpvt_64ecd82404c51e03dc91cb9e8c025574=1710051080; ab_sr=1.0.1_ODU1MGM0YjI5YzQ4YmRiYTMyNjQxNjI1NWNmZmE4OTZhM2VhZTQzMDY5MWJjNTQ0M2IyNDVjYzBiNGU3YzY3MjUwMTIwYjE2MDZhNWM3NDBhOWViOWVmY2YyYTUyYzc3OGY5YTA1OGY3MGU3ZGIwNDgxOTc4YTQyNGU0YjllZDgzNGNiZTdkODZmNzIwMTlhMTE3ZmFlZWZkMDFjY2RiMTc1NmNhNDljZmYxZWI3NzRiMmY3NGVhYzVhODgyOTI0',
    # 'Host': 'fanyi.baidu.com',
    # 'Origin': 'https://fanyi.baidu.com',
    # 'Referer': 'https://fanyi.baidu.com/',
    # 'Sec-Fetch-Dest': 'empty',
    # 'Sec-Fetch-Mode': 'cors',
    # 'Sec-Fetch-Site': 'same-origin',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    # 'X-Requested-With': 'XMLHttpRequest',


    # 实际上其中最重要的只有Cookie和UA  其余即使全部注释掉也无所谓
}

data = {
    'from': 'en',
    'to': 'zh',
    'query': 'love',
    'transtype': 'realtime',
    'simple_means_flag': '3',
    'sign': '198772.518981',
    'token': '14321551a8edf96a248e6f0299fcc54e',
    'domain': 'common',
}
# post请求的参数要求编码
data = urllib.parse.urlencode(data).encode('utf-8')
# 请求对象的定制
request = urllib.request.Request(url = url,data = data,headers = headers)
# 模拟浏览器向服务器发送请求
response = urllib.request.urlopen(request)
# 获取响应的数据
content = response.read().decode('utf-8')

obj = json.loads(content)
print(obj)

1.6 ajax的get请求

(以获取豆瓣电影排行榜数据为例)

我们首先要找到获得排行榜数据的请求

从标头这里获得url和UA

import urllib.request
import urllib.parse
import json

# get 请求
# 我们要获得豆瓣电影的第一页数据   并且保存下来

url = 'https://movie.douban.com/j/chart/top_list?type=24&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/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
}

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

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

# 下载数据到本地
# open方法默认的是使用gbk的编码,如果我们想要保存中文,需要在open方法中指定编码格式为utf-

# fp = open('douban.json','w',encoding = 'utf-8')
# fp.write(content)
 
with open('douban.json','w',encoding = 'utf-8') as fp:
    fp.write(content)

# 两种方法一样

获取前十页的数据

我们首先获得了第一页的url

首先清除所有的请求,之后下滑鼠标,来获得下一页的请求

以此类推获得多组url

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

这里以三组为例,但是我们已经能看出来有什么顺序

import urllib.request
import urllib.parse

def create_request(page):
    base_url = 'https://movie.douban.com/j/chart/top_list?type=24&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/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    }

    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)


# 一个程序的入口(main函数)

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

# for遍历是左闭右开,所以右边要加一
for page in range(start_page,end_page+1):
# 每一页都有自己请求对象的定制
    request = create_request(page)

# 获取响应的数据
    content = get_content(request)

# 下载
    down_load(page,content)

请求肯德基官网

# X-Requested-With:XMLHttpRequest
# 一般有这个就代表是ajax请求  这是ajax的核心对象

# 1.2页这些数据都一致
# https://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname
# post

# 这些是差别

# cname: 北京
# pid:
# pageIndex: 1
# pageSize: 10

# cname: 北京
# pid:
# pageIndex: 2
# pageSize: 10


import urllib.request
import urllib.parse
import json
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/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
    }

    request = urllib.request.Request(url = base_url,headers = headers,data = data,)
    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):
        # 请求对象的定制
        request = create_request(page)
        # 获取内容数据
        content = get_content(request)
        # 下载
        down_load(page,content)

1.7 URLError & HTTPError

  • URLError类是HTTPError类的子类
  • 导入的包 urllib.error.HTTPError                urllib.error.URLError
  • http错误:是针对浏览器无法连接到服务器而增加出来的错误提示。引导并告诉浏览者是哪里出了问题。
  • 通过urllib发送请求的时候,有可能会发送失败,这个时候如果想让你的代码更加健硕,可以通过try-except进行捕获异常,异常有两类,HTTPError&URLError

HTTPError

import urllib.request



url = 'https://blog.csdn.net/Zombie166/article/details/1365403481'
# 以本网站为例,原本是https://blog.csdn.net/Zombie166/article/details/136540348,这里在最后加了一个1,结果就会报出以下错误


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

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

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

print(content)

import urllib.request
import urllib.error


url = 'https://blog.csdn.net/Zombie166/article/details/1365403481'

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

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('系统出错,正在升级。。。。')

URLError

import urllib.request
import urllib.error


# url = 'https://blog.csdn.net/Zombie166/article/details/1365403481'

# 一般URLError是主机地址和参数这边出了问题

url = 'http://nihao.com'

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

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.8 微博的Cookie登录

# 这里拿微博主页测试

# 适用的场景: 数据采集的时候,需要绕过登录,然后进入某个页面

import urllib.request

url = 'https://weibo.com/u/5530696707'

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

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)

# 个人信息页面是utf-8,但是还是报错了编码错误,因为并没有进入到个人信息页面,而是跳转到了登录页面
# 登录页面不是utf-8,所以报错

检查发现登录网页的编码是gb2312

# 这里拿微博主页测试

# 适用的场景: 数据采集的时候,需要绕过登录,然后进入某个页面

# 登录页面的编码是'gb2312'

import urllib.request

url = 'https://weibo.com/u/5530696707'

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

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

response = urllib.request.urlopen(request)
content = response.read().decode('gb2312')

with open('weibo.html','w',encoding = 'gb2312')as fp:
    fp.write(content)

但是这样进入的只是登录页面,而我们需要绕过登录页面

# 这里拿微博主页测试

# 适用的场景: 数据采集的时候,需要绕过登录,然后进入某个页面

# 登录页面的编码是'gb2312'

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


import urllib.request

url = 'https://weibo.cn/5530696707/info'

headers = {
    # ':authority': 'weibo.cn',
    # ':method': 'GET',
    # ':path': '/5530696707/info',
    # ':scheme': 'https',
    # 带冒号的和 encoding 没有影响  注释掉
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7',
    # 'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'Cookie': 'SUBP=0033WrSXqPxfM725Ws9jqgMF55529P9D9Wh.ybNaBNFIEk7mdjdN1dMm5JpX5KzhUgL.Fo-fe05c1KqNehM2dJLoIp7LxKML1KBLBKnLxKqL1hnLBoMfSKe7So.cS05N; _T_WM=0e3ca79a756ae4e188d7cad69e8cef14; SUB=_2A25I62f4DeRhGeNL6FIX-SjLyzuIHXVrieUwrDV6PUJbkdANLWukkW1NSQx3dD0dsdxF2yCz-0vF05XlyEg2XKNV; SCF=AgVRogNKqvqwWzxIY91fCaj26nkvKrjEeIVdCTYUt9RrOF4CfhHcQDw0cu1nl68LZT1v-J-BxibPSDSAfFvnSDs.; SSOLoginState=1710167976',
    # cookie 中携带着你的登录信息,如果有登陆之后的Cookie  那么我们可以携带着Cookie进入登录后的任何页面
    'Referer': 'https://weibo.cn/',
    # referer 是判断当前路径是否由上一个路径(url)进来的   一般情况下做图片防盗链
    'Sec-Ch-Ua': '"Not_A Brand";v="8", "Chromium";v="120", "Microsoft Edge";v="120"',
    'Sec-Ch-Ua-Mobile': '?0',
    'Sec-Ch-Ua-Platform': '"Windows"',
    'Sec-Fetch-Dest': 'document',
    'Sec-Fetch-Mode': 'navigate',
    'Sec-Fetch-Site': 'same-origin',
    'Sec-Fetch-User': '?1',
    'Upgrade-Insecure-Requests': '1',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
}

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

response = urllib.request.urlopen(request)
# 登录之后的页面编码是 utf-8
content = response.read().decode('utf-8')

with open('weibo.html','w',encoding = 'utf-8')as fp:
    fp.write(content)

1.9 handler处理器

# urllib.request.urlopen(url)
# 不能定制请求头
# urllib.request.Request(url,headers,data)
# 可以定制请求头
# Handler
# 定制更高级的请求头(随着业务逻辑的复杂,请求对象的定制已经不能满足我们的需求:动态Cookie和代理不能使用请求对象的定制)

# 使用Handler来访问百度获取网页源码
import urllib.request

url = 'http://www.baidu.com'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36 Edg/120.0.0.0',
}

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

# handler   build_open   open

# 1.获取handler对象
handler = urllib.request.HTTPHandler()

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

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

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

print(content)

1.10 代理服务器

代理的常用功能

  • 突破自身IP访问限制,访问国外站点
  • 访问一些单位或者团体内部资源
  • 提高访问速度,隐藏真实IP
  • 代码配置代理

创建

这里我们用到新函数

handler = urllib.request.ProxyHandler()

按住Ctrl点击ProxyHandler可以查看其信息

这里就是代理

这里我们可以上网搜索“快代理(免费私密代理IP_IP代理_HTTP代理 - 快代理 (kuaidaili.com))”有免费代理可以供我们测试,使用方法如下:

proxies = {
    # 'key':'value'
    'http':'114.237.202.212:15646'
}
handler = urllib.request.ProxyHandler(proxies=proxies)
import urllib.request

url = 'https://cn.bing.com/search?q=ip'

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

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

proxies = {
    # 'key':'value'
    'http':'114.237.202.212:15646'
}
# handler     build_opener   open
handler = urllib.request.ProxyHandler(proxies=proxies)

opener = urllib.request.build_opener(handler)

response = opener.open(request)

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

with open('daili.html','w',encoding = 'utf-8')as fp:
    fp.write(content)

标签:headers,Python,request,爬虫,urllib,content,url,response
From: https://blog.csdn.net/Zombie166/article/details/136540348

相关文章

  • Python学习+PySimpleGUI+Pyinstaller,制作Windows桌面小工具
    1开发环境Python+PyCharm2第三方库2.1PySimpleGUI是基于Python的图形界面开发工具pipinstall PySimpleGUIPySimpleGUI5.0版本后开始收费,好像注册个人用户是免费,嫌麻烦我直接用的之前的版本 pip installPySimpleGUI==4.60.5 2.2PyInstaller是一个在Windows、G......
  • python多线程中:如何关闭线程?
    使用threading.Event对象关闭子线程Event机制工作原理:Event是线程间通信的一种方式。其作用相当于1个全局flag,主线程通过控制event对象状态,来协调子线程步调。使用方式主线程创建event对象,并将其做为参数传给子线程主线程可以用set()方法将event对象置为true,用cl......
  • 免费实名认证接口python语言-身份核验-身份证二、三要素
    翔云身份证实名认证接口,实时联网,可快速、精准核验用户所提供信息的真伪,且为更好的服务广大新老用户,现购买翔云身份证实名认证接口即赠送同等的身份证识别接口条数,旨在帮助用户摆脱手动录入的繁琐,提高用户体验,让您的平台远离冒名顶替、欺诈的风险,更有助于您的企业树立起诚信、可靠......
  • python(pip)包/模块:如何离线安装?
    1、生成requirements.txt文件如果有同环境服务器,可直接生成requirements.txt,会把当前服务器下的包和版本写入文件中。pipfreeze>requirements.txt如安装指定包,创建requirements.txt,输入包名==版本号//只输入包名,默认最新版本。例:xlwt==1.3.02、下载包在requirements.t......
  • 用Python历时十多天完成的全国所有区县经纬度采集
    在高德坐标拾取器(坐标拾取器|高德地图API)中,如果输入北京,坐标获取结果为:116.407387,39.904179,这是经纬度坐标,在高德公开的全国所有区县编码表(https://a.amap.com/lbs/static/code_resource/AMap_adcode_citycode.zip)中,有3241行数据,字段分别为中文名,adcode,citycode,其中citycode......
  • python实现发送邮件
    python实现自动化邮件发送测试环境:os:windows10编译软件:pycharm,python发送端:[email protected]接收端:[email protected],[email protected] 1.发送端需开启POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。我这里使用的是QQ,需要去mail.qq.com开启此服务:【登录】-【设置】-【账号】-【OP3/IMA......
  • 如何系统的学习Python——文件操作
    在Python中,文件操作是一项常见的任务,用于读取和写入文件。下面简要介绍Python中的文件处理(FileHandling)操作:打开文件(OpenaFile):要打开一个文件,可以使用内建的open()函数。open()函数接受文件路径和打开模式作为参数。#打开一个文件以供读取file_path="example.......
  • springboot/java/php/node/python小区物业管理小程序【计算机毕设】
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着城市化进程的加速,住宅小区作为城市生活的基本单元,其管理效率和服务质量直接影响着居民的生活体验。传统的物业管理方式往往依赖于人工操作,不仅耗时......
  • python Ai 应用开发基础训练,字符串,字典,文件,函数,装饰品,生成器(下)
    生成器的另一个示例,这个生成器功能是从大小生,生成斐波那契数列deffib(max):#定义一个函数fib,参数为maxa,b=0,1#初始化两个变量a和b,分别赋值为0和1n=0#初始化计数变量n为0whileb<max:#当b小于max时继续循环print(b)#打印当前的斐波......
  • 如何系统的学习Python——图书管理系统
    一个典型的应用面向对象编程(OOP)概念的实际项目——图书管理系统。在这个项目中,我们可以设计多个类来表示不同的实体,如书籍、作者、图书馆、借阅者等,并通过这些类之间的关系来模拟现实生活中的图书管理流程。以下是一个简单的图书管理系统的面向对象设计概念示例:1.类的设......