初步實現 python 爬取小說,實現不規則頁面的翻頁爬取


在寫爬蟲的時候,我們會遇到有的網頁鏈接是不規則的。今天我寫爬蟲練習的時候,就遇到了這個情況。后來我發現用 lxml 可以很好的去出鏈接,然后我靈光一閃,就去試了試,果然。把每次找到的鏈接傳給一個成員變量保存,這樣就可以直接在下次爬取的時候調用這個變量去訪問下一個要爬取的頁面了

# -*- coding = utf-8 -*-
# @Time : 2021/11/1 17:19
# @Author : 海綿擺擺嘉心糖
# @File : 筆趣閣_一劍獨尊.py
# @Software : PyCharm
import time

import requests
import os
from lxml import etree

name = "牛馬小說_一劍獨尊/"
url_end = "/book/4652/1.html"


def main():
    # 定義首頁的 URL
    baseurl = "https://www.biquge7.com"
    get_data(baseurl)


def get_data(baseurl):
    global url_end
    for i in range(2535):
        url = baseurl + url_end
        # 調用請求函數獲取網頁信息
        html = get_html(url)
        # 對返回的信息進行解析
        xml = etree.HTML(html)
        # 獲取章節標題
        h1_title = xml.xpath('.//div[@class="book reader"]/div[@class="content"]/h1[@class="wap_none"]/text()')
        # 獲取下一頁的鏈接
        next_href = xml.xpath('.//div[@class="book reader"]/div[@class="content"]/div[@class="Readpage pc_none"]/a[@class="Readpage_down js_page_down"]/@href')
        # 獲取正文內容
        text = xml.xpath('//*[@id="chaptercontent"]/text()')
        if not os.path.exists(name):
            print(f"沒有{name}這個目錄,正在創建>>>>>>>>>")
            os.mkdir(name)
        with open(f"{name}{h1_title[0]}.txt", "w", encoding="utf-8") as file_obj:
            for t in text:
                file_obj.write(f"{t}\n")
        print(f"{h1_title[0]}的爬取已完成,正在進入下一章的爬取>>>>>>>>>>>>>")
        url_end = next_href[0]
        # 休眠一秒后執行
        time.sleep(1)


def get_html(url):
    # 頭部信息,告訴服務器你是以什么樣的身份去訪問它
    user_agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.54 Safari/537.36"
    # 定義頭部信息
    headers = {"User-Agent": user_agent}
    # 定義一個字符串變量,用來接收網頁信息
    html = " "
    try:
        # 用 get 的方式請求網頁
        response = requests.get(url=url, headers=headers)
        # 如果出現異常主動報出異常
        response.raise_for_status()
        # 解碼
        html = response.content.decode("utf-8")
    except requests.RequestException as e:
        # 打印異常信息
        print(e)
    return html


if __name__ == '__main__':
    main()
    print("end>>>>>")

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM