solicitudes de Python + XPath arrastrándose películas de ojos de gato y se escriben en la base de datos (Foto Tutorial)

Una, la conexión de base de datos MySQL pyhton

Escribí un archivo py empaquetarlo, a continuación, llama en el rastreo de archivos py ojo de gato, es necesario pymysql biblioteca, los estudiantes no tienen esta biblioteca comprobar la validez de instalarlo, directamente en el código aquí

#coding=utf-8
import pymysql

class mysqlConn:
    def get_conn(self, dbname):
        """提供你要连接的数据库名,并连接数据库"""
        self.conn = pymysql.connect(
            host="127.0.0.1",
            user="root",
            password="你的密码",
            db=dbname, #可选择要连接的数据库名
            charset="utf8"
        )
        self.cur = self.conn.cursor()

    def exe_sql(self, sql):
        """执行不返回结果的sql语句, 例如增删改"""
        self.cur.execute(sql)
        self.conn.commit()
        # print("事物提交成功")

    def select_sql(self, sql):
        """执行查询语句"""
        self.cur.execute(sql)
        return self.cur.fetchall()

    def close_conn(self):
        if self.cur:
            self.cur.close()
        if self.conn:
            self.conn.close()

if __name__ == "__main__":
    #找一个数据库表来执行一下看能不能行
    connection = mysqlConn()
    connection.get_conn("school") #连接'school'数据库
    sql = '''insert into student2 (name, nickname) values ("赵六", "六娃")'''
    connection.exe_sql(sql)
    connection.close_conn()

Tenga en cuenta que hay un principio del archivo de codificación = UTF-8, no un pequeño error se le pedirá que escriba #, no escribió este hábito antes, después de que el hábito de la escritura parece ser un
vistazo a los resultados
Aquí Insertar imagen Descripción

En segundo lugar, tomar la información útil con XPath

Ojo dirección de sitio de la película de gato : https://maoyan.com/films?showType=3
primer vistazo a la base de datos final para ver cuál es la información que tenemos que rastrear
Aquí Insertar imagen Descripción
a partir del gráfico se puede ver que hay que tomar un nombre de la película, enlace de cartel de la película , la página de detalles de la película de enlaces para introducir la película, y el elenco.
ahora mira Inicio del ojo de gato
Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción
de aquí hemos sido capaces de descubrir las leyes de la transformación de la URL
y luego rastrear la URL de la primera página de información en diferentes películas
mirar los carteles de direcciones
Aquí Insertar imagen Descripción
utilizadas aquí un plug-in de captura XPath herramientas (XPath ayudante), ningún estudiante puede ir a Google App tienda de descarga, combinación de teclas Ctrl + Shift + X después de la instalación puede utilizar rápidamente
Aquí Insertar imagen Descripción
dos bien el contenido, ahora el hogar de las necesidades de contenido de películas para tener rastreo se ha completado, el resto de las necesidades de contenido para agarrar la página de detalles, vamos a escribir el código para una casa para ver el efecto del arrastre

#coding=utf-8
import requests
from lxml import etree
from fake_useragent import UserAgent

# 这里用了一个可以随机模拟请求头的库,因为一天内爬太多次导致频繁要验证,用随意模拟的请求头会好很多
# 感兴趣的小伙伴可以自己'pip install fake_useragent', 不感兴趣可以直接用普通的请求头
headers = {
    "User-Agent": UserAgent().random
}
url = 'https://maoyan.com/films?showType=3'
print("url: " + url)
resp = requests.get(url=url, headers=headers)
tree = etree.HTML(resp.text)
# 完整的图片地址,可以直接打开
img_ar = tree.xpath('//dl/dd//img[2]/@src')
# 只有地址的后半段,需要拼接'https://maoyan.com/'
urls_ar = tree.xpath('//dd/div[@class="movie-item film-channel"]/a/@href')

#打印出来看看数据爬到没有
print(img_ar)
print(urls_ar)

Aquí Insertar imagen Descripción
Encontrar detalles dirección de la página atrapado, dirección de imagen no atrapó ??? lugar es muy dividida, aquí también soy ignorante vigor por un tiempo, pensó que su XPath no escribió acerca ahora que parece que sólo depurar y nos golpeó punto de ruptura
Aquí Insertar imagen Descripción
que ahora vamos a gatear imágenes XPath cambiaron '// dl / dd // img [ 2] / @ de datos-src' para volver a intentarlo, consideró que habían sido capaces de rastreo con éxito
y ahora tenemos a la captura de información de pantalla de detalles el elenco
en el que el nombre de la película y el perfil están mejor atrapados, no se captura de pantalla, una XPath habría sido fijada, puede poseer y se rascó
Aquí Insertar imagen Descripción
donde se puede probar otras formulaciones, para no repetir
la página de códigos de rastreo detalles

headers = {
    "User-Agent": UserAgent().random
}
url = 'https://maoyan.com/films/1218029'

print("url: " + url)
resp = requests.get(url=url, headers=headers)

tree = etree.HTML(resp.content.decode("utf-8"))
name = str(tree.xpath('string(//h1)')) #转为py内置的str类型,保险点
print("正在储存电影<{}>......".format(name))
actors_ar = tree.xpath('//div[@class="celebrity-group"][2]//li/div[@class="info"]/a/text()')  # 演员列表
types = tree.xpath('string(//li[@class="ellipsis"])').replace("\n", "").replace(" ", "")  # 字符串
intro = str(tree.xpath('string(//span[@class="dra"])'))
actors = '|'.join(actors_ar).replace("\n", "").replace(" ", "") #将演员列表拼接为字符串

Puede imprimir los resultados de su propia mirada a si el código de verificación no se cumple será capaz de subir

