Java教程

2022 年,把 Python 学得跟 Java 一样熟练——06 爬腾讯动漫

本文主要是介绍2022 年,把 Python 学得跟 Java 一样熟练——06 爬腾讯动漫,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

背景

昨天看了一篇获取房价的文章后,运行了案例代码,能看懂,但对 html 解析的用法还不熟悉。

今天继续练习 Python 编码,目标是腾讯动漫网页,先完成基本信息的获取。为什么选这个呢,主要是昨天想对着某文章练习 Python Spider 编码时,发现它是一个付费专栏,于是自己来写写。

页面元素分析

开发者模式,定位到一个节点,根据 class 信息查询动漫节点,目标是具有ret-search-item clearfixli 元素。

动漫的各项信息定位:

  1. 海报地址:第一个 a 标签下的 img 标签的 data-original 属性。
  2. 动漫名称:第一个 a 标签的 titile 属性。
  3. 作者:具有 ret-works-author 类属性的 p 标签的文本。
  4. 描述:具有 ret-works-decs 类属性的p` 标签的文本。
  5. 动漫详情地址:具有 ret-works-view 类属性的 a 标签的 href 属性。

编码实现

要取全部页面,考虑用多线程协作。

from bs4 import BeautifulSoup
import numpy as np
import requests
from requests.exceptions import RequestException
import threading

"--动漫网页方法--"
def spiderPage(url, page):
    try:
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
        html1 = requests.request("GET", url, headers=headers, timeout=10)
        html1.encoding = 'utf-8'  # 加编码
        html = html1.text

        # print('scrawl result')
        # print(html)
        return html
    except RequestException:  # 异常捕获
        print('第{0}读取网页失败'.format(page))
        return None

"--解析列表页面的动漫信息--"
def parsePage(url, page):
    # 取页面
    html = spiderPage(url, page)
    html = str(html)
    if html is not None:
        # soup = BeautifulSoup(html, 'lxml')
        soup = BeautifulSoup(html, 'html.parser')
        "--先确定动漫信息,即li标签列表,li class = ret-search-item clearfix --"
        cosmics = soup.find_all("li",class_="ret-search-item clearfix")
        for j in range(len(cosmics)):  # 遍历每一个动漫
            cosmic = cosmics[j]

            "动漫海报:mod-cover-list-thumb mod-cover-effect ui-db"
            poster = cosmic.findNext("a")
            posterImgTag = poster.findNext("img")
            posterImgUrl = posterImgTag.get("data-original")
            print("posterImgUrl ",posterImgUrl)

            "动漫详情 URL"
            cosmicTag= cosmic.findNext("a",class_="ret-works-view")
            cosmicUrl = "https://ac.qq.com/"+ cosmicTag.get("href")

            "动漫名称:ret-works-title "
            print("name is", poster.get("title"))

            "动漫作者:ret-works-author"
            author = cosmic.findNext("p",class_="ret-works-author")
            print("author is ", author.text)

            "动漫描述:ret-works-decs"
            desc = cosmic.findNext("p",class_="ret-works-decs")
            print("desc is ",desc.text)
            print()

# 启动两个线程获取页面数据
for i in range(1,100,2):  # 遍历网页1-101
    url1 = "https://ac.qq.com/Comic/index/page/" + str(i)
    url2 = "https://ac.qq.com/Comic/index/page/" + str(i + 1)

    thread1 = threading.Thread(target=parsePage, args=(url1, i)) 
    thread2 = threading.Thread(target=parsePage, args=(url2, i + 1))
    thread1.start()
    thread2.start()

运行结果

在这里插入图片描述

编码启示录

首先,有个大疑惑就是解析文本的时候, soup = BeautifulSoup(html, 'html.parser')soup = BeautifulSoup(html, 'lxml') 有什么区别呢?

最初参考房价项目的代码,用的是 lxml ,selectclass 解析不到东西,再改成 html.parserfind 方法可以正常解析了。

答案是,解析器不同:

  • html.parser,内置,不需要额外的依赖项。
  • html5lib,最宽大,如果HTML损坏,最好使用它。
  • lxml,最快,依赖外部 C 。

其次,Python 解析页面还是挺好定位的。

今天先完成基础信息的获取,下一步的完善目标是生成 DataFrame 数据,写入 Excel 表格,同时获取全部的动漫图片。

这篇关于2022 年,把 Python 学得跟 Java 一样熟练——06 爬腾讯动漫的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!