python多线程爬斗破苍穹


前言

上星期《斗破苍穹》终于出了,等了这么久,但是呢对于我这种没看过小说的人来说觉得看完之后不过瘾,于是就有了这一片文章…


提示:以下是本篇文章正文内容,下面案例可供参考

一、分析网页

分析一级页面发现,右键查看网页源代码就可以得到想要的内容,包括名字和url。但前面有九个是我们不需要的而且url只有后面一部分,所以我们需要跳过前面九个然后再给其他的url进行一个拼接。
在这里插入图片描述
分析二级页面,按下F12,发现内容都在一个div节点下。
在这里插入图片描述
此处的# 在html中意思是空格
既然分析到位了,那我们就开始办正事吧。

二、源代码

# -!- coding: utf-8 -!-
import re
import requests
import time
from fake_useragent import UserAgent #user-agent库
from threading import Thread #多线程
from lxml import etree #xpath

class Doupo:

    def __init__(self):
        self.url = 'https://www.tycqxs.com/57_57672/' #一级页面
        self.headers = {'User-Agent':UserAgent().random} #生成一个随机的请求头
        self.url_head = 'https://www.tycqxs.com' #二级页面的前缀
        self.urls = [] #储存url
        self.names = [] #储存名字

    #请求网页
    def get_html(self,url):
        response = requests.get(url=url,headers=self.headers).content.decode('utf-8','ignore') #向url发起请求并得到响应内容
        return response #返回响应

    #用re解析网页
    def parse_html(self,html,regex):
        info = regex.findall(html) #在html中找regex并得到一个列表 列表中是结果
        return info #返回找到的结果

    #用xpath提取具体页面的内容
    def xpath_html(self,i):
        while self.urls: #创建循环 如果列表里面有内容就会一直循环 直到没有内容就会结束循环
            url = self.urls.pop(0) #执行一次便删除第一个url
            name = self.names.pop(0) #执行一次便删除一个name   这里url和name是对应的
            html = etree.HTML(self.get_html(url)) #将url传给请求函数得到响应内容 然后将内容转化为Element对象
            content = html.xpath('//*[@id="content"]/text()') #得到这个标签下的所有内容
            for e in content: #遍历所有内容
                with open('./斗破苍穹/'+name,'a+',encoding='utf-8') as f: #打开在本目录下的斗破苍穹文件夹创建(或在创建好的文本下追加)以utf-8的模式写入
                    f.write(' '*7+e.strip()+'\n') #为了美观 先去头尾空格换行 再在前面加空格 后面换行(因为如果直接写入那么两行内容中间空太多行了)
            print("{}完成一个任务!".format(i)) #打印线程几完成了一个任务
            time.sleep(0.1) #每次执行完停0.1秒

    #创建多线程
    def jobs(self):
        jobs = [] #创建一个列表用来储存线程
        for i in range(16): #创建16个线程
            a = Thread(target=self.xpath_html,args=(i,)) #执行self.xpath_html函数 并传给一个参数i给它
            jobs.append(a) #在列表中加入线程
            a.start() #启动线程
        [i.join() for i in jobs] #执行完成以后回收线程

    #主函数
    def run(self):
        one_html = self.get_html(self.url) #向一级页面发起请求,并得到响应内容
        regex = re.compile("<dd><a href='(.*?)' >(.*?)</a></dd>", re.S) #创建模式对象 第一空匹配url(只有后缀) 第二空匹配章节名字
        info = self.parse_html(one_html,regex) #将响应内容和模式对象传给解析的函数parse_html 返回一个列表
        for i in info[9:]: #列表的前九个是一些介绍就不需要了 所以从第十个开始遍历
            if i[1][0] != '第': #排除中间的一些广告(如果开头第一个字不是“第”那么就跳过它)
                continue
            else: #如果是就执行这一步
                url = self.url_head+i[0] #将二级页面的前缀和它结合一起成为一个完整的url
                self.urls.append(url) #将这个url添加到self.urls中
                name = ''.join(i[1].split(' '))+'.txt' #拼接文件名(第一章 陨落的天才)--> (第一章陨落的天才.txt)
                self.names.append(name) #将拼接的文件名加入self.names中

        #待上面的url和name都加入完成之后 用多线程来执行、爬取内容
        self.jobs()

if __name__ == '__main__':
    spider = Doupo()
    spider.run() #调用方法

三、结果

在这里插入图片描述
在这里插入图片描述

总结

本文用了re和xpath解析,多线程爬取数据。
如有不对的地方还望各位大佬指出,谢谢。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值