Conhecimento preliminar de rastreadores
1. Base do protocolo de rede de computadores
Um processo completo de solicitação de rede é o seguinte:
depois que o navegador insere o nome de domínio, o navegador primeiro visita o servidor DNS, o DNS retorna o ip para o navegador e, em seguida, o navegador estabelece uma conexão TCP com o servidor web, o navegador pode enviar uma solicitação http e o servidor web retorna Os dados são enviados ao navegador e a próxima etapa é o navegador analisar o conteúdo.
Protocolo de rede de sete camadas:
- Camada de aplicação
Http、ftp、pop3、DNS
- Camada de apresentação
- Camada de sessão
- Camada de transporte
TCP、UDP
- Camada de rede
ICMP、IP、IDMP
- camada de link de dados
ARP、RARP
- Meio de transmissão física da camada física
二 、 Html 、 Css 、 Javascript
Os três elementos de uma página da web: Html、Css、Javascript
Html
é o esqueleto que carrega o conteúdo da página da web,
Css
é o estilo
Javascript
da página da web , é o script que a página da web executa;
O conteúdo que precisamos rastrear geralmente faz parte do conteúdo HTML da página da web, portanto, podemos obtê-lo se estiver visível e rastreá-lo, desde que possamos vê-lo na página.
Processo de carregamento do navegador:
construção de carregamento de sub-recurso de árvore DOM (carregar css externo, js, imagens e outros recursos externos) renderização no estilo (execução de css)
A localização de elementos da página geralmente é encontrada na árvore DOM:
Carregamento assíncrono Ajax
Alguns dados são enviados para o servidor por meio de js e os dados são retornados e os dados são inseridos dinamicamente na página por meio de js. Este método não atualiza a página e o efeito de experiência do usuário é bom.
Os dados retornados pelo ajax podem estar no formato json ou fazer parte de uma página html.
Páginas da web dinâmicas e páginas da web estáticas:
dinâmicas: os dados interagem com o plano de fundo e podem ser alterados (ajax)
estáticos: os dados são imutáveis (você precisa modificar o código-fonte se quiser mudar)
A experiência dinâmica da página da web é boa, carregamento parcial, bom para o servidor, boa escalabilidade
A página da web estática é boa para SEO
Solicitação GET e solicitação POST
Os parâmetros GET são incluídos no URL e POST os passa pelo corpo da solicitação.
- GET é inofensivo quando o navegador é revertido e o POST enviará a solicitação novamente
- As solicitações GET só podem ser codificadas por url, enquanto o POST oferece suporte a vários métodos de codificação
- Os parâmetros transmitidos na URL para solicitações GET são limitados em comprimento, enquanto POST não
- GET é menos seguro do que POST, porque os parâmetros são expostos diretamente na URL, portanto, informações confidenciais não podem ser passadas
3 tipos de conteúdo
-
application/x-www-form-urlencoded
O POST envia os dados, a forma nativa do navegador, se o atributo enctype não estiver definido, os dados serão enviados em application / x-www-form-urlencoded finalmente. Os dados enviados são codificados de acordo com key1 = val1 & key2 = val2, e key e val são transcodificados em URL. -
multipart/form-data
Arquivo de upload de formulário. -
application/json
Diga ao servidor que o corpo da mensagem é uma string JSON serializada.
Três, o método básico de rastreamento
1. Classificação do plano de coleta
Geralmente, coletamos apenas os dados especificados exigidos pelo site de coleta e o esquema de coleta é classificado:
- Use o protocolo http para coletar a análise da página
- Use a interface API para coletar dados de aplicativos
- Use a coleção de api do site de destino - Weibo, github
2. solicita biblioteca
Endereço oficial do documento: https://requests.readthedocs.io/zh_CN/latest/
Instalação:
pip install requests
Se você usa um ambiente virtual, certifique-se de instalá-lo novamente no ambiente virtual para garantir o funcionamento normal do projeto usando o ambiente virtual
Em primeiro lugar, rastreie a página do Baidu:
import requests
res = requests.get("http://www.baidu.com")
print(res.text)
O código html da página do Baidu é impresso: os
itens específicos serão apresentados em detalhes posteriormente.
3. Expressões regulares
As expressões regulares são para um melhor processamento das strings obtidas e mais convenientes para obter os caracteres de que precisamos.
Sintaxe regular comumente usada:
gramática | efeito |
---|---|
. | Corresponde a qualquer caractere (sem incluir nova linha) |
^ | Corresponder à posição inicial, corresponder ao início de cada linha no modo multilinha |
$ | Combine a posição final, combine o final de cada linha no modo multilinha |
* | Corresponde ao metacaractere anterior 0 ou mais vezes |
+ | Corresponde ao metacaractere anterior uma ou mais vezes |
? | Corresponde ao metacaractere anterior 0 a 1 vezes |
{m, n} | Corresponde ao metacaractere anterior m a n vezes |
\\ | Personagem de fuga |
[] | conjunto de caracteres |
| | OR lógico |
\ b | Corresponde a uma string vazia no início ou no final de uma palavra |
\ B | Corresponde a uma string vazia que não está no início ou no final de uma palavra |
\ d | Corresponde a um número |
\ D | Corresponder a não dígitos |
\ s | Corresponde a qualquer espaço em branco |
\ S | Corresponder a espaços em branco não arbitrários |
\W | Corresponde a qualquer caractere entre números, letras e sublinhados |
\W | Corresponde a qualquer caractere diferente de números, letras e sublinhados |
Python usa regular para extrair aniversários simplesmente:
import re
info = "姓名:zhangsan 生日:1995年12月12日 入职日期:2020年12月12日"
# print(re.findall("\d{4}", info))
match_result = re.match(".*生日.*?(\d{4})", info)
print(match_result.group(1)) # 1995
4. Uso da bela sopa
- Instalação
(se você estiver usando um ambiente virtual, você precisa mudar para o ambiente virtual para instalação)
pip install beautifulsoup4
- Documento oficial
https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/ - Simples de usar
from bs4 import BeautifulSoup
import requests
baidu = requests.get("http://www.baidu.com")
baidu.encoding = "utf-8"
bs = BeautifulSoup(baidu.text, "html.parser")
title = bs.find("title")
print(title.string)
navs = bs.find_all("img")
for i in navs:
print(i)
resultado:
5. Sintaxe básica do Xpath
Aqui, apresentamos principalmente o Seletor.
Instalação:
download do pacote Python: https://www.lfd.uci.edu/~gohlke/pythonlibs/
Se você instalar diretamente lxml
ou se a scrapy
instalação não for bem-sucedida, você pode ir para o site acima para baixar o pacote de instalação por sua vez e pip
instalá-lo:
pip install lxml
pip install Twisted-20.3.0-cp38-cp38-win32.whl
pip install Scrapy-1.8.0-py2.py3-none-any.whl
xpath usa expressões de caminho para navegar em xml e html.
Uso simples:
import requests
from scrapy import Selector
baidu = requests.get("http://www.baidu.com")
baidu.encoding = "utf-8"
html = baidu.text
sel = Selector(text=html)
tag = sel.xpath("//*[@id='lg']/img").extract()[0]
print(tag)
# <img hidefocus="true" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129">
6. Seletor de CSS para extrair elementos
import requests
from scrapy import Selector
baidu = requests.get("http://www.baidu.com")
baidu.encoding = "utf-8"
html = baidu.text
sel = Selector(text=html)
imgs = sel.css("img").extract()
for i in imgs:
print(i)
# <img hidefocus="true" src="//www.baidu.com/img/bd_logo1.png" width="270" height="129">
# <img src="//www.baidu.com/img/gs.gif">