Подробное объяснение запросов в общих библиотеках поисковых роботов Python.

задняя часть Python GitHub рептилия

Это 11-я оригинальная статья для ежедневного изучения Python.


После использования библиотеки URLLIB возникают проблемы.Например, для получения файла cookie требуется несколько шагов, кода больше, это и стиль Python кажутся немного менее похожими на ха, есть ли более простая библиотека для запроса? Ответ — да, это сторонняя библиотека.requests, автор этой библиотеки известенkennethreitz, причина создания этой библиотеки — упростить разработчикам Python инициирование и обработку запросов. В нем также есть имя:HTTP for Humans, Как следует из названия, он используется для запроса http. Если вы хотите увидеть исходный код, вы можете найти его имя на github, и вы сможете его увидеть.


Далее давайте представим, как использовать эту библиотеку!


(Эта статья изначально была опубликована в публичном аккаунте [Daily Learning Python])


Поскольку это сторонняя библиотека, нам нужно загрузить ее и ввести ее в командную строку

pip install requests

Если вы установили анакоду, можете игнорировать это


После установки давайте использовать его


1выполнять простые операции

отправить запрос на получение

# 发送请求
import requests
response = requests.get('http://httpbin.org/get')
# 获取返回的html信息
print(response.text)

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

response.encoding = 'utf-8'

После завершения спецификации вы можете нормально кодировать, если знаете тип кодировки веб-страницы.


Из вышеперечисленного мы также можем получить следующую информацию

print(response.headers)
# 请求状态码
print(response.status_code)
# 获取网页的二进制内容
print(response.content)
print(response.url) # 获取请求的url
print(response.cookies) # 获取cookie

Как вы думаете, это очень просто, достаточно одной строчки кода. Больше никаких шагов кода или чего-то еще.


Далее отправляется запрос на подъем по полосе запросов

# 还可以添加请求头进行请求
headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.186 Safari/537.36'}
response = requests.get('httpbin.org/get', headers=headers )
print(response.headers)
print(response.text)

Добавление заголовка запроса — это просто добавление параметра ключевого слова


Вы также можете сделать запрос на получение с параметрами

# 进行带参数的get请求
data = {'name': 'june', 'password': 123456}
response = requests.get('http://httpbin.org/get', params=data)
print(response.text)



Что делать, если вам нужно войти в систему? Как отправить почтовый запрос? Скажу вам, это все еще очень просто

# 进行post请求
data = {'name': 'june', 'password': 123456}
response = requests.post('http://httpbin.org/post', data=data, headers=headers)
print(response.text)

Это очень просто, но также добавьте параметр ключевого слова данных и опубликуйте параметры входа для отправки.


В дополнение к вышеупомянутым двум запросам, можно ли сделать другие запросы? Я очень рад сообщить вам, да. Например, вы хотите отправить такой запрос на размещение

requests.put()
requests.delete()

Это для отправки запросов на размещение и запросов на удаление, и другие запросы отправляются таким же образом, поэтому я не буду рассказывать о них по одному.



2Сделать сложные запросы


При входе нам иногда нужно ввести проверочный код, так как его потерять? Сканер не видит веб-страницу. Самый простой способ — загрузить изображение кода подтверждения и ввести его вручную. Так как же нам его загрузить? Мы можем отправить запрос на URL-адрес этого изображения, а затем сохранить возвращенный контент в файле двоичным методом.


код показывает, как показано ниже:

# 从网上读取二进制数据,比如图片
response = requests.get('https://www.baidu.com/img/bd_logo1.png', headers=headers)
# 这个是直接获取字节码,这个是要保存的文件
print(response.content)
# 这个是获取解码后的返回内容,这个是乱码
print(response.text)
# 用文件来把图片下载下来
with open('baidu.png', 'wb') as f: # 注意写的方式是以二进制方式写入
f.write(response.content)
print('下载完毕')


Все еще очень просто, я должен сказать, что эта библиотека очень полезна.


Когда нам нужно загрузить файл, например изображение, мы также можем использовать метод post для его отправки.

# 上传文件
files = {'picture': open('baidu.png', 'rb')}
response = requests.post('http://httpbin.org/post', files=files)
print(response.text)


Получите файл cookie и просто обработайте его

