¡Acostúmbrate a escribir juntos! Este es el noveno día de mi participación en el "Nuggets Daily New Plan · April Update Challenge", haz clic para ver los detalles del evento .
escribir delante
Hay un título superior en el título, y de repente siento que este blog debería hacerse un poco más alto, ¿o lo siento por el título?
En el último blog, ya hemos configurado algunos entornos básicos que deben configurarse para la distribución distribuida. El siguiente paso es la operación práctica. Esta parte describirá el proceso lo más claramente posible. Como estoy operando el sistema operativo Windows, el Los pasos relevantes en el blog se describen en detalle. Las capturas de pantalla son para Windows.
Para la etapa de principiante del rastreador distribuido, comience con el rastreador simple scrapy.
scrapy rastrea el canal de descarga de CSDN
Para la comodidad de las pruebas, encontré un sitio web con reglas relativamente simples, el canal de descarga CSDN.Los https://download.csdn.net/
datos correspondientes a este sitio web se pueden obtener continuamente https://download.csdn.net/home/get_more_latest_source?page=2
modificando el valor de la página de parámetros en la URL, lo cual es muy considerado.
Crear un rastreador
Cree un rastreador básico a través de scrapy, == Acerca de cómo crear, este artículo no lo cubrirá, puede leer el artículo anterior ==, tenga en cuenta que debido a que tengo varios scrapy instalados en mi computadora, y este proyecto usa un entorno virtual, así que agregue scrapy a la ruta completa.
Después de crear el comando, puede ingresar a la etapa de codificación
Modificar configuración.py
Las modificaciones setting.py
son las siguientes, que son todas modificaciones muy básicas, y no hay necesidad de instrucciones especiales.
ROBOTSTXT_OBEY = False # 不遵守robots.txt 的规则
DOWNLOAD_DELAY = 3 # 下载器在从同一网站下载连续页面之前应等待的时间(以秒为单位)
DOWNLOADER_MIDDLEWARES = {
'csdn_down_file.middlewares.CsdnDownFileDownloaderMiddleware': 543,
}
ITEM_PIPELINES = {
'csdn_down_file.pipelines.CsdnDownFilePipeline': 300,
}
复制代码
Modificar middlewares.py
Modifique el middleware middlewares.py
y agregue los siguientes encabezados de solicitud al núcleo. Este lugar se puede manejar de manera más interesante. Muchos sitios web pueden engañar a los anti-rastreadores con las siguientes ideas. Al configurar el encabezado UA, puede configurarlo como un rastreador de motor de búsqueda UA , por ejemplo
- Baidu
Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
- Búsqueda 360
Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0);
- Google
Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
- microsoft bing, bing
Mozilla/5.0 (compatible; bingbot/2.0; +http://www.bing.com/bingbot.htm)
- tencent soso
Sosospider+(+http://help.soso.com/webspider.htm)
- Hay muchos más >>> Vaya a Baidu específicamente, este método de trampa y anti-rastreo tiene efectos peculiares en algunos sitios web
import random
class UserAgentDownloadMiddleware(object):
# user-agent随机请求头中间件
USER_AGENTS = [
"百度搜索爬虫相应的UA头即可"
]
def process_request(self, request, spider):
user_agent = random.choice(self.USER_AGENT)
request.headers['User-Agent'] = user_agent
复制代码
Modificar item.py
Modificación item.py
, para reducir la cantidad de codificación en este blog, solo obtenemos 3 valores.
import scrapy
class CsdnDownFileItem(scrapy.Item):
# define the fields for your item here like:
file_id = scrapy.Field()
title = scrapy.Field()
source_url =scrapy.Field()
pass
复制代码
Modificar csdn_down.py
Lo siguiente es la parte del código del rastreador central, que se puede escribir paso a paso, centrándose en modificar el csdn_donw.py
archivo.
import scrapy
from csdn_down_file.items import CsdnDownFileItem
import json
class CsdnDownSpider(scrapy.Spider):
name = 'csdn_down'
allowed_domains = ['download.csdn.net']
start_urls = ['https://download.csdn.net/home/get_more_latest_source?page=1']
def parse(self, response):
rs = json.loads(response.text)
print(response.meta.get('page'))
page = 2
if response.meta.get('page') is not None:
page = int(response.meta.get('page'))
page += 1
if rs.get('message') == 'ok':
# 取出数据
data = rs.get('data').get('list')
# 存取数据
for content in data:
file_id = content.get('id')
title = content.get('title')
source_url = content.get('download_source_url')
item = CsdnDownFileItem(
file_id=file_id,
title=title,
source_url=source_url
)
yield item
next_url = f"https://download.csdn.net/home/get_more_latest_source?page={page}"
yield scrapy.Request(url=next_url, callback = self.parse, meta = {'page': page})
复制代码
Modificar pipelines.py
Esta parte del código es relativamente simple de modificar. Los datos rastreados se almacenarán en un archivo JSON. No hay un límite superior establecido aquí, por lo que el rastreador no se detendrá solo. Si es necesario, agregue un número de página en línea. El final resultado es el siguiente.
from scrapy.exporters import JsonLinesItemExporter
class CsdnDownFilePipeline:
def __init__(self):
self.csdn = open('csdn.json', 'wb')
self.csdn_exporter = JsonLinesItemExporter(
self.csdn, ensure_ascii=False
)
def process_item(self, item, spider):
self.csdn_exporter.export_item(item)
return item
def close_spider(self, item, spider):
self.csdn.close()
复制代码
rastreador distribuido
redis
Lo siguiente que debe hacer es modificar el rastreador anterior como un rastreador distribuido, asegúrese de haber completado la instalación a través del blog anterior scrapy-redis
, preste atención a los siguientes pasos
Modifique el archivo csdn_down.py del rastreador
- Cambie la clase del rastreador de
scrapy.Spider
ascrapy_redis.spiders.RedisSpider
, o de ,scrapy.CrawlSpider
ascrapy_redis.spiders.RedisCrawlSpider
, modifique esta parte como se muestra en la figura a continuación, preste atención a la relación de herencia de la clase start_urls
Eliminar el rastreador . Agregaredis_key="csdn:urls"
uno Esta redis_key se usa para controlar el inicio del rastreador en redis más adelante. La primera URL del rastreador se envía a través de este en redis.Tenga en cuenta que csdn:urls se refiere al nombre almacenado en la base de datos redis
Modificar el archivo setting.py
El núcleo de esta parte es configurar redis e iniciar el almacenamiento redis
# ####################### redis配置文件 #######################
# 引入相关头文件
from scrapy_redis.scheduler import Scheduler
from scrapy_redis.pipelines import RedisPipeline
SCHEDULER = "scrapy_redis.scheduler.Scheduler"
# 确保所有爬虫共享相同的去重指纹,也可以自定义自己的去重规则
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# 设置redis为item pipeline
ITEM_PIPELINES = {
'scrapy_redis.pipelines.RedisPipeline': 300
}
# 在redis中保持scrapy-redis用到的队列,不会清理redis中的队列,从而可以实现暂停和恢复的功能。
SCHEDULER_PERSIST = True
REDIS_HOST = '127.0.0.1' # 主机名
REDIS_PORT = 6379 # 端口
REDIS_ENCODING = "utf-8"
复制代码
iniciar redis
Consulte el blog anterior para obtener más detalles. Después de abrir, reinicie una línea de comando, conéctese a redis y escriba csdn:urls
el comportamiento del comando al mismo tiempo:lpush csdn:urls https://download.csdn.net/home/get_more_latest_source?page=1
Inicie su rastreador distribuido
Todo está listo, inicie su primer rastreador distribuido basado en redis. Tenga cuidado de no cerrar la consola del servidor redis durante la operación ~, los siguientes datos eventualmente se formarán en su redis
Si tiene varios servidores, puede implementar un rastreador distribuido básico organizando los programas del rastreador en secuencia.
escribir en la parte de atrás
Este blog comienza con el crawler más básico. Ojo con transformarlo en un crawler distribuido. Desde el nivel de comprensión se minimiza la dificultad. Bueno, la siguiente etapa es tuya, vamos.