풀어 주다: 2023-07-25 14:08:04
앞으로
852명이 탐색했습니다.

1. URL 조작

urllib은 URL을 조작하기 위한 일련의 함수를 제공합니다. 관련 콘텐츠를 분류합니다.


2.Get()

urllib's요청request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:

例如,对豆瓣的URLhttps://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078 모듈은 URL 콘텐츠를 쉽게 캡처할 수 있습니다. 즉, 지정된 페이지에 GET 요청을 보낸 다음 HTTP 응답을 반환합니다. 예를 들어 Douban

https://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078🎜🎜크롤링하고 응답 반환: 🎜🎜🎜🎜

from urllib import request


with request.urlopen('https://api.growingio.com/v2/22c937bbd8ebd703f2d8e9445f7dfd03/web/pv?stm=1593747087078') as f:
    data = f.read()
    print('Status:', f.status, f.reason)
    for k, v in f.getheaders():
        print('%s: %s' % (k, v))
    print('Data:', data.decode('utf-8'))
로그인 후 복사

HTTP 응답의 헤더와 JSON 데이터를 볼 수 있습니다.

GET 요청을 보내는 브라우저를 시뮬레이션하려면 <을 사용해야 합니다. 코드 스타일="상자 -크기: 경계 상자; 글꼴 계열: var(--monospace); 수직 정렬: 초기; 경계 너비: 1px; 경계 스타일: 솔리드; 경계 색상: rgb(231, 234 , 237);배경 -색상: rgb(243, 244, 244);테두리 반경: 3px;패딩 오른쪽: 2px;패딩 왼쪽: 2px;글꼴 크기: 0.9em;">요청Request对象,通过往Request对象添加HTTP头,就可以把请求伪装成浏览器。例如,模拟iPhone 6去请求豆瓣首页:

from urllib import request


