欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python爬虫爬取奇书阁首页分类小说数据

程序员文章站 2022-06-30 07:58:35
为了学习python爬虫,又来到了奇书阁首页,准备爬取首页分类小说的数据,如图:0X00、准备工作安装标准库lxml、requests、re和requests.exceptions、os、openpyxl0X01、页面分析一共有六个小说类别,分别包裹在六个div标签中,上三个类别父标签相同,下三个类别父标签相同。小说类别包裹在h2标签中,下面的每本小说又在li标签中(偷懒忽略了最上面的小说)。0X02、代码实现首先第一个爬取页面的函数get_page,传入参数url,请求该页面,如果返...

为了学习python爬虫,又来到了奇书阁首页,准备爬取首页分类小说的数据,如图:
python爬虫爬取奇书阁首页分类小说数据

0X00、准备工作

安装标准库lxml、requests、re和requests.exceptions、os、openpyxl


0X01、页面分析

一共有六个小说类别,分别包裹在六个div标签中,上三个类别父标签相同,下三个类别父标签相同。
python爬虫爬取奇书阁首页分类小说数据
小说类别包裹在h2标签中,下面的每本小说又在li标签中(偷懒忽略了最上面的小说)。
python爬虫爬取奇书阁首页分类小说数据

0X02、代码实现

首先第一个爬取页面的函数get_page,传入参数url,请求该页面,如果返回状态码200,证明请求成功,则函数返回响应内容,否则返回None。

