asyncpy
Use asyncio and aiohttp's concatenated web crawler framework
Asyncpy — это лёгкий и эффективный фреймворк для создания веб-краулеров, разработанный на основе asyncio и aiohttp. Он использует архитектурный паттерн scrapy и включает в себя логику обработки данных из некоторых открытых исходных кодов с GitHub.
Использование документации: https://blog.csdn.net/weixin_43582101/article/details/106320674.
Примеры применения: https://blog.csdn.net/weixin_43582101/category_10035187.html.
GitHub: https://github.com/lixi5338619/asyncpy.
PyPI: https://pypi.org/project/asyncpy/.
Python версии 3.6 или выше. Зависимости: ['lxml', 'parsel','docopt', 'aiohttp'].
Установка:
pip install asyncpy
Если установка не удалась, проверьте версию Python. Версия Python должна быть 3.6 и выше.
Если вы всё ещё не можете загрузить пакет, перейдите на [https://pypi.org/project/asyncpy/] и загрузите последнюю версию файла whl. Нажмите Download files, после загрузки используйте команду cmd для установки:
pip install asyncpy-версия-py3-none-any.whl
Введите asyncpy --version в командной строке, чтобы проверить успешность установки.
Создайте файл demo с помощью команды cmd:
asyncpy genspider demo
Настройки | Описание |
---|---|
CONCURRENT_REQUESTS | Количество одновременных запросов |
RETRIES | Количество попыток |
DOWNLOAD_DELAY | Задержка загрузки |
RETRY_DELAY | Задержка повторной попытки |
DOWNLOAD_TIMEOUT | Ограничение по времени |
USER_AGENT | Универсальный пользовательский агент |
LOG_FILE | Путь к файлу журнала |
LOG_LEVEL | Уровень журнала |
PIPELINES | Конвейер |
MIDDLEWARE | Промежуточное ПО |
До версии 1.1.8, если необходимо запустить глобальные настройки, необходимо передать settings через settings_attr в файл spider:
import settings
class DemoSpider(Spider):
name = 'demo'
start_urls = []
settings_attr = settings
В новой версии нет необходимости вручную передавать settings.
Если вам нужно настроить отдельные файлы пауков, вы можете импортировать custom_settings так же, как в scrapy. Это не противоречит settings_attr.
class DemoSpider2(Spider):
name = 'demo2'
start_urls = []
concurrency = 30 # Количество одновременных запросов
custom_settings = {
"RETRIES": 1, # Количество попыток
"DOWNLOAD_DELAY": 0, # Задержка загрузки
"RETRY_DELAY": 0, # Задержка повторной попытки
"DOWNLOAD_TIMEOUT": 10, # Ограничение по времени
"LOG_FILE":"demo2.log" # Файл журнала
}
Добавьте следующие строки в файл настроек:
LOG_FILE = './asyncpy.log'
LOG_LEVEL = 'DEBUG'
Чтобы создать несколько файлов журналов для нескольких пауков, удалите настройки журнала из файла настроек и настройте их снова в custom_settings.
Создайте новый файл middleware с именем demo_middleware и добавьте новые функции. Вы можете выполнять операции, основанные на request.meta и свойствах паука.
from asyncpy.middleware import Middleware
middleware = Middleware()
@middleware.request
async def UserAgentMiddleware(spider, request):
if request.meta.get('valid'):
print("Текущее имя паука:%s"%spider.name)
ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3100.0 Safari/537.36"
request.headers.update({"User-Agent": ua})
@middleware.request
async def ProxyMiddleware(spider, request):
if spider.name == 'demo':
request.aiohttp_kwargs.update({"proxy": "http://123.45.67.89:0000"})
Метод 1: Включите конвейер в файле настроек. (На данный момент рекомендуется использовать метод 2.)
MIDDLEWARE = [
'demo_middleware.middleware',
]
Способ 2: Передайте middleware в start():
from middlewares import middleware
DemoSpider.start(middleware=middleware)
``` **Пользовательские конвейеры**
Если вы определили элемент (в настоящее время поддерживается только формат словаря), и в настройках включены конвейеры, то вы можете написать код для подключения к базе данных и вставки данных в конвейерах.
**В файле spider:**
```python
item = {}
item['response'] = response.text
item['datetime'] = '2020-05-21 13:14:00'
yield item
В pipelines.py:
class SpiderPipeline():
def __init__(self):
pass
def process_item(self, item, spider_name):
pass
Метод 1: включить конвейеры в settings: (обновление версии, временно выберите метод 2)
PIPELINES = [
'pipelines.SpiderPipeline',
]
Способ 2: передать конвейеры через start():
from pipelines import SpiderPipeline
DemoSpider.start(pipelines=SpiderPipeline)
Если вам нужно напрямую отправить post запрос, вы можете удалить элементы из start_urls и повторно использовать метод start_requests.
Используется аналитическая библиотека parse в scrapy, метод анализа такой же, как и в scrapy, поддерживает xpath, css селектор, re.
Простой пример: xpath("//div[id = demo]/text()").get() ----- получить первый элемент
xpath("//div[id = demo]/text()").getall() ----- получить все элементы, вернуть список
Запустите паука в файле spider с помощью класса name.start(). Например, имя паука — DemoSpider
DemoSpider.start()
Здесь нет полной доработки, можно протестировать с использованием многопроцессорной обработки.
from Demo.demo import DemoSpider
from Demo.demo2 import DemoSpider2
import multiprocessing
def open_DemoSpider2():
DemoSpider2.start()
def open_DemoSpider():
DemoSpider.start()
if __name__ == "__main__":
p1 = multiprocessing.Process(target = open_DemoSpider)
p2 = multiprocessing.Process(target = open_DemoSpider2)
p1.start()
p2.start()
Особая благодарность: Scrapy, Ruia, Looter, asyncio, aiohttp
Интересуетесь? github поставьте звезду, спасибо всем!
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )