3
import urllib.request
url="http://espn.com"
f = urllib.request.urlopen(url)
contents = f.read().decode('latin-1')
q = f.geturl()
print(q)

このコードはhttp://espn.go.com/、リダイレクト Web サイトの URL である を返します。Pythonのドキュメント、グーグルなどを見た後、次の方法もわかりません。

  1. リダイレクトされた Web サイトの URL をキャプチャする (既に機能しています)
  2. 送信リクエストでユーザー エージェントを変更する
  3. Web ページが送り返す可能性があるすべての Cookie を受け入れる

Python 3でこれを行うにはどうすればよいですか? よりも優れたモジュールがあればurllib、私はそれでOKです。

4

2 に答える 2

8

より良いモジュールがあり次のように呼ばれrequestsます:

import requests

session = requests.Session()
session.headers['User-Agent'] = 'My-requests-agent/0.1'

resp = session.get(url)
contents = resp.text  # If the server said it's latin 1, this'll be unicode (ready decoded)
print(resp.url)       # final URL, after redirects.

requestsresp.historyリダイレクトに従います(どのリダイレクトをたどったかを確認してください)。セッション (オプション) を使用すると、Cookie が保存され、後続の要求に渡されます。リクエストごとまたはセッションごとにヘッダーを設定できます(そのため、そのセッションで送信されるすべてのリクエストで、同じ追加のヘッダーが送信されます)。

于 2013-01-04T21:17:38.237 に答える
7

urllib (python3) を使用した簡単なデモ:

#!/usr/bin/env python3
#-*- coding:utf-8 -*-

import os.path
import urllib.request
from urllib.parse import urlencode
from http.cookiejar import CookieJar,MozillaCookieJar

cj = MozillaCookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
urllib.request.install_opener(opener)

cookie_file=os.path.abspath('./cookies.txt')

def load_cookies(cj,cookie_file):
    cj.load(cookie_file)
def save_cookies(cj,cookie_file):
    cj.save(cookie_file,ignore_discard=True,ignore_expires=True)

def dorequest(url,cj=None,data=None,timeout=10,encoding='UTF-8'):
    data = urlencode(data).encode(encoding) if data else None

    request = urllib.request.Request(url)
    request.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)')
    f = urllib.request.urlopen(request,data,timeout=timeout)
    return f.read()

def dopost(url,cj=None,data=None,timeout=10,encoding='UTF-8'):
    body = dorequest(url,cj,data,timeout,encoding)
    return body.decode(encoding)

リダイレクトが発生している場合は、ヘッダーを確認する必要があります (30x)。

于 2013-01-05T09:35:02.970 に答える