python爬虫小项目练习:爬取笔趣阁首页分类小说数据

为了学习python爬虫,又来到了笔趣阁首页,准备爬取首页分类小说的数据,如图:
python爬虫小项目练习:爬取笔趣阁首页分类小说数据_第1张图片

0X00、准备工作

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


0X01、页面分析

一共有六个小说类别,分别包裹在六个div标签中,上三个类别父标签相同,下三个类别父标签相同。
python爬虫小项目练习:爬取笔趣阁首页分类小说数据_第2张图片
小说类别包裹在h2标签中,下面的每本小说又在li标签中(偷懒忽略了最上面的小说)。
python爬虫小项目练习:爬取笔趣阁首页分类小说数据_第3张图片

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('

(.*)

'
, content[i], flags=0) # 获取书名 book = re.findall('
  • (.*?)', content[i], flags=0) # 获取作者 author = re.findall('
  • .*?/(.*?)
  • '
    , content[i], flags=0) # 获取链接 link = re.findall('
  • ', 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爬虫小项目练习:爬取笔趣阁首页分类小说数据_第4张图片

    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('(
    = [] 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('

    (.*)

    '
    , content[i], flags=0) # 获取书名 book = re.findall('
  • (.*?)', content[i], flags=0) # 获取作者 author = re.findall('
  • .*?/(.*?)
  • '
    , content[i], flags=0) # 获取链接 link = re.findall('
  • ', 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爬虫小项目练习:爬取笔趣阁首页分类小说数据_第5张图片

    0X05、反思

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

    你可能感兴趣的:(python,python,正则表达式,python,新浪爬虫,新浪微博,selenium,源码,xpath)