modelagem de dados scrapy e solicitação
alvo de aprendizagem:
- Aplicação em projeto scrapy para modelagem
- O aplicativo constrói o objeto Request e envia o pedido
- O aplicativo usa meta parâmetros para passar dados em diferentes funções analíticas
1. Modelagem de Dados
Normalmente, no processo de execução do projeto, modelagem de dados em items.py
1.1 Por que modelo
- Definir o item significa planejar com antecedência quais campos precisam ser apreendidos para evitar erros manuais, pois após a definição, o sistema irá verificar automaticamente durante o processo de operação
- Junto com os comentários, você pode saber claramente quais campos capturar. Os campos que não estão definidos não podem ser capturados. Em vez disso, você pode usar um dicionário quando houver poucos campos de destino.
- Alguns componentes específicos de scrapy precisam ser suportados pelo Item, como a classe de pipeline ImagesPipeline de scrapy, pesquise mais no Baidu
1.2 Como modelar
Defina os campos a serem extraídos no arquivo items.py:
class MyspiderItem(scrapy.Item):
name = scrapy.Field() # 讲师的名字
title = scrapy.Field() # 讲师的职称
desc = scrapy.Field() # 讲师的介绍
1.3 Como usar classes de modelo
A definição da classe de modelo precisa ser importada e instanciada no rastreador posteriormente, e o método de uso subsequente é o mesmo que usar o dicionário
job.py :
from myspider.items import MyspiderItem # 导入Item,注意路径
...
def parse(self, response)
item = MyspiderItem() # 实例化后可直接使用
item['name'] = node.xpath('./h3/text()').extract_first()
item['title'] = node.xpath('./h4/text()').extract_first()
item['desc'] = node.xpath('./p/text()').extract_first()
print(item)
Nota:
- De myspider.items import MyspiderItem esta linha de código preste atenção ao caminho de importação correto do item e ignore os erros marcados por pycharm
- A chave para o caminho de importação em python: onde iniciar a execução, importar de onde
1.4 Resumo do processo de desenvolvimento
- Criar projeto
scrapy startproject nome do projeto - Limpar
modelo de metas no arquivo items.py - Criar um rastreador
3.1 Criar um rastreador
scrapy genspider Domínios permitidos do nome do rastreador
3.2 Concluir o rastreador
Modificar start_urls para
verificar e modificar allowed_domains para
escrever e analisar métodos - Salvar dados
Defina o pipeline para processamento de dados no
arquivo pipelines.py Registre e habilite o pipeline no arquivo settings.py
2. A ideia de solicitação de virada de página
O que devo fazer para extrair os dados em todas as páginas da figura a seguir?
Lembre-se de como o módulo de solicitações implementa solicitações de virada de página:
- Encontre o endereço URL da próxima página
- Chamar request.get (url)
A ideia de scrapy para realizar a virada de página:
- Encontre o endereço url da próxima página
- Construir o objeto de solicitação do endereço URL e passá-lo para o mecanismo
3. Construir o objeto Request e enviar o pedido
3.1 Método de implementação
- Determine o endereço URL
- Construir uma solicitação, scrapy.Request (url, callback)
- retorno de chamada: especifique o nome da função de análise, indicando qual função é usada para analisar a resposta retornada pela solicitação
- Forneça a solicitação ao mecanismo: yield scrapy.Request (url, callback)
3.2 Rastreador de recrutamento Netease
Aprenda como implementar solicitações de virada de página rastreando as informações de recrutamento na página de recrutamento do Netease
Endereço: https://hr.163.com/position/list.do
Análise de pensamento:
- Obtenha os dados da página inicial
- Encontre o endereço da próxima página, vire a página, pegue os dados
Nota:
- O protocolo do ROBÔ pode ser definido nas configurações
# False表示忽略网站的robots.txt协议,默认为True
ROBOTSTXT_OBEY = False
- O agente do usuário pode ser definido nas configurações:
# scrapy发送的每一个请求的默认UA都是设置的这个User-Agent
USER_AGENT = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
3.3 Implementação do código
No método de análise do arquivo do rastreador:
......
# 提取下一页的href
next_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()
# 判断是否是最后一页
if next_url != 'javascript:void(0)':
# 构造完整url
url = 'https://hr.163.com/position/list.do' + next_url
# 构造scrapy.Request对象,并yield给引擎
# 利用callback参数指定该Request对象之后获取的响应用哪个函数进行解析
yield scrapy.Request(url, callback=self.parse)
......
3.4 Mais parâmetros de scrapy.Request
scrapy.Request(url[,callback,method="GET",headers,body,cookies,meta,dont_filter=False])
Explicação do parâmetro
- Os parâmetros entre colchetes são parâmetros opcionais
- retorno de chamada : indica qual função lidar com a resposta do URL atual
- meta : realiza a transferência de dados em diferentes funções analíticas. Meta vem com alguns dados por padrão, como atraso no download, profundidade da solicitação, etc.
- dont_filter: O padrão é False, irá filtrar o endereço url solicitado, ou seja, o endereço url solicitado não continuará a ser solicitado, e pode ser definido como True para o endereço url que precisa ser solicitado repetidamente, como a solicitação de virada de página da barra de post, os dados totais da página Está mudando; o endereço em start_urls será solicitado repetidamente, caso contrário, o programa não iniciará
- método: especifique a solicitação POST ou GET
- cabeçalhos: receba um dicionário, que não inclui cookies
- cookies: Receba um dicionário e coloque cookies especificamente
- body: Recebe string json, dados POST, usado ao enviar a solicitação payload_post (a solicitação de postagem será apresentada no próximo capítulo)
4. Uso de meta parâmetros
O papel do meta: meta pode realizar a transferência de dados em diferentes funções analíticas
No método de análise do arquivo do rastreador, a função parse_detail especificada pelo retorno de chamada antes da página de detalhes de extração ser adicionada:
def parse(self,response):
...
yield scrapy.Request(detail_url, callback=self.parse_detail,meta={"item":item})
...
def parse_detail(self,response):
#获取之前传入的item
item = resposne.meta["item"]
preste atenção
- O meta parâmetro é um dicionário
- Há uma chave fixa no meta dicionário
proxy
, que representa o ip do proxy. Apresentaremos o uso do ip do proxy na aprendizagem de middleware de download scrapy
resumo
- Melhore e use a classe de dados do item:
- Preencha os campos a serem rastreados em items.py
- Importar o item no arquivo do rastreador primeiro
- Depois de fazer o objeto Item, use-o diretamente como um dicionário
- Construa o objeto Request e envie a solicitação:
- Importar classe scrapy.Request
- Extraia o url na função de análise
- rendimento scrapy.Request (url, callback = self.parse_detail, meta = {})
- Use meta parâmetros para passar dados em diferentes funções analíticas:
- Passe o meta pela função de análise anterior, yield scrapy.Request (url, callback = self.xxx, meta = ())
- Na função self.xxx, response.meta.get ('key', '') ou response.meta ['key'] é usado para recuperar os dados passados
Código de referência
wangyi / spiders / job.py
import scrapy
class JobSpider(scrapy.Spider):
name = 'job'
# 2.检查允许的域名
allowed_domains = ['163.com']
# 1 设置起始的url
start_urls = ['https://hr.163.com/position/list.do']
def parse(self, response):
# 获取所有的职位节点列表
node_list = response.xpath('//*[@class="position-tb"]/tbody/tr')
# print(len(node_list))
# 遍历所有的职位节点列表
for num, node in enumerate(node_list):
# 索引为值除2取余为0的才是含有数据的节点,通过判断进行筛选
if num % 2 == 0:
item = {}
item['name'] = node.xpath('./td[1]/a/text()').extract_first()
item['link'] = node.xpath('./td[1]/a/@href').extract_first()
item['depart'] = node.xpath('./td[2]/text()').extract_first()
item['category'] = node.xpath('./td[3]/text()').extract_first()
item['type'] = node.xpath('./td[4]/text()').extract_first()
item['address'] = node.xpath('./td[5]/text()').extract_first()
item['num'] = node.xpath('./td[6]/text()').extract_first().strip()
item['date'] = node.xpath('./td[7]/text()').extract_first()
yield item
# 翻页处理
# 获取翻页url
part_url = response.xpath('//a[contains(text(),">")]/@href').extract_first()
# 判断是否为最后一页,如果不是最后一页则进行翻页操作
if part_url != 'javascript:void(0)':
# 拼接完整翻页url
next_url = 'https://hr.163.com/position/list.do' + part_url
yield scrapy.Request(
url=next_url,
callback=self.parse
)
wangyi / items.py
class WangyiItem(scrapy.Item):
# define the fields for your item here like:
name = scrapy.Field()
link = scrapy.Field()
depart = scrapy.Field()
category = scrapy.Field()
type = scrapy.Field()
address = scrapy.Field()
num = scrapy.Field()
date = scrapy.Field()
É o fim, se te ajudar, seja bem-vindo para curtir e seguir, seus curtidas são muito importantes para mim