req = request.Request(&#39;http://www.douban.com/&#39;)
req.add_header(&#39;User-Agent&#39;, &#39;Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25&#39;)
with request.urlopen(req) as f:
    print(&#39;Status:&#39;, f.status, f.reason)
    for k, v in f.getheaders():
        print(&#39;%s: %s&#39; % (k, v))
    print(&#39;Data:&#39;, f.read().decode(&#39;utf-8&#39;))
로그인 후 복사

这样豆瓣会返回适合iPhone的移动版网页:


三、Post()

如果要以POST发送一个请求,只需要把参数data 객체, 요청</ code><br/></p> 개체에 HTTP 헤더를 추가하면 요청을 브라우저로 위장할 수 있습니다. 예를 들어 iPhone 6을 시뮬레이션하여 Douban 홈페이지를 요청합니다: 🎜🎜🎜🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:python;toolbar:false;">from urllib import request, parse print(&amp;#39;Login to weibo.cn...&amp;#39;) #电子邮件 email = input(&amp;#39;Email: &amp;#39;) #密码 passwd = input(&amp;#39;Password: &amp;#39;) #相关的参数 login_data = parse.urlencode([ (&amp;#39;username&amp;#39;, email), (&amp;#39;password&amp;#39;, passwd), (&amp;#39;entry&amp;#39;, &amp;#39;mweibo&amp;#39;), (&amp;#39;client_id&amp;#39;, &amp;#39;&amp;#39;), (&amp;#39;savestate&amp;#39;, &amp;#39;1&amp;#39;), (&amp;#39;ec&amp;#39;, &amp;#39;&amp;#39;), (&amp;#39;pagerefer&amp;#39;, &amp;#39;https://passport.weibo.cn/signin/welcome?entry=mweibo&amp;r=http%3A%2F%2Fm.weibo.cn%2F&amp;#39;) ]) #网址请求 req = request.Request(&amp;#39;https://passport.weibo.cn/sso/login&amp;#39;) req.add_header(&amp;#39;Origin&amp;#39;, &amp;#39;https://passport.weibo.cn&amp;#39;) #构造User-Agent req.add_header(&amp;#39;User-Agent&amp;#39;, &amp;#39;Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25&amp;#39;) req.add_header(&amp;#39;Referer&amp;#39;, &amp;#39;https://passport.weibo.cn/signin/login?entry=mweibo&amp;res=wel&amp;wm=3349&amp;r=http%3A%2F%2Fm.weibo.cn%2F&amp;#39;) with request.urlopen(req, data=login_data.encode(&amp;#39;utf-8&amp;#39;)) as f: print(&amp;#39;Status:&amp;#39;, f.status, f.reason) for k, v in f.getheaders(): print(&amp;#39;%s: %s&amp;#39; % (k, v)) print(&amp;#39;Data:&amp;#39;, f.read().decode(&amp;#39;utf-8&amp;#39;))</pre><div class="contentsignin">로그인 후 복사</div></div><div class="contentsignin">로그인 후 복사</div></div>🎜<p cid="n13" mdtype="paragraph" style="box-sizing: border-box;line-height: 상속;orphans: 4 ;margin -top: 0.8em;margin-bottom: 0.8em;white-space: pre-wrap;font-family: "Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, "Segoe UI Emoji" ", sans-serif;font-size: 16px;text-align: start;">🎜이러한 방식으로 Douban은 iPhone에 적합한 웹 페이지의 모바일 버전을 반환합니다: 🎜🎜🎜🎜<img src="https: //img.php.cn/upload /article/001/272/559/3cc6e1ba7918c056ef7c4a4c129bd136-2.png"/ alt="" >🎜🎜🎜🎜<h2 cid="n15" mdtype="heading" style="max-width:90%"Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, "Segoe UI Emoji", sans -serif;text-align: start;">🎜Three, Post()🎜</h2>🎜<img src="https://img.php.cn/upload/article /001/272/559/3cc6e1ba7918c056ef7c4a4c129bd136- 3.png"/ alt="" >🎜<p cid="n16" mdtype="paragraph" style="max-width:90%"Open Sans", "Clear Sans", "Helvetica Neue", Helvetica, Arial, "Segoe UI Emoji", sans-serif;font-size: 16px ;text-align: start;">🎜POST로 요청을 보내려면 매개변수만 입력하면 됩니다 🎜🎜<code style="box-sizing: border-box ;글꼴 계열: var(--monospace);세로 정렬: 초기;테두리 너비: 1px;테두리 스타일: 단색;테두리 색상: rgb(231, 234, 237);배경 색상: rgb(243 , 244, 244);border-radius: 3px;padding- right: 2px;padding-left: 2px;font-size: 0.9em;">data🎜🎜는 바이트 단위로 전달됩니다. 🎜🎜🎜

模拟一个微博登录,先读取登录的邮箱和口令,然后按照weibo.cn的登录页的格式以username=xxx&password=xxx的编码传入:

from urllib import request, parse


print(&#39;Login to weibo.cn...&#39;)
#电子邮件
email = input(&#39;Email: &#39;)
#密码
passwd = input(&#39;Password: &#39;)
#相关的参数
login_data = parse.urlencode([
    (&#39;username&#39;, email),
    (&#39;password&#39;, passwd),
    (&#39;entry&#39;, &#39;mweibo&#39;),
    (&#39;client_id&#39;, &#39;&#39;),
    (&#39;savestate&#39;, &#39;1&#39;),
    (&#39;ec&#39;, &#39;&#39;),
    (&#39;pagerefer&#39;, &#39;https://passport.weibo.cn/signin/welcome?entry=mweibo&r=http%3A%2F%2Fm.weibo.cn%2F&#39;)
])
#网址请求
req = request.Request(&#39;https://passport.weibo.cn/sso/login&#39;)
req.add_header(&#39;Origin&#39;, &#39;https://passport.weibo.cn&#39;)
#构造User-Agent
req.add_header(&#39;User-Agent&#39;, &#39;Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25&#39;)
req.add_header(&#39;Referer&#39;, &#39;https://passport.weibo.cn/signin/login?entry=mweibo&res=wel&wm=3349&r=http%3A%2F%2Fm.weibo.cn%2F&#39;)


with request.urlopen(req, data=login_data.encode(&#39;utf-8&#39;)) as f:
    print(&#39;Status:&#39;, f.status, f.reason)
    for k, v in f.getheaders():
        print(&#39;%s: %s&#39; % (k, v))
    print(&#39;Data:&#39;, f.read().decode(&#39;utf-8&#39;))
로그인 후 복사
로그인 후 복사

如果登录成功,获得的响应如下:

如果登录失败,获得的响应如下:


四、Handler

如果还需要更复杂的控制,比如通过一个Proxy去访问网站,需要利用ProxyHandler来处理,示例代码如下:

import urllib.request


# 构建了两个代理Handler,一个有代理IP,一个没有代理IP


httpproxy_handler = urllib.request.ProxyHandler({"https": "27.191.234.69:9999"})


nullproxy_handler = urllib.request.ProxyHandler({})


# 定义一个代理开关


proxySwitch = True 


# 通过 urllib.request.build_opener()方法使用这些代理Handler对象,创建自定义opener对象


# 根据代理开关是否打开,使用不同的代理模式


if proxySwitch:


    opener = urllib.request.build_opener(httpproxy_handler)
else:
    opener = urllib.request.build_opener(nullproxy_handler)




request = urllib.request.Request("http://www.baidu.com/") 


# 1. 如果这么写,只有使用opener.open()方法发送请求才使用自定义的代理,而urlopen()则不使用自定义代理。


response = opener.open(request)


# 2. 如果这么写,就是将opener应用到全局,之后所有的,不管是opener.open()还是urlopen() 发送请求,都将使用自定义代理。


# urllib.request.install_opener(opener)


# response = urllib.request.urlopen(request)




# 获取服务器响应内容


html = response.read().decode("utf-8")
  
# 打印结果


print(html)
로그인 후 복사

如果代理成功返回网址的信息。

URL이 잘못되었거나 프록시 주소가 잘못된 경우 아래 인터페이스로 돌아가세요.


5. 요약

Python 언어를 사용하면 누구나 Python을 더 잘 배울 수 있습니다. urllib에서 제공하는 기능은 프로그램을 사용하여 다양한 HTTP 요청을 수행하는 것입니다. 특정 기능을 완료하기 위해 브라우저를 시뮬레이션하려면 요청을 브라우저로 위장해야 합니다. 위장 방법은 먼저 브라우저에서 보낸 요청을 모니터링한 다음 브라우저의 요청 헤더를 기반으로 이를 위장하는 것입니다. User-Agent 헤더는 브라우저를 식별하는 데 사용됩니다.

위 내용은 의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:Go语言进阶学习
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