Diretório de artigos
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, requests
a biblioteca e BeautifulSoup
a biblioteca e csv
a 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 BeautifulSoup
objeto, 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 BeautifulSoup
o método seletor fornecido para localizar os elementos HTML das informações do filme. Cada filme do Douban Movies Top250
está 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. find
Métodos e CSS
seletores 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_one
métodos e CSS
seletores. 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 CSV
um 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
csv
torna-se caracteres ilegíveis quando é gravado no arquivo. A codificação do arquivo não pode lidar com o chinês corretamente ecsv
a 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 proxyIP
para 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.csv
chamado CSV
.
Conclusão:
por meio das etapas acima, aprendi como usar o Python e a biblioteca de solicitações para rastrear Top250
os 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.