自己动手爬虫看小说

用python爬虫bqg小说(re正则表达式)

一.准备工作
1.安装re
2.安装requests
3.使用笔趣阁网址https://www.quge7.com
4.本代码基于Python3.8,

二.re 正则表达式的用法
1.compile 用来截取网页源代码中的内容
2.finditer 用来对compile中的内容进行提取,并返回一个迭代器
三. 原理及实现
1.进入该页面.笔趣阁网页2.右键点击空白处审查元素,点击Network,刷新该页面,找到该网址的Network,确定Requests Methodget模式在这里插入图片描述

3.使用requests进行get访问网页,并对访问结果进行储存。

url = "https://www.quge7.com"

resp = requests.get(url)
page = resp.text

4.右键点击空白页面处页面源代码,对要访问的内容进行查找

图片中红色表框为要寻找的书名,蓝色表框中则为要进行访问的网址。
5. 使用re.compile进行对蓝色表框中的内容进行提取,使用finditer进行对compile中的寻找,并返回一个迭代器

obj = re.compile(r'alt="剑来"></a></div><dl><dt><span>烽火戏诸侯</span><a href="(?P<web>.*?)"',re.S)   #爬取书

result = obj.finditer(page)
for i in result:
    url1 = i.group("web")

group是对(?P<web>.*?)中的进行正则表达式中用于获取分段截获的字符串
6.对返回的web进行深入访问,即可进入子页面中,在此处进行子页面访问时要加入主页面的网址
在这里插入图片描述
8.右键点击页面空白处,点击网页源代码,进入子页面网页源代码中选择要进行爬取的章节
在这里插入图片描述
图片中分别标注了1,2,3 ,我们要对2 中的内容进行提取,使用compile函数1,3分别为限制,即可对2进行提取。
再次使用finditercompile进行查询,返回一个迭代器。

child_page_resp = requests.get("https://www.quge7.com" + url1,headers=header)
    child_page = child_page_resp.text

    obj1 = re.compile(r'<dd><a href ="(?P<zhangjie>.*?)">(?P<name>.*?)</a>',re.S)   #爬取章节地址
    result1 = obj1.finditer(child_page)

9.对2进行访问,此时进入一个新的有着内容的页面,再次右键点击网页源代码,搜索到小说的内容,再次使用compile,finditer进行爬取。

    for it in result1:
        url2 = it.group('zhangjie')
        url2_name = it.group('name')
        child_page_page_resp = requests.get("https://www.quge7.com"+url2)
        child_page_page = child_page_page_resp.text

        obj2 = re.compile(r'<div id="chaptercontent" class="Readarea ReadAjax_content">  (?P<passage>.*?)<p class="readinline">',re.S)     #爬取章节内容
        result2 = obj2.finditer(child_page_page)

        for itt in result2:
            url3 = itt.group('passage')

10.对爬取的小说内容进行保存。

 for itt in result2:
            url3 = itt.group('passage')

            with open (f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as f:
                f.write(url3)
                f.close()

11.此时你会发现保存的内容中有一些网页中的内容,对于我们这些聪明的程序员来说,那可谓是小菜一带啊,以此我是用了再次打开文件,对文件进行读取访问,并对文件中的一些内容进行replace

            with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'r+',encoding='utf-8',errors='ignore') as fo:
                contents = fo.readlines()
                fo.close()

            with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as foo:
                for line in contents:
                    line_reach = line.replace('<br /><br />', '\n')

                    foo.write(line_reach)
                foo.close()

            print(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt over!")
    time.sleep(1)

print("over")

四.全部的源代码如下:

import re
import requests
import time
url = "https://www.quge7.com"

resp = requests.get(url)
page = resp.text
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3947.100 Safari/537.36"}
obj = re.compile(r'alt="剑来"></a></div><dl><dt><span>烽火戏诸侯</span><a href="(?P<web>.*?)"',re.S)   #爬取书

result = obj.finditer(page)
for i in result:
    url1 = i.group("web")
    child_page_resp = requests.get("https://www.quge7.com" + url1,headers=header)
    child_page = child_page_resp.text

    obj1 = re.compile(r'<dd><a href ="(?P<zhangjie>.*?)">(?P<name>.*?)</a>',re.S)   #爬取章节地址
    result1 = obj1.finditer(child_page)
    for it in result1:
        url2 = it.group('zhangjie')
        url2_name = it.group('name')
        child_page_page_resp = requests.get("https://www.quge7.com"+url2)
        child_page_page = child_page_page_resp.text

        obj2 = re.compile(r'<div id="chaptercontent" class="Readarea ReadAjax_content">  (?P<passage>.*?)<p class="readinline">',re.S)     #爬取章节内容
        result2 = obj2.finditer(child_page_page)

        for itt in result2:
            url3 = itt.group('passage')

            with open (f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as f:
                f.write(url3)
                f.close()

            with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'r+',encoding='utf-8',errors='ignore') as fo:
                contents = fo.readlines()
                fo.close()

            with open(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt",mode = 'w',encoding='utf-8',errors='ignore') as foo:
                for line in contents:
                    line_reach = line.replace('<br /><br />', '\n')

                    foo.write(line_reach)
                foo.close()

            print(f"E:\python\爬虫\笔趣阁\剑来\{url2_name}.txt over!")
    time.sleep(1)

print("over")

五.参考资料
1.python re的findall和finditer
2.python re.compile() 详解——Python正则表达式
3.正则表达式以及group的用法

  • 17
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值