前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >python中urllib的使用

python中urllib的使用

原创
作者头像
小白学大数据
发布2023-05-25 16:20:28
2780
发布2023-05-25 16:20:28
举报
文章被收录于专栏:python进阶学习

urllib库是Python中一个最基本的网络请求库。可以模拟浏览器的行为,向指定的服务器发送一个请求,并可以保存服务器返回的数据。

在Python3的urllib库中,所有和网络请求相关的方法,都被集到urllib.request模块下面了,以先来看下urlopen函数基本的使用:

代码语言:javascript
复制
from urllib import request
resp = request.urlopen('http://www.baidu.com')
print(resp.read())

这里我们通过使用urllib库来获取豆瓣读书评论数据为实践项目。

像豆瓣这样的网站会检测某一段时间某个IP的访问次数(通过流量统计,系统日志等),如果访问次数多的不像正常人,它会禁止这个IP的访问。所以我们可以设置一些代理服务器,每隔一段时间换一个代理,就算IP被禁止,依然可以换个IP继续爬取。豆瓣爬取还需要进行账号登陆后才能进行相应的操作,这里就会涉到如何控制一个代理IP怎么进行登陆爬取等一系列操作并且不换IP。

这种情况我们可以通过使用python+urllib2+Proxy-Tunnel保持IP不变,同时通过多线程处理urllib中通过ProxyHandler来设置使用代理服务器,下面代码说明如何实现这些需求。

代码语言:javascript
复制
#! -- encoding:utf-8 -- import requests # 导入requests库 import random import threading # 导入threading库,用于多线程

#要访问的目标页面
targetUrlList = [ “https://httpbin.org/ip”, “https://httpbin.org/headers”, “https://httpbin.org/user-agent”, ]

#代理服务器(产品官网 www.16yun.cn)
proxyHost = “t.16yun.cn” proxyPort = “31111”

#代理验证信息
proxyUser = “16yun” proxyPass = “16ip”

proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}" # 使用f-string格式化字符串

#设置 http和https访问都是用HTTP代理
proxies = { “http”: proxyMeta, “https”: proxyMeta, }

#设置IP切换头
tunnel = random.randint(1, 10000) headers = {“Proxy-Tunnel”: str(tunnel)}

#定义一个变量,用于统计请求次数
request_count = 0

#定义一个锁对象,用于保护请求次数的变量
lock = threading.Lock()

#定义一个函数,用于发起请求和打印响应
def get_url(url): global request_count # 声明全局变量 r = requests.get(url, proxies=proxies, headers=headers) # 使用requests库发起请求,传入代理和头信息 # 判断状态码是否为200,如果不是,打印错误信息 if r.status_code == 200: print(r.text) # 打印响应内容 else: print(f"请求失败,状态码为{r.status_code}") # 打印错误信息 # 获取锁,如果锁被占用,就等待,直到锁释放 lock.acquire() request_count += 1 # 请求次数加一 # 释放锁,让其他线程可以获取锁 lock.release()

#定义一个列表,用于存放线程对象
threads = []

#访问三次网站,使用相同的tunnel标志,均能够保持相同的外网IP
for i in range(3): for url in targetUrlList: t = threading.Thread(target=get_url, args=(url,)) # 创建线程对象,传入url参数 threads.append(t) # 将线程对象添加到列表中

#启动所有线程
for t in threads: t.start()

#等待所有线程结束
for t in threads: t.join()

#打印请求次数
print(f"总共请求了{request_count}次")

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档