Python crawler combat 2: Douban reading top250 crawling

Prefacio

Este artículo presenta principalmente el rastreo de datos y el preprocesamiento de datos de Douban reading top250. Las principales bibliotecas utilizadas son re, request, Beautifulsoup y lxml. Este artículo se centra en resumir algunos de los pozos que encontré mientras gateaba y mi enfoque de estos pozos. El código y los datos para el rastreo se adjuntan al final del artículo. Este es mi primer rastreador real: la versión hermana de la película Douban top250 .

reptil

Definir la función de enlace de descarga

Al descargar páginas web, a menudo se informa de errores. Para reducir errores innecesarios, puede prestar atención a los siguientes tres puntos al descargar:

  1. Haga una pausa entre cada descarga; de lo contrario, es posible que se bloquee
  2. Agregue un encabezado, finja que no es un rastreador. Pero el contenido del encabezado parece ser gratuito.
  3. Agregue codificación, decode = 'utf-8', de lo contrario, el contenido rastreado puede resultar confuso
# 引入库
import re
import pandas as pd
import time
import urllib.request
from lxml.html import fromstring
from bs4 import BeautifulSoup
# 下载链接
def download(url):
    print('Downloading:', url)
    request = urllib.request.Request(url)
    request.add_header('User-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36') #进行伪装
    resp = urllib.request.urlopen(request)
    html = resp.read().decode('utf-8') #utf-8编码
    time.sleep(3)   #间隔3s,防止被封禁
    return html

Elección de contenido de rastreo

Cuando rastreé Douban Movies, el método que usé fue descargar cada página de índice y luego descargar todo el contenido de la película en cada página de índice. Hay un total de 10 páginas de índice y cada página tiene 25 información de películas, por lo que se deben descargar 25 * 10 + 10 = 260 sitios web. Aunque esto puede agregar un poco más de información de rastreo, un inconveniente obvio es que lleva mucho tiempo.
Rastrear contenido

Cuando rastreé Douban para leer libros, el método que usé fue descargar cada página de índice y luego extraer directamente la información del libro en la página de índice (debajo del título). ¡Solo es necesario descargar 10 páginas! Además, cuando seguí el antiguo método de Crawling Douban Movies y Crawling Douban para leer libros, me resultó difícil localizar la información del autor . Esto nos ilumina para elegir la forma en que rastreamos el contenido de manera flexible.
Rastrear contenido

Elección del método de posicionamiento

En la primera película de Douban, hay tres métodos para el posicionamiento del rastreador:

  1. Orientación mediante expresiones regulares
  2. Localizar a través de la función de búsqueda en Beautifulsoup
  3. Localizar a través de Xpath en lxml

Entonces, ¿qué método debería usarse? Mi principio es: simple es el mejor.
Personalmente recomiendo Xpath, porque es el más fácil y obvio, solo presione F12 , luego seleccione el contenido que se rastreará, haga clic con el botón derecho en copiar xpath y, en segundo lugar, puede usar la función de búsqueda en Beautifulsoup para localizar. Trate de no usar expresiones regulares.
Por ejemplo , el método de posicionamiento xpath se usa al leer títulos de libros , pero hay dos puntos a tener en cuenta aquí:

  1. Necesito eliminar / tbody de xpath
  2. Necesita usar .strip () para eliminar saltos de línea y espacios

xpath

# 待爬取内容
name = []
rate = []
info = []


# 循环爬取每页内容
for k in range(10):
    url = download('https://book.douban.com/top250?start={}'.format(k*25))
    tree = fromstring(url)
    soup = BeautifulSoup(url)
    #找出该页所有书籍信息
    for k in range(25):
        name.append(tree.xpath('//*[@id="content"]/div/div[1]/div/table[{}]/tr/td[2]/div[1]/a/text()'.format(k+1))[0].strip())
        rate.append(soup.find_all('span',{
    
    'class':'rating_nums'})[k].get_text())
        info.append(soup.find_all('p',{
    
    'class':'pl'})[k].get_text())
# 拼接
book_data = pd.concat([name_pd, rate_pd, info_pd], axis=1)
book_data.columns=['书名', '评分', '信息']
book_data.head()

Preprocesamiento de datos

A continuación, procese previamente los datos leídos anteriormente:

  1. La información variable en un escritor, editor, año de publicación, precio
  2. Hay dos datos anormales que deben ajustarse manualmente
  3. Con expresiones regulares para extraer publicadas en el año, el precio de la sección digital
  4. Quema de puentes, borra variables de información

Tenga en cuenta que el autor, el editor, el año de publicación, el precio es averiguar el índice por ubicación, pero hay dos excepciones en las que los datos deben ajustarse manualmente:
Holmes
Biblia

El código específico es el siguiente:

# 数据预处理:

# 将信息分割
Info = book_data['信息'].apply(lambda x: x.split('/'))

# 提取信息
book_data['作家'] = Info.apply(lambda x: x[0])
book_data['出版社'] = Info.apply(lambda x: x[-3])
book_data['出版年'] = Info.apply(lambda x: x[-2])
book_data['定价'] = Info.apply(lambda x: x[-1])

# 手动调整
book_data.iloc[9,4] = '群众出版社'
book_data.iloc[9,5] = '1981'
book_data.iloc[184,5] = '1996'
book_data.iloc[184,6] = '0'

#提取年份
f = lambda x: re.search('[0-9]{4,4}', x).group()
book_data['出版年'] = book_data['出版年'].apply(f)

#提取定价
g = lambda x: re.search('([0-9]+\.[0-9]+|[0-9]+)', x).group()
book_data['定价'] = book_data['定价'].apply(g)

book_data = book_data.drop(['信息'], axis =1)

# 输出
outputpath='c:/Users/zxw/Desktop/修身/与自己/数据分析/数据分析/爬虫/豆瓣读书/book.csv' ## 路径需要自己改!
book_data.to_csv(outputpath,sep=',',index=False,header=True,encoding='utf_8_sig')

posdata

En la actualidad, usted mismo considera a los reptiles como una comprensión preliminar, el siguiente podría considerar el aprendizaje de contenido de aprendizaje automático , comenzando con Una introducción al aprendizaje estadístico con R escribir a partir de él.

Código y conjunto de datos (código de extracción: disq)

Supongo que te gusta

Origin blog.csdn.net/weixin_43084570/article/details/108666114
Recomendado
Clasificación