Модуль сетевых запросов сканера
предисловие
Студенты, которые рисовали рептилий, в основном понимают, что рептилии на самом деле представляют собой три оси. Во-первых, определите веб-сайт, который мы хотим сканировать. Во-вторых, инициировать запрос к веб-сайту, проанализировать структуру данных веб-сайта и, в-третьих, просканировать данные и сохранить данные. После того, как три оси закончены, основные потребности наших рептилий удовлетворены. На втором этапе нам нужно инициировать запрос к целевому веб-сайту, Это беспрецедентное преимущество Python, потому что он не только имеет встроенный модуль сетевых запросов urllib, но и известные сторонние запросы модуля сетевых запросов. Все, что было использовано, говорят, хорошо, сегодня мы узнаем о знаниях, связанных с этой главой сетевого модуля.
Встроенный модуль Python urllib
Раньше было очень проблематично импортировать urllib и urllib2 при отправке запроса на веб-сайт в Python2. Есть интеграция в Python3. Мы можем использовать urllib напрямую.
urllib.request
- Часто используемые методы
- urllib.request.urlopen("URL") Функция: инициировать запрос на сайт и получить ответ
- поток байтов = response.read()
- Строка = ответ.прочитать().декодировать("utf-8")
- urllib.request.Request "URL", headers="dictionary") urlopen() не поддерживает рефакторинг User-Agent
import urllib.request
response = urllib.request.urlopen('https://www.baidu.com')
# read()方法把响应对象里面的内容读取出来
print(response.read())
Результаты
По результату выполнения нетрудно увидеть, что то, что мы сейчас получаем, — это поток байтов, то есть данные типа bytes. Затем в это время мы можем преобразовать данные типа байтов в данные типа str с помощью decode().
html = response.read().decode('utf-8')
print(type(html),html)
Результаты
Таким образом, мы просто инициируем запрос, как веб-сайт, и получаем его ответные данные. Далее мы должны подумать об этом противодействии лазанию. Мы говорим, что самый простой антилазинг — это User-Agent. Но метод urlopen() не поддерживает u-a. Тогда давайте поговорим о другом методе,urllib.request.Request (Добавить пользовательский агент)
import urllib.request
# 请求百度的数据(网页源码)
url = 'https://www.baidu.com/'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
# 1. 创建请求对象(构建 User-Agent)
response = urllib.request.Request(url,headers=headers)
# 2. 获取响应对象(urlopen())
res = urllib.request.urlopen(response)
# 3. 读取响应对象的内容(read().decode('utf-8'))
html = res.read().decode('utf-8')
print(html)
Теперь мы можем обобщить использование
1. Используйте метод Request() для создания объекта запроса.
2. Используйте метод urlopen() для получения объекта ответа.
3. Используйте read().decode("utf-8") объекта ответа, чтобы получить содержимое
- Методы объекта ответа (response)
- read() читает содержимое ответа сервера
- getcode() возвращает код ответа HTTP
- geturl() возвращает URL фактических данных (предотвращает проблемы с перенаправлением)
print(res.getcode())
print(res.geturl())
Результаты
urllib.parse
- Общий метод
- urlencode(словарь)
- цитата (строка)
Что делают эти два метода? Мы знаем, что браузеры не распознают китайский язык. Хотя китайский язык отображается в URL-адресе, на самом деле его обрабатывает браузер. Например, скопируем этот URL и посмотрим на него через PyCharm
Что это за ситуация? Когда мы запрашиваем URL-адрес в браузере, браузер кодирует URL-адрес.За исключением английских букв, цифр и некоторых символов, все остальные кодируются знаком процента + шестнадцатеричным. Поэтому при написании кода нам иногда приходится вручную кодировать китайский язык.
import urllib.parse
name = {'wd':'海贼王'}
name = urllib.parse.urlencode(name)
print(name)
r = '海贼王'
result = urllib.parse.quote(r)
print(result)
Запросы модуля сторонних сетевых запросов
В преддверии известного модуля запросов студенты, которые узнали о сканерах, не будут незнакомы. Как и его введение, пусть HTTP служит людям. Без лишних слов, приступим к обучению
Установить
Поскольку модуль запросов является сторонним, нам необходимо его установить. Здесь рекомендуется использовать способ смены источника для установки Здесь мы берем источник Douban в качестве примера.
pip install requests -i https://pypi.douban.com/simple
Это очень быстро установить, изменив источник. После того, как подготовительная работа завершена, следующий шаг становится намного проще.
Общие методы запроса
- запросы.получить(url)
import requests
# 发送请求获得响应结果
response = requests.get('https://www.baidu.com/')
print(response)
Результаты
Таким образом, мы просто инициируем запрос к Baidu и получаем объект ответа Response. Он вернул нам код состояния. 200 означает, что запрос выполнен успешно. Наш запрос get может запрашивать не только веб-сайт. Вы также можете добавить параметр params. Например, заголовок запроса заголовков
import requests
# 添加user-agent
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
# 发送请求获得响应结果
response = requests.get('https://www.baidu.com/',headers=headers)
print(response)
Например, я хочу передать Китай в URL-адресе, мы подумали, что нам нужно закодировать его с помощью urlencode. Но в модуле запросов все не так сложно. Как показано ниже
import requests
# 添加user-agent
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
kw = {'kw':'中国'}
# 发送请求获得响应结果
response = requests.get('https://www.baidu.com/',params=kw,headers=headers)
print(response.text)
Результаты
метод ответа
Мы хотим инициировать запрос к веб-сайту, что мне делать, если я хочу получить данные веб-страницы? На самом деле это не сложно, в этом нам помог модуль запросов
print(response.text) 返回的数据是str
print(response.content) 返回的数据是bytes
Хотя метод response.text может получить данные веб-страницы, часто появляются искаженные китайские символы. В настоящее время мы используем другой способ получения данных веб-страницы.response.content.decode('utf-8').Этот метод получения исходного кода веб-страницы может очень хорошо решить проблему искажения китайских символов.
Некоторые учащиеся могут сомневаться в том, что response.content не возвращает данные потока байтов. Так как же могут появиться данные типа str?
Первой реакцией каждого является то, что один печатает строку, а другой печатает данные потока байтов. Во-первых, responses.content — это данные, полученные непосредственно с сайта, без какой-либо обработки, то есть без какого-либо кодирования. Во-вторых, response.text — это строка, полученная после того, как модуль запросов декодирует response.content. Затем учащиеся думают о том, нужен ли для декодирования указанный метод. Но мы не указали здесь метод декодирования, но библиотека запросов может угадать один из наших методов декодирования. Поэтому, когда вы используете response.text для запроса содержимого ответа, будут искаженные символы. В настоящее время мы можем использовать respons.content, чтобы вручную указать декодирование respons.content.decode('utf-8')
import requests
# 添加user-agent
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
}
kw = {'kw':'中国'}
# 发送请求获得响应结果
response = requests.get('https://www.baidu.com/',params=kw,headers=headers)
print(response.content.decode('utf-8'))
запросы отправить почтовый запрос
Просто сейчас все запросы на получение отправлены с запросами. Итак, давайте воспользуемся словарем для отправки почтовых запросов.
Почтовый запрос должен содержать данные, которые обычно имеют вид
Это данные в нашей форме. Эти данные не будут отображаться в URL-адресе. Затем мы отправим почтовый запрос через модуль запросов, чтобы передать данные для создания небольшого программного обеспечения. Код непосредственно прикреплен ниже
import requests
import json
key = input('请输入您要翻译的内容:')
data = {
'i': key,
'from': 'AUTO',
'smartresult': 'dict',
'client': 'fanyideskweb',
'salt': '15880623642174',
'sign': 'c6c2e897040e6cbde00cd04589e71d4e',
'ts': '1588062364217',
'bv': '42160534cfa82a6884077598362bbc9d',
'doctype': 'json',
'version': '2.1',
'keyfrom':'fanyi.web',
'action': 'FY_BY_CLICKBUTTION'
}
url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule'
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36'
}
# 携带数据发送请求
res = requests.post(url,data=data,headers=headers)
res.encoding = 'utf-8'
# 获取数据
html = res.text
# 转化成字典类型
r_dict = json.loads(html)
# 数据解析
content = r_dict['translateResult'][0][0]['tgt']
print(content)
Результаты
Cookie
Cookie — это очень важные данные, их роль выражается в двух аспектах.
- Имитация входа
- Некоторые веб-сайты используют файлы cookie, предотвращающие сканирование.
Так что же такое файлы cookie?
Далее цитата из интернета
Файлы cookie, иногда во множественном числе Файлы cookie относятся к данным (обычно зашифрованным), которые некоторые веб-сайты хранят на локальном терминале пользователя, чтобы идентифицировать личность пользователя и выполнять отслеживание сеанса. обычно используется, когда мы посещаем определенные веб-страницы, чтобы подсказать нам, нужно ли нам сохранить имя пользователя и пароль.При следующем входе в систему вы можете войти автоматически без повторного входа в систему.
С момента появления технологии cookie она стала предметом споров среди веб-пользователей и веб-разработчиков. Некоторые интернет-пользователи, в том числе некоторые высокопоставленные веб-эксперты, также недовольны его созданием и продвижением, но не потому, что функция технологии cookie слишком слаба или по другим причинам с технической производительностью, а потому, что использование cookie влияет на пользователей интернета. Конфиденциальность представляет опасность. Поскольку файл cookie представляет собой небольшой текстовый файл, сохраняемый веб-сервером в браузере пользователя, он содержит информацию о пользователе.
После приблизительного понимания файла cookie, давайте взглянем на его первую роль.Имитация входаНапример, Zhihu теперь находится в состоянии входа в систему, и выбран столбец в списке «горячих».
Затем мы можем искать файлы cookie через NetWork. Используйте информацию из файлов cookie для имитации входа в систему.
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36',
'cookie': '_xsrf=1SMkDEbBof93pTCRd5MmPz8cmmOuAsaU; _zap=3a8fd847-c5d4-45cf-84a3-24d508f580f6; _ga=GA1.2.2058930090.1594280819; d_c0="AICeuVa2jBGPTuvzpsC3VFkq3TulCqxCfNQ=|1594280816"; z_c0="2|1:0|10:1594901209|4:z_c0|92:Mi4xRjdYeENBQUFBQUFBZ0o2NVZyYU1FU1lBQUFCZ0FsVk4yWkQ5WHdBbzV5TkZwYUs4a0RpNWdRUms2Yy1OQlRkaER3|3e67794db7e5f5ec768144d12fdac5ddf9be6d575cf0da3081bd59c5fd132558"; tshl=; tst=h; Hm_lvt_98beee57fd2ef70ccdd5ca52b9740c49=1600419464,1600765648,1600867068,1601108280; Hm_lpvt_98beee57fd2ef70ccdd5ca52b9740c49=1601108280; _gid=GA1.2.809449579.1601108280; KLBRSID=9d75f80756f65c61b0a50d80b4ca9b13|1601108281|1601108278; SESSIONID=sP67fUKhcmoakcsAU5RzS0NBNUzVG9ocD2JR2F5BsgF; JOID=VF4SAULnQMqzo0LPa-OP2bVp1097lBH5j8oXhQaLLaTXwy68K9-9quisQ8tlyVRuZgOhBpkxYtdJhmXXDe_IHYo=; osd=V1wTC0_kQsu5rkHNaumC2rdo3UJ4lhDzgskVhAyGLqbWySO_Kd63p-uuQsFoylZvbA6iBJg7b9RLh2_aDu3JF4c='
}
url = 'https://www.zhihu.com/hot'
res = requests.get(url, headers=headers)
with open('zhihu.html','w',encoding='utf-8') as f:
f.write(res.text)
Этот html-файл можно открыть через браузер
Давайте посмотрим на вторую роль файлов cookie.Анти-подъем
На картинке ниже показан список поездов из Пекина в Шанхай. Этот список поездов является данными, полученными с помощью ajax-запроса.
Итак, как мы хотим получить этот список поездок через поисковый робот? Первый способ может быть через селен, мы объясним эту технологию в следующей статье. Второй способ анализа своего интерфейса данных
После анализа данных в результате
Затем легко сделать следующее: мы можем напрямую запросить URL-адрес этого интерфейса данных.
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'
}
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2020-11-27&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT'
res = requests.get(url,headers=headers)
print(res.content.decode('utf-8'))
Результаты
Этот результат, очевидно, не то, что мы хотим. В это время давайте попробуем добавить печенье
import requests
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36','Cookie':'_uab_collina=159490169403897938828076; JSESSIONID=9CCC55A5791112A1D991D16D05B8DE6C; _jc_save_wfdc_flag=dc; _jc_save_fromStation=%u5317%u4EAC%2CBJP; BIGipServerotn=1206911498.38945.0000; BIGipServerpool_passport=149160458.50215.0000; RAIL_EXPIRATION=1606609861531; RAIL_DEVICEID=Q2D75qw5BZafd0LCbLz0B0CWC8cdKlDp8taGuqQjNvLGk3cYKCg1Y4KoXbWHpTmr6iY988VhF0wHULKY9RimC4dWVelVHcf94Q3FRxQ0LfbzRqvTvC19gq7XNKs0aQgeBhCZ5dVfllX8gW5GHSoeQ10di_JL7sLg; route=6f50b51faa11b987e576cdb301e545c4; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_fromDate=2020-11-27; _jc_save_toDate=2020-11-25'
}
url = 'https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO.train_date=2020-11-27&leftTicketDTO.from_station=BJP&leftTicketDTO.to_station=SHH&purpose_codes=ADULT'
res = requests.get(url,headers=headers)
print(res.content.decode('utf-8'))
Результаты
Session
Личность пользователя определяется информацией, записанной на сервере. Этот сеанс здесь относится к сеансу, а не к сеансу в Интернете, о котором мы говорим. Все здесь должны четко понимать Прежде всего, зачем вам нужно поддерживать сессию? Объект сеанса библиотеки запросов может поддерживать определенные параметры между запросами.Проще говоря, например, если вы успешно вошли на веб-сайт с помощью сеанса, прежде чем снова использовать объект сеанса для запроса других страниц веб-сайта, сеанс будут использоваться по умолчанию. Такие параметры, как используемые файлы cookie
В частности, он чаще всего используется при сохранении состояния входа в систему. При сканировании некоторых веб-сайтов или приложений иногда принудительно выполняется вход, а иногда данные, возвращаемые без входа, являются поддельными или неполными данными, тогда мы этого не делаем. необходимо входить в систему каждый раз, когда вы запрашиваете, вам нужно использовать функцию поддержания сеанса, мы можем войти только один раз, а затем сохранить это состояние, чтобы сделать другие или несколько запросов