1. Знакомство с рептилиями
1.1 Что такое рептилия
Веб-сканеры (также известные как веб-пауки,Интернетробот, вFOAFcommunity, чаще именуемый веб-чейзером) — это система, автоматически сканирующая информацию из всемирной паутины по определенным правилам.программаилисценарий. Другими менее часто используемыми именами являются муравей, автоиндекс, эмулятор или червь.
1.2 Основной процесс сканирования
- Инициировать запрос: используйте библиотеку http, чтобы инициировать запрос к целевому сайту, то есть отправить запрос запроса, включая: заголовок запроса, тело запроса и т. д.
- Получите содержимое ответа: если сервер может нормально ответить, он получит ответ, содержащий: html, json, изображения, видео и т. д.
- Парсинг содержимого: Парсинг html-данных: регулярные выражения, сторонние библиотеки парсинга, такие как Beautifulsoup, pyquery и т. д. => Парсинг json-данных: json-модуль Парсинг бинарных данных: запись файлов в виде b
- Сохранить данные: база данных/файл
2. Процессор ProxyHandler (прокси):
-
Принцип прокси: прежде чем запрашивать целевой сайт, сначала запросите прокси-сервер, а затем позвольте прокси-серверу запросить целевой веб-сайт.После того, как прокси-сервер получит данные целевого веб-сайта, он перенаправит их в наш код.
-
httpbin.org: Этот веб-сайт может легко просматривать некоторые параметры http-запроса.
-
Использовать прокси в коде:
- использовать
urllib.request.ProxyHandler
, передать прокси, прокси - это словарь, ключ словаря зависит от типа, который может получить прокси-сервер, обычно этоhttp
илиhttps
, значениеip:port
. - Используйте созданный на предыдущем шаге
handler
,а такжеrequest.build_opener
Создаватьopener
объект. - Используйте созданный на предыдущем шаге
opener
,перечислитьopen
Функция для инициирования запроса. Пример кода выглядит следующим образом:
- использовать
from urllib import request
url = 'http://httpbin.org/ip'
# 1. 使用ProxyHandler,传入代理构建一个handler
handler = request.ProxyHandler({"http":"223.241.78.43:8010"})
# 2. 使用上面创建的handler构建一个opener
opener = request.build_opener(handler)
# 3. 使用opener去发送一个请求
resp = opener.open(url)
print(resp.read())
3. запросы
Отправить запрос на получение:
Отправьте запрос на получение, позвоните напрямуюrequests.get
Вот и все. Какой запрос вы хотите отправить, вы можете вызвать любой метод.
response = requests.get("https://www.baidu.com/")
Некоторые свойства ответа:
import requests
kw = {'wd':'中国'}
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
# params 接收一个字典或者字符串的查询参数,字典类型自动转换为url编码,不需要urlencode()
response = requests.get("http://www.baidu.com/s", params = kw, headers = headers)
# 查看响应内容,response.text 返回的是Unicode格式的数据
print(response.text)
# 查看响应内容,response.content返回的字节流数据
print(response.content)
# 查看完整url地址
print(response.url)
# 查看响应头部字符编码
print(response.encoding)
# 查看响应码
print(response.status_code)
Разница между response.text и response.content:
- response.content: это данные, полученные непосредственно из сети. без всякой расшифровки. Итак, это байтовый тип. На самом деле все строки, передаваемые на жесткий диск и в сеть, состоят из байтов.
- response.text: это тип данных str, представляющий собой строку, которую декодирует библиотека запросов response.content. Для декодирования необходимо указать метод кодирования, и запросы будут оценивать метод кодирования на основе собственных предположений. Так что иногда могут быть неправильные предположения, которые приведут к искажению символов при декодировании. следует использовать
response.content.decode('utf-8')
Сделайте ручное декодирование.
Отправить запрос на публикацию:
Отправить почтовый запрос очень просто. позвонить напрямуюrequests.post
метод подойдет. Если он возвращает данные json. тогда вы можете позвонитьresponse.json()
для преобразования строки json в словарь или список.
Используйте прокси:
В методе запроса передатьproxies
параметры в порядке.
Обработка файлов cookie:
Если вы хотите поделиться файлами cookie по нескольким запросам. Затем следует использовать сеанс. Пример кода выглядит следующим образом:
import requests
url = "http://www.renren.com/PLogin.do"
data = {"email":"970138074@qq.com",'password':"pythonspider"}
headers = {
'User-Agent': "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36"
}
session = requests.Session()
session.post(url,data=data,headers=headers)
response = session.get('http://www.renren.com/880151247/profile')
with open('renren.html','w',encoding='utf-8') as fp:
fp.write(response.text)