# 获取cookie
response = requests.get('https://www.baidu.com')
for k, v in response.cookies.items():
print(k, '=', v)


Когда возвращается веб-страница, является форматом JSON, нам не нужно использовать библиотеку JSON для разрешения, мы можем использовать метод запросов для анализа, эффект такой же.

# 解析json
j = response.json() # 可以用json库来解析,结果一样



При сохранении данных для входа в библиотеку urllib необходимо сохранить файл cookie, но в библиотеке запросов нам нужно использовать толькоrequests.session()Просто сохраните информацию.

# 用会话来保持登陆信息
session = requests.session()
response = session.get('http://httpbin.org/cookies/set/number/123456')
print(response.text)


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



Когда веб-сайт небезопасен и требует подтверждения с помощью сертификата, например, этот веб-сайт

https://www.12306.cn



В настоящее время, чтобы получить доступ к содержимому веб-сайта внутри, нам нужно проверить, что код выглядит следующим образом.

# 证书验证
response = requests.get('https://www.12306.cn', verify=False) # 不加这个关键字参数的话会出现验证错误问题,因为这个网站的协议不被信任

Это даст доступ, но будет предупреждение

E:\anaconda\lib\site-packages\urllib3\connectionpool.py:858: InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings
InsecureRequestWarning)

Если вам не кажется это красивым, мы также можем добавить в запрос параметр ключевого слова cert, значением которого является доверенный сертификат, кортеж, а также номер учетной записи и пароль и т. д., что здесь не будет продемонстрировано.


Мы также можем сделать это

from requests.auth import HTTPBasicAuth
# 设置认证
# requests.get('需要认证的网址', auth=HTTPBasicAuth('user', 'passwd')) # 由于找不到需要认证的网址,所以先写个主体
# 还可以这样认证
# requests.get('需要认证的网址', auth=('user', 'passwd')) # 这样就简单点

Поскольку я не могу найти сайт, требующий аутентификации, я не буду его показывать.


запросы также могут использовать прокси-IP для запроса веб-сайтов, чтобы предотвратить блокировку IP-адреса, чтобы вы не могли сканировать. Использование прокси ip также намного проще, чем библиотека urllib, код выглядит следующим образом:

# 设置代理
proxies = {'http': 'http://122.114.31.177:808',
'https': 'https://119.28.223.103:8088'}
# 在请求时添加上列代理
response = requests.get('http://httpbin.org/get', proxies=proxies)
print(response.text)

Приведенный выше формат словаря требует взаимно однозначного соответствия, а затем к запросу добавляются прокси-параметры ключевого слова.


3Запросить обработку исключений


Когда программа запущена, она будет принудительно остановлена ​​при возникновении ошибки.Если вы хотите продолжить работу, вам нужно перехватить исключение, чтобы программа продолжала работать.


В библиотеке Requests есть библиотека аномальных библиотек Requests.Exceptions


Здесь мы просто имеем дело с обработкой таймаута запроса

import requests
from requests.exceptions import ReadTimeout, ConnectTimeout, HTTPError, ConnectionError, RequestException
# 捕捉异常
try:
response = requests.get('http://httpbin.org/get', timeout=0.1) # 规定时间内未响应就抛出异常
print(response.text)
except ReadTimeout as e:
print('请求超时')
except ConnectionError as e:
print('连接失败')
except RequestException as e:
print('请求失败')


Здесь перехватываются три исключения, поскольку ReadTimeout является подклассом ConnectionError, поэтому сначала захватите ReadTimeout, а затем захватите родительский класс. И ConnectionError и RequestException одинаковы


Дополнительные сведения об обработке исключений см. в документации.


4Наконец

Выше приведены все мои заметки во время изучения и некоторые ямки, с которыми я столкнулся при их использовании. Надеюсь, они будут вам полезны. Если вы хотите увидеть больше использования, вы можете перейти к официальной документации. Я также разместил код на github, вы можете проверить его, если хотите.


Гитхаб:GitHub.com/Серджио Джун/…

Официальная документация:docs.Python-requests.org/this_cn/latshan…

Учебные ресурсы: https://edu.hellobi.com/course/157





1803114089.png


Изучайте Python каждый день

Публичный аккаунт, ориентированный на python