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
стоимость.