Использование URL-адреса Python (1)

рептилия


urllibЭто пакет, поставляемый с python, который в основном используется для поисковых роботов (это то, с чем я временно столкнулся). Сканеры также называются веб-пауками, и их основная функция заключается в получении данных веб-страницы.urllibСодержит четыре модуля.requestИспользуется для имитации отправки запросов,errorМодуль обработки исключений.parseОбеспечить обработку URL,robotparserОбработайте reboot.txt веб-сайта. Сегодня только один урокrequest, Ведь я работаю сверхурочно.

Сканирование данных веб-сайта

использоватьrequestПолучите содержимое домашней страницы Python:

import urllib.request
 
response = urllib.request.urlopen('https://www.python.org')
print(response.read().decode('utf-8'))
 

Две строки кода, чтобы легко получить исходный код веб-страницы

использоватьprint(type(response)), мы видим, что результат печатиHTTPResponse, мы можем получить отHTTPResponseКакие данные вы получили?HTTPResponseИсходный код:

        self.headers = self.msg = None
 
        # from the Status-Line of the response
        self.version = _UNKNOWN # HTTP-Version
        self.status = _UNKNOWN  # Status-Code
        self.reason = _UNKNOWN  # Reason-Phrase
 
        self.chunked = _UNKNOWN         # is "chunked" being used?
        self.chunk_left = _UNKNOWN      # bytes left to read in current chunk
        self.length = _UNKNOWN          # number of bytes left in response
        self.will_close = _UNKNOWN      # conn will close at end of response
 
 

Как показано, мы можем получитьheaders,version,status,reason,chunked,chunk_left,lengthи другие свойства. Можете распечатать, если интересно.

Что делать, если в приведенном выше коде вы хотите добавить другие параметры, такие как загрузка данных тела запроса. посмотриrequestизurlopen()метод.

def urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,
            *, cafile=None, capath=None, cadefault=False, context=None):
 

Помимо передачи URL-адреса, вы также можете загрузить данные запроса, время ожидания, сертификат и т. д. и протестировать их с помощью IP-интерфейса Taobao:

import urllib.parse
import urllib.request
 
data = bytes(urllib.parse.urlencode({'ip': '63.223.108.42'}), encoding='utf8')
response = urllib.request.urlopen('http://ip.taobao.com/service/getIpInfo.php', data=data)
print(response.read())
 

результат:

{
    "code": 0,
    "data": {
        "ip": "63.223.108.42",
        "country": "\xe7\xbe\x8e\xe5\x9b\xbd",
        "area": "",
        "region": "\xe5\x8d\x8e\xe7\x9b\x9b\xe9\xa1\xbf",
        "city": "\xe8\xa5\xbf\xe9\x9b\x85\xe5\x9b\xbe",
        "county": "XX",
        "isp": "\xe7\x94\xb5\xe8\xae\xaf\xe7\x9b\x88\xe7\xa7\x91",
        "country_id": "US",
        "area_id": "",
        "region_id": "US_WA",
        "city_id": "US_1107",
        "county_id": "xx",
        "isp_id": "3000107"
    }
}
 

Я получил нужные мне данные, но что делать, если я хочу добавить заголовки запросов?В приведенном выше методе нет этого параметра, вы можете использовать сборкуrequestспособ добавления информации заголовка запроса. Посмотрите вниз.

запрос на сборку

Первый взглядrequestОсновное использование , видно, что теперь запрос отправляется не напрямую, передавая параметр url, а обертываяrequestПуть.

import urllib.request
 
request = urllib.request.Request('https://python.org')
response = urllib.request.urlopen(request)
print(response.read().decode('utf-8'))
 

посмотри сноваRequestМетод конструктора:

   def __init__(self, url, data=None, headers={},
                 origin_req_host=None, unverifiable=False,
                 method=None):
 

  • data: тело запроса данных
  • headers: заголовок запроса
  • origin_req_host: Текущий IP-адрес, который используется для маскировки IP-адреса при работе сканера.
  • unverifiable: если запрос не поддается проверке, значение по умолчанию равно false.
  • method: укажите метод запроса, например GET, POST, PUT...

Или используйте интерфейс Taobao, посмотрите на использование, слишком ленив, чтобы написать интерфейс:

from urllib import request,parse
 
url = 'http://ip.taobao.com/service/getIpInfo.php'
headers = {
    'User-Agent':'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)',
    'Host':'hip.taobao.com'
}
dict1 = {
    'ip':'63.223.108.42'
}
data = bytes(parse.urlencode(dict1),encoding='utf-8')
req = request.Request(url=url,data=data,headers=headers,method='GET')
response = request.urlopen(req)
print(response.read().decode('utf-8'))
 

Опять же, мы все еще можем получить данные выше. Теперь вы можете добавить информацию заголовка.Если вы хотите реализовать аутентификацию, обработку файлов cookie и т. д., описанный выше метод не может этого обработать, перейдите к следующему.

Handler

urllibиспользоватьhandlerДля обработки этих операций для разных функций есть разныеhandler, Такие как обработка печенья, сертификация, прокси и т. Д.handlerоба наследуют от базового классаBaseHandler.

  • HTTPDefaultErrorHandler: обрабатывать ошибки HTTP
  • HTTPRedirectHandler: обрабатывать перенаправление
  • HTTPCookieProcessor: обрабатывать куки
  • ProxyHandler: обрабатывать прокси
  • HTTPPasswordMgr: Административный пароль
  • HTTPBasicAuthHandler: Сертификация менеджмента

Еще кое-что можно найти вBaseHandlerПосмотреть в.

авторизоваться

Обработчик — это логика обработки, которую мы используем для отправки запроса.OpenerDirector. мы используемOpenerDirectorУпаковкаhandler, а затем отправить запрос на сервер. Перейдите непосредственно к исходному коду:

from urllib.request import HTTPPasswordMgrWithDefaultRealm,HTTPBasicAuthHandler,build_opener
from urllib.error import URLError
 
username = 'username'
password = 'password'
url = 'https://jenkins.labradors.work/login?from=%2F'
p = HTTPPasswordMgrWithDefaultRealm()
p.add_password(None,url,username,password)
auth_handler = HTTPBasicAuthHandler(p)
opener = build_opener(auth_handler)
 
try:
    result = opener.open(url)
    html = result.read().decode('utf-8')
    print(html)
except URLError as e:
    print(e.reason)
 
 

Оберните имя пользователя и пароль вHTTPPasswordMgrWithDefaultRealm, а потомHTTPPasswordMgrWithDefaultRealmупаковано какHTTPBasicAuthHandler, наконец черезOpenerDirectorпослать запрос.

играет роль

from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener
 
proxy_handler = ProxyHandler({
    'http': 'http://127.0.0.1:1086',
    'https': 'https://127.0.0.1:1086'
})
opener = build_opener(proxy_handler)
try:
    response = opener.open('https://www.baidu.com')
    print(response.read().decode('utf-8'))
except URLError as e:
    print(e.reason)
 

Создайте прокси локально, запустите на порту 1086, используйтеProxyHandlerЗаверните его, затем отправьте данные...

Cookies

import http.cookiejar, urllib.request
 
cookie = http.cookiejar.CookieJar()
handler = urllib.request.HTTPCookieProcessor(cookie)
opener = urllib.request.build_opener(handler)
response = opener.open('http://www.baidu.com')
for item in cookie:
    print(item.name+"="+item.value)
 

использоватьHTTPCookieProcessorПостроитьopenerОтправьте данные и, наконец, распечатайте всеcookieстоимость.