[Python-réptile combat 01] aquisição top250


O web crawling é um método para obtenção de dados na Internet, mas em aplicações práticas, é preciso ficar atento às estratégias anti-crawling que os sites podem adotar. Este artigo apresentará como usar o Python para rastrear os dados dos filmes Top250 xx e discutirá algumas estratégias e contramedidas anti-crawler comuns.

1. Importar biblioteca

Primeiro, requestsa biblioteca e BeautifulSoupa biblioteca e csva biblioteca precisam ser importadas.

A biblioteca de solicitações é usada para acessar o site de destino e obter dados da página da web.
A biblioteca BeautifulSoup é usada para processar os dados obtidos por solicitações de análise e processamento.
A biblioteca csv é usada para armazenamento de dados final.

import requests
from bs4 import BeautifulSoup
import csv

2. Envie uma solicitação HTTP para obter o conteúdo da página

Usamos requests.get()funções para enviar solicitações GET e simular informações de cabeçalho de solicitação do navegador para reduzir o risco de ser identificado como rastreador pelo site.

url = 'https://movie.douban.com/top250'
headers = {
    
    
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36'
}
response = requests.get(url, headers=headers)

3. Analisando o conteúdo HTML

Crie um BeautifulSoupobjeto, especificando o analisador e o que analisar.

soup = BeautifulSoup(response.text, 'html.parser')

4. Localizar e extrair informações do filme

Dois caminhos:

4.1 select_one()

Localize as informações do filme: de acordo com as características da estrutura e tags HTML, use BeautifulSoupo método seletor fornecido para localizar os elementos HTML das informações do filme. Cada filme do Douban Movies Top250está contido em uma tag div cuja classe é 'item', e você pode usar o método find_all para localizar todos os itens do filme. Por exemplo:

movie_items = soup.find_all('div', class_='item')

Extrair informações do filme: percorra a lista de itens do filme e extraia as informações do filme uma a uma. findMétodos e CSSseletores podem ser usados ​​para direcionar elementos específicos das informações do filme. Por exemplo, o título de um filme está em uma tag span com a classe 'title' e o título pode ser extraído usando select_onemétodos e CSSseletores. Outras informações como classificação, diretor, atores, etc. também podem ser extraídas de maneira semelhante. Por exemplo:

for item in movie_items:
 title = item.select_one('.title').text
 rating = item.select_one('.rating_num').text
 director = item.select('.bd p')[0].text.strip()
 actors = item.select('.bd p')[1].text.strip()
 # 其他信息的提取...

4.2 encontrar()

De acordo com a estrutura HTML da página da Web, use find_all()o método para localizar o elemento HTML que contém as informações do filme e use o loop transversal para extrair as informações necessárias.

movies = soup.find_all('div', class_='item')
data = []
for movie in movies:
    title = movie.find('span', class_='title').text # 电影名
    rating = movie.find('span', class_='rating_num').text #
    bd = (
        movie.find("div", class_="bd")
        .text.replace(" ", "")
        .replace("\n\n\n", "\n")
        .replace("\n\n", "\n")
        .split("\n")
    )
    data.append([title, rating])

5. Armazenar dados

Armazene as informações extraídas do filme em CSVum arquivo para posterior análise e uso.

with open(r"测试\movies.csv", "w", encoding="utf-8") as file:
    writer = csv.writer(file)
    writer.writerow(["电影名", "导演", "主演", "时间/地区/类型", "评分", "评价人数", "一句话评价"])
    writer.writerows(data)

Problemas encontrados:

1. Ao processar dados, o chinês exibido no armazenamento normal csvtorna-se caracteres ilegíveis quando é gravado no arquivo. A codificação do arquivo não pode lidar com o chinês corretamente e csva codificação precisa ser especificada ao gravar o arquivo.

2. Escreva mais uma linha em branco

Solução:

with open(filename, 'a', newline='', encoding='utf-8-sig') as f: 
    # 数据存储

6. Estratégia anti-crawler e contramedidas

Ao rastrear os dados da página da Web, o site pode adotar algumas estratégias anti-rastreamento, como definir restrições de frequência de acesso, usar códigos de verificação e detectar informações do cabeçalho da solicitação. Os seguintes são alguns comuns

Veja as estratégias e contramedidas anti-crawler:

  • Limite de frequência de acesso: Use time.sleep()uma função para atrasar aleatoriamente para evitar solicitações muito frequentes.
  • Use um proxy IP: ao usar um proxy IPpara fazer uma solicitação, a origem real da solicitação é ocultada.
  • Lidando com o código de verificação: se você encontrar um código de verificação, poderá usar uma biblioteca de terceiros para identificação automática ou inserir manualmente o código de verificação.

Observe que é muito importante respeitar as regras do rastreador do site e não solicitar demais ou sobrecarregar o site.

Código completo e resultados em execução

import requests
from bs4 import BeautifulSoup
import csv

url = "https://movie.douban.com/top250"
headers = {
    
    
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.182 Safari/537.36"
}
response = requests.get(url=url, headers=headers)
print(response.status_code)
soup = BeautifulSoup(response.text, "html.parser")

movies = soup.find_all("div", class_="item")
# print(movies)
data = []
for movie in movies:
    title = movie.find("span", class_="title").text
    # rating = movie.find("span", class_="rating_num").text
    # inq = movie.find("span", class_="inq").text
    bd = (
        movie.find("div", class_="bd")
        .text.replace(" ", "")
        .replace("\n\n\n", "\n")
        .replace("\n\n\n", "\n")
        .split("\n")
    )
    bd = [x for x in bd if x != ""]
    bd = [x for y in bd for x in y.split("   ", 1)]
    data.append([title] + bd)

with open(r"测试\movies.csv", "w", newline="", encoding="utf-8-sig") as file:
    writer = csv.writer(file)
    writer.writerow(["电影名", "导演", "主演", "时间/地区/类型", "评分", "评价人数", "一句话评价"])
    writer.writerows(data)

print("数据爬取完成并存储到movies.csv文件中。")

O código acima é completo para rastrear filmes Douban usando Python Top250. Depois de executar o código, as informações de título e classificação do filme serão rastreadas e armazenadas em um arquivo movies.csvchamado CSV.

insira a descrição da imagem aqui

Conclusão:
por meio das etapas acima, aprendi como usar o Python e a biblioteca de solicitações para rastrear Top250os dados do filme Douban e apresentei algumas estratégias e contramedidas anti-crawler comuns. Espero que este artigo possa ajudá-lo em seu projeto de rastreador da Web e desejo-lhe sucesso na obtenção dos dados necessários.

Lembre-se de que, ao rastrear, você deve cumprir as leis e regulamentos e as regras de rastreamento do site e respeitar os recursos do servidor do site. Contribua para o desenvolvimento do ciberespaço usando a tecnologia de rastreamento com cautela e responsabilidade.

Supongo que te gusta

Origin blog.csdn.net/mingfeng4923/article/details/131105440
Recomendado
Clasificación