Por último, todas las películas de ojo de gato el rastreo de código, empaquetado como tales, para desarrollar buenos hábitos de código

import requests
from lxml import etree
from mysql_api import mysqlConn
from fake_useragent import UserAgent
from pymysql import err

class maoYan_spider:
    headers = {
        "User-Agent": UserAgent().random
    }
    def get_urls(self, url):
        """返回一个电影首页捕获到的所有海报地址和电影详情url"""
        print("url: " + url)
        resp = requests.get(url=url, headers=self.headers)
        tree = etree.HTML(resp.text)
        # 完整的图片地址,可以直接打开
        img_ar = tree.xpath('//dl/dd//img[2]/@data-src')
        # 只有地址的后半段,需要拼接'https://maoyan.com'
        urls_ar = tree.xpath('//dd/div[@class="movie-item film-channel"]/a/@href')
        #只有py具有返回多个参数的特性,其他语言只能返回一个
        return img_ar, urls_ar

    def save_data(self, img_src, url):
        """将电影详情写入数据库"""
        #print("url: " + url)
        resp = requests.get(url=url, headers=self.headers)

        tree = etree.HTML(resp.content.decode("utf-8"))
        name = str(tree.xpath('string(//h1)'))
        print("正在储存电影<{}>......".format(name))
        if name == "":
            print("遇到验证码, 程序停止")
            return False
        actors_ar = tree.xpath('//div[@class="celebrity-group"][2]//li/div[@class="info"]/a/text()')  # 演员列表
        types = tree.xpath('string(//li[@class="ellipsis"])').replace("\n", "").replace(" ", "")  # 字符串
        intro = str(tree.xpath('string(//span[@class="dra"])'))
        actors = '|'.join(actors_ar).replace("\n", "").replace(" ", "") #将演员列表拼接为字符串
        sql = 'insert into maoyan (m_name, m_type, m_src, m_link, m_intro, m_actors) values ("%s","%s","%s","%s","%s","%s")' % (name, types, img_src, url, intro, actors)
        try:
            self.connect.exe_sql(sql)
        except err.ProgrammingError:
            print("该条编码有问题,舍弃")
        return True
    def run(self):
        self.connect = mysqlConn()
        self.connect.get_conn("movies")
        tag = True
        #爬取前两页的电影
        for i in range(2):
            main_url = "https://maoyan.com/films?showType=3&offset={}".format(30 * i)
            imgs, urls = self.get_urls(main_url)
            if len(imgs) == 0:
                print("遇到验证码, 程序停止")
                print("再次尝试...")
                imgs, urls = self.get_urls(main_url)
            for img, url in zip(imgs, urls):
                img = img.split('@')[0]
                url = 'https://maoyan.com' + url
                tag = self.save_data(img, url)
                while not tag:
                    tag = True
                    print("再次尝试...")
                    tag = self.save_data(img, url)
        self.connect.close_conn()

if __name__ == "__main__":
    # conn1 = mysqlConn()
    # conn1.get_conn("movies")
    # sql = """create table maoyan(
    #         m_id int primary key auto_increment,
    #         m_name varchar(30) not null,
    #         m_type varchar(20) null,
    #         m_src varchar(100) not null,
    #         m_link varchar(100) not NULL,
    #         m_intro text null,
    #         m_actors text null
    #         )default charset = utf8"""
    # conn1.exe_sql(sql)
    # conn1.close_conn()
    spider = maoYan_spider()
    spider.run()

Aquí Insertar imagen Descripción
Aquí es donde conecto con el archivo de base de datos y el rastreo de archivos, probablemente en el mismo directorio en la línea, se puede escribir la misma la siguiente página y después 'de importación .mysql_api mysqlConn' y ver una película con

Dijo unas relativamente fácil de Pit fuera de lugar

la

Aquí Insertar imagen Descripción
Esta es una pieza de código para construir la tabla, siempre y cuando tenga a películas propias en el construido en la base de datos MySQL
y luego elimine el comentario de este párrafo, las dos primeras líneas de código a un comentario, y luego ejecutar, a continuación, ejecute habrá un juego de caracteres que la advertencia, esto no importa, al final de la carrera se puede comentar esta pieza de código, y luego elimine el comentario de las dos líneas siguientes, reptiles comenzando, por supuesto, también se puede construir la primera tabla en la base de datos, ya que antes sólo escribí CRUD py , quería probar para construir la tabla, no me pregunte por qué m_actors al tipo de texto, originalmente dieron varchar (200), y lo suficientemente tarde pronta a escribir, el cambio 400 no es suficiente, fui a ver a un actor que es mucho que ver - complejo unido

dos

Aquí Insertar imagen Descripción
Esta sentencia SQL, prestar atención al marcador de posición en ambos lados de comillas dobles (debe ser un signo de comillas dobles, las comillas porque hay un significado especial en la base de datos, he comprobado el artículo dice así, lo que específicamente no se sabe todavía), que tenía dentro con comillas simples, comillas dobles fuera envueltos con SQL, lo que lleva a varias páginas conducirá a 'pymysql.err.ProgrammingError', no pude encontrar el problema, sólo podemos detectar la excepción, y más tarde cambiaron a comillas simples esto no es algo malo.

tres

Hay otros temas pueden ser discutidos en el mensaje de área de comentarios, ya que hoy en día considerado como los primeros días de aprendizaje reptiles no ver el video, complete su propio trabajo independiente atrapó, ji, ji

efecto

Aquí Insertar imagen Descripción

Publicó un artículo original · ganado elogios 9 · vistas 54

Supongo que te gusta

Origin blog.csdn.net/weixin_43110554/article/details/105225737
Recomendado
Clasificación