urllib.request.urlopen() 模拟浏览器向服务器发送请求:
1)定义需要访问的url地址
2)模拟浏览器向服务器发送请求
3)获取响应的页面源码
- # 使用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)代码:
- # 使用urllib获取百度首页源码
- import urllib.request
-
- # 1、定义一个url 需要访问的地址
- url = 'http://www.baidu.com'
-
- # 2、模拟浏览器向服务器发送请求 response就是响应
- response = urllib.request.urlopen(url)
-
- # 一个类型和六个方法
- print(type(response))
2)输出:
3)response的数据类型是HttpResponse:
- read() 字节形式读取二进制 扩展:rede(5)返回前几个字节
readline() 只能 读取一行
readlines() 一行一行读取 直至结束
getcode() 获取状态码 (判断书写逻辑是否正确,返回200表示正常)
geturl() 获取url地址
getheaders() 获取header
- # 使用urllib获取百度首页源码
- import urllib.request
-
- # 1、定义一个url 需要访问的地址
- url = 'http://www.baidu.com'
-
- # 2、模拟浏览器向服务器发送请求 response就是响应
- response = urllib.request.urlopen(url)
-
- # 按照一个字节一个字节的方式进行读取
- content = response.read()
-
- # 返回5个字节
- content = response.read(5)
-
- # 读取一行数据
- content = response.readline()
-
- # 按照一行一行的方式进行读取
- content = response.readlines()
-
- # 返回状态码 如果是200证明没有错
- print(response.getcode())
-
- # 返回url地址
- print(response.geturl())
-
- # 获取响应头等状态信息
- print(response.getheaders())
- import urllib.request
-
- # 下载网页
- url_page = 'http://www.baidu.com'
-
- # url代表的是下载的路径 filename文件的名字
- urllib.request.urlretrieve(url_page, 'baidu.html')
-
- # 下载图片
- url_img = 'https://img0.baidu.com/it/u=1309359181,3567527426&fm=253&fmt=auto&app=138&f=JPEG?w=281&h=499'
-
- urllib.request.urlretrieve(url_img, 'lisa.jpg')
-
- # 下载视频
- url_video = 'https://vd3.bdstatic.com/mda-kjtx64epufgk8zw5/sc/cae_h264_nowatermark/1604104149/mda-kjtx64epufgk8zw5.mp4?v_from_s=hkapp-haokan-hnb&auth_key=1659543870-0-0-4dd2d6b9e96b8193a5e2ec3a86177452&bcevod_channel=searchbox_feed&pd=1&cd=0&pt=3&logid=3270589526&vid=6647036806223333961&abtest=103747_2-103890_2&klogid=3270589526'
-
- urllib.request.urlretrieve(url_video, 'lisa.mp4')
UA介绍:User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统 及版本、CPU 类型、浏览器及版本。浏览器内核、浏览器渲染引擎、浏览器语言、浏览器插件等
UA反爬虫:在进行爬虫时候,程序模仿浏览器操作,但是反爬虫机制在响应爬虫请求时候需要进行UA识别,这时候就需要将UA参数传进我们的爬虫程序中
- import urllib.request
-
- url = 'https://www.baidu.com'
-
- # url的组成
- # https://www.baidu.com/s?wd=周杰伦
-
- # http/https www.baidu.com 80/443 s wd = 周杰伦 #
- # 协议 主机 端口号 路径 参数 锚点
- # http 80
- # https 443
- # mysql 3306
- # oracle 1521
- # redis 6379
- # mongodb 27017
-
- headers = {
- 'User-Agent': ''
- }
-
- # 因为urlopen方法中不能存储字典 所以headers不能传递进去
- # 请求对象的定制
- request = urllib.request.Request(url=url,headers=headers)
-
- response = urllib.request.urlopen(request)
-
- content = response.read().decode('utf8')
-
- print(content)
1)urllib.parse.quote():quote方法能够将汉字转换成unicode编码的格式,适用于单个参数
- import urllib.request
-
- url = 'https://cn.bing.com/search?q='
-
- # 模拟浏览器访问——解决ua反爬
- headers = {
- 'User-Agent': ''
- }
-
- # 将周杰伦三个字变成unicode编码
- # 我们需要依赖于urllib.parse
- name = urllib.parse.quote('猪猪侠')
-
- url = url + name
-
- # 请求对象的定制
- request = urllib.request.Request(url=url, headers=headers)
- # 模拟浏览器向服务器发送消息
- response = urllib.request.urlopen(request)
- content = response.read().decode('utf8')
-
- # 打印数据
- print(content)
2)urllib.parse.urlencode():urlencode方法也可以将汉字转换成unicode编码,适用于多个参数
- # urlencode的应用场景:多个参数的时候
- import urllib.request
-
- base_url = 'https://cn.bing.com/search?'
-
- data = {
- 'q': '周杰伦',
- 'sex': '男',
- 'location': '中国台湾省'
- }
-
- new_data = urllib.parse.urlencode(data)
-
- url = base_url + new_data
-
- headers = {
- 'User-Agent': ''
- }
-
- request = urllib.request.Request(url=url, headers=headers)
-
- response = urllib.request.urlopen(request)
-
- context = response.read().decode('utf-8')
-
- print(context)
post请求方式与get请求方式区别
1)get请求方式的参数必须编码:
参数是拼接到url后面编码之后,不需要调用encode方法
url = base_url + new_data
new_data = urllib.parse.urlencode(data)
request = urllib.request.Request(url=url, headers=headers)
2)post请求方式的参数必须编码:
参数是放在请求对象定制的方法中,编码之后需要调用encode方法:
url = 'https://fanyi.baidu.com/sug'
data = urllib.parse.urlencode(data).encode('utf8')
request = urllib.request.Request(url=url, data=data, headers=headers)
- import urllib.request
-
- url = 'https://fanyi.baidu.com/sug'
-
- headers = {
- 'User-Agent': ''
- }
-
- data = {
- 'kw': 'spider'
- }
-
- # post请求方式的参数,必须要进行编码 data = urllib.parse.urlencode(data).encode('utf8') 编码之后必须调用encode方法
- # post请求方式的参数,不会拼接在url后,而是放在请求对象定制的参数中
- data = urllib.parse.urlencode(data).encode('utf8')
-
- # post参数放在请求对象定制的方法中
- request = urllib.request.Request(url=url, data=data, headers=headers)
-
- response = urllib.request.urlopen(request)
-
- context = response.read().decode('utf8')
-
- print(context)
1)获取豆瓣电影第一页
- # get请求
- # 获取豆瓣电影的第一页数据 并且保存起来
-
- import urllib.request
-
- url = "https://movie.douban.com/typerank?type_name=%E5%8A%A8%E4%BD%9C&type=5&interval_id=100:90&action="
-
- headers = {
- 'User-Agent': ''
- }
-
- # 请求对象的定制
- request = urllib.request.Request(url=url, headers=headers)
-
- # 获取响应的数据
- response = urllib.request.urlopen(request)
- content = response.read().decode('utf8')
-
- # 数据下载到本地(open方法默认为gdk版本,如果需要保存汉字,需要设置编码为utf8)
- fp = open('douban.json', 'w', encoding='utf8')
- fp.write(content)
2)获取豆瓣电影前十页
- # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=0&limit=20
- # https://movie.douban.com/j/chart/top_list?type=5&interval_id=100%3A90&action=&start=100&limit=20
-
- import urllib.parse
- import urllib.request
-
-
- def create_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': ''
- }
-
- request = urllib.request.Request(url=url, headers=headers)
-
- return request
-
-
- def get_content(request):
- reponse = urllib.request.urlopen(request)
- content = reponse.read().decode('utf8')
- return content
-
-
- def down_load(page, content):
- with open('douban' + str(page) + '.json', 'w', encoding='utf8') 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)
- import urllib.request
- import urllib.parse
-
-
- def create_request(page):
- base_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=cname'
-
- data = {
- 'cname': '北京',
- 'pid': '',
- 'pageIndex': page,
- 'pageSize': '10'
- }
-
- data = urllib.parse.urlencode(data).encode('utf8')
-
- headers = {
- 'User-Agent': ''
- }
-
- request = urllib.request.Request(url=base_url, headers=headers, data=data)
-
- return request
-
-
- def get_content(request):
- reponse = urllib.request.urlopen(request)
- content = reponse.read().decode('utf8')
- return content
-
-
- def down_load(page, content):
- with open('kfc' + str(page) + '.json', 'w', encoding='utf8') 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)
cookie中携带者个人登录信息,如果有登录之后的cookie,那么我们可以携带者cookie进入到任何页面
- # 适用的场景:在数据采集的时候,需要绕过登录,直接采集数据
- # 个人信息页面是utf8,但是还是报编码错误,因为并没有进入个人信息页面,而是跳转到了登陆页面
- # 那么登录页面不是utf8,所以报错
- # 请求头信息不够,所以访问不成功
- import urllib.request
-
- url = 'https://weibo.com/u/3554714072'
-
- # 模拟浏览器访问——解决ua反爬
- headers = {
- # :authority: weibo.com
- # :method: GET
- # :path: /
- # :scheme: https
- 'accept': '',
- # 可能会导致编码错误
- # 'accept-encoding': '',
- 'accept-language': '',
- 'cache-control': '',
- 'client-version': '',
- 'cookie': '',
- # referer 判断当前路径是不是由上一个路径进来,一般情况下,做图片防盗链
- 'referer': '',
- 'sec-ch-ua': '',
- 'sec-ch-ua-mobile': '',
- 'sec-ch-ua-platform': '',
- 'sec-fetch-dest': '',
- 'sec-fetch-mode': '',
- 'sec-fetch-site': '',
- 'sec-fetch-user': '',
- 'upgrade-insecure-requests': '',
- 'user - agent': ''
- }
-
- # 因为urlopen方法中不能存储字典,所以headers不能传递进去
- # 请求对象的定制(因为参数顺序的问题,不能直接写url和headers)
- request = urllib.request.Request(url=url, headers=headers)
-
- response = urllib.request.urlopen(request)
-
- content = response.read().decode('utf8')
-
- with open('weibo.html', 'w', encoding='utf8') as fp:
- fp.write(content)
- import urllib.request
-
- url = 'http://www.baidu.com/'
-
- headers = {
- 'User-Agent': ''
- }
-
- request = urllib.request.Request(url=url, headers=headers)
-
- # 获取handler对象
- handler = urllib.request.HTTPHandler()
-
- # 获取opener对象
- build_opener = urllib.request.build_opener(handler)
-
- # 调用open方法
- response = build_opener.open(request)
-
- content = response.read().decode('utf8')
-
- print(content)
- import urllib.request
-
- url = 'http://www.baidu.com/s?wd=ip'
-
- headers = {
- 'Accept': '',
- 'Accept-Language': '',
- 'Cache-Control': '',
- 'Connection': '',
- 'Cookie': '',
- 'Host': '',
- 'sec-ch-ua': '',
- 'sec-ch-ua-mobile': '',
- 'sec-ch-ua-platform': '',
- 'Sec-Fetch-Dest': '',
- 'Sec-Fetch-Mode': '',
- 'Sec-Fetch-Site': '',
- 'Sec-Fetch-User': '',
- 'Upgrade-Insecure-Requests': '',
- 'User-Agent': ''
- }
-
- request = urllib.request.Request(url=url, headers=headers)
-
- # response = urllib.request.urlopen(request)
- proxise = {
- 'http': ''
- }
-
- handler = urllib.request.ProxyHandler(proxies=proxise)
- opener = urllib.request.build_opener(handler)
- response = opener.open(request)
-
- context = response.read().decode('utf8')
-
- with open('daili.html', 'w', encoding='utf8') as fp:
- fp.write(context)
- import urllib.request
-
- url = 'http://www.baidu.com/s?wd=ip'
-
- headers = {
- 'Accept': '',
- 'Accept-Language': '',
- 'Cache-Control': '',
- 'Connection': '',
- 'Cookie': '',
- 'Host': '',
- 'sec-ch-ua': '',
- 'sec-ch-ua-mobile': '',
- 'sec-ch-ua-platform': '',
- 'Sec-Fetch-Dest': '',
- 'Sec-Fetch-Mode': '',
- 'Sec-Fetch-Site': '',
- 'Sec-Fetch-User': '',
- 'Upgrade-Insecure-Requests': '',
- 'User-Agent': ''
- }
-
-
- request = urllib.request.Request(url=url, headers=headers)
-
- # response = urllib.request.urlopen(request)
- proxise_pool = [
- {'http': ''},
- {'http': ''},
- ]
-
- import random
- proxies = random.choice(proxise_pool)
- handler = urllib.request.ProxyHandler(proxies=proxies)
- opener = urllib.request.build_opener(handler)
- response = opener.open(request)
-
- context = response.read().decode('utf8')
-
- with open('daili.html', 'w', encoding='utf8') as fp:
- fp.write(context)