def get_page(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        else:
            return None
    except RequestException:
        return None

之后是第二个函数parse_page,对得到的响应的内容进行解析,并将其存入Excel表格中。

def parse_page(text):
    # 打开文件
    if os.path.exists('biquge.xlsx'):
        print('文件biquge.xlsx已存在!')
        wb = openpyxl.load_workbook('biquge.xlsx')
        print('文件biquge.xlsx打开成功!')
    else:
        wb = openpyxl.Workbook()  # 创建文件对象
        print('文件创建成功!')

    order = 2
    # 获取第一个sheet
    ws = wb.active
    ws['A1'] = '小说类别'
    ws['B1'] = '书名'
    ws['C1'] = '作者'
    ws['D1'] = '链接'
    content = []
    html_xpath = etree.HTML(text)
    for i in range(0, 3):
        content_1 = html_xpath.xpath('//*[@id="main"]/div[3]/div[' + str(i + 1) + ']')
        a = html.tostring(content_1[0], encoding='utf-8').decode('utf-8')
        content.append(a)
    for i in range(0, 3):
        content_2 = html_xpath.xpath('//*[@id="main"]/div[4]/div[' + str(i + 1) + ']')
        a = html.tostring(content_2[0], encoding='utf-8').decode('utf-8')
        content.append(a)
    for i in range(0, 6):
        # 获取小说类别
        title = re.findall('<h2>(.*)</h2>', content[i], flags=0)
        # 获取书名
        book = re.findall('<li><a.*?>(.*?)</a>', content[i], flags=0)
        # 获取作者
        author = re.findall('<li>.*?</a>/(.*?)</li>', content[i], flags=0)
        # 获取链接
        link = re.findall('<li><a href="(http://www.xbiquge.la/\\d+/\\d+/)?">', content[i], flags=0)
        for n in range(len(book)):
            text = [title[0], book[n], author[n], link[n]]
            print('书籍 '+book[n]+' 写入成功')
            for x in range(len(text)):
                ws.cell(order, x + 1, text[x])
            order += 1
    wb.save(filename="biquge.xlsx")

首先判断文件biquge.xlsx是否已经存在,有则提示文件已存在,如果没有则创建文件后提示创建文件成功。
接着定义了一个变量order,表示下一次书籍信息存入的行数。第一行则填入了相应的书籍信息。
接下来就到了解析内容的时候了(xpath没学好吃了不少亏…),先后将上下三个类别的内容进行解析。(开始时候没有将得到的element对象进行转化,捣鼓了半天…)进行转化编码a = html.tostring(content_1[0], encoding='utf-8').decode('utf-8')存入列表中。其实这里可以直接用xpath将内容提取出来,但是当时没怎么学xpath,就用了正则表达式,就当学习正则表达式了(害)。
在使用正则表达式进行数据提取的时候也忽略了他的匹配机制,默认的贪婪匹配,导致一直只提取出一条数据。在后面会说一下这个。
得到所有的数据后,将每条数据逐一填入Excel表格,完成。
成果图:
python爬虫爬取奇书阁首页分类小说数据

0X03、完整代码

import requests
from requests.exceptions import RequestException
from lxml import etree, html
import re
import os
import openpyxl

获取页面源码

def get_page(url):
    try:
        headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0"}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        else:
            return None
    except RequestException:
        return None


def parse_page(text):
    # 打开文件
    if os.path.exists('biquge.xlsx'):
        print('文件biquge.xlsx已存在!')
        wb = openpyxl.load_workbook('biquge.xlsx')
        print('文件biquge.xlsx打开成功!')
    else:
        wb = openpyxl.Workbook()  # 创建文件对象
        print('文件创建成功!')

    order = 2
    # 获取第一个sheet
    ws = wb.active
    ws['A1'] = '小说类别'
    ws['B1'] = '书名'
    ws['C1'] = '作者'
    ws['D1'] = '链接'
    # print(text)
    # content = re.findall('(<div class="content.*<ul>.*</ul>.*</div>)', html, flags=0)
    content = []
    html_xpath = etree.HTML(text)
    for i in range(0, 3):
        content_1 = html_xpath.xpath('//*[@id="main"]/div[3]/div[' + str(i + 1) + ']')
        a = html.tostring(content_1[0], encoding='utf-8').decode('utf-8')
        content.append(a)
    for i in range(0, 3):
        content_2 = html_xpath.xpath('//*[@id="main"]/div[4]/div[' + str(i + 1) + ']')
        a = html.tostring(content_2[0], encoding='utf-8').decode('utf-8')
        content.append(a)
    for i in range(0, 6):
        # 获取小说类别
        title = re.findall('<h2>(.*)</h2>', content[i], flags=0)
        # 获取书名
        book = re.findall('<li><a.*?>(.*?)</a>', content[i], flags=0)
        # 获取作者
        author = re.findall('<li>.*?</a>/(.*?)</li>', content[i], flags=0)
        # 获取链接
        link = re.findall('<li><a href="(http://www.xbiquge.la/\\d+/\\d+/)?">', content[i], flags=0)
        for n in range(len(book)):
            text = [title[0], book[n], author[n], link[n]]
            print('书籍 ' + book[n] + ' 写入成功')
            for x in range(len(text)):
                ws.cell(order, x + 1, text[x])
            order += 1
    wb.save(filename="biquge.xlsx")


url = 'http://www.xbiquge.la/'
text = get_page(url)
if text is not None:
    parse_page(text)

0X04、正则表达式

1、贪婪匹配和懒惰匹配 影响的是正则表达式的限定符的匹配结果;
在限定符后面加上?,则为懒惰模式;会匹配最长的以开始位置开始,以结束位置结束的字符串;
在限定符后面不加?,则为贪婪模式;匹配尽可能少的字符。

2、举例
下面这段代码:

import re

string = 'abcsasfjkc'
a = re.search('a.*c', string)
b = re.search('a.*?c', string)
print(a.group())
print(b.group())

对于字符串abcsasfjkc,a采取的正则表达式是’a.*c’,而b是’a.*?c’。则a采取的是贪婪模式,而b是懒惰模式,输出结果为:
python爬虫爬取奇书阁首页分类小说数据

0X05、反思

学艺不精害人,要学好爬虫xpath还是得好好学,写正则表达式时候容易出错,学好xpath则会简单许多。
通过这个练习,学习了python操作Excel的一些简单方法,再接再厉,加油!

本文地址:https://blog.csdn.net/qq_45653588/article/details/107130127