python爬虫--类级别写法

Posted 南岸青栀*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python爬虫--类级别写法相关的知识,希望对你有一定的参考价值。

类级别写法爬取糗事百科段子

前文回顾

python爬虫–爬取9某1看剧网电视剧

python爬虫–爬取网易云音乐评论

python爬虫–scrapy(再探)

python爬虫–scrapy(初识)

python爬虫–selenium模块

思路:

模块化
需要的模块有

  • 发送请求

    • 主要功能:向URL发送请求,获取响应页面
  • 数据解析

    • 主要功能:解析页面中的所需要的urls和所需要的内容
  • 数据存储

    • 主要功能:存储数据解析后的内容
  • URL管理器

    • 主要功能:管理urkl,包括:添加新url,urls ,获取url,获取还有多少url需要爬取,获取是否还有url需要爬取
  • 调度器

    • 主要功能:协调多个模块之间运行

例子:爬取糗事百科段子

代码

from fake_useragent import UserAgent
import requests
from lxml import etree

# 发送请求
class Downloader():
    def do_download(self,url):
        print(url)
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/84.0.4147.105 Safari/537.36"
        }
        resp = requests.get(url=url,headers=headers)
        if resp.status_code == 200:
            return resp.text

#数据解析
class Parser():
    def do_parse(self,html):
        tree = etree.HTML(html)
        contents = [ div.xpath("string(.)").strip() for div in tree.xpath('//div[@class="content"]')]
        urls =['https://www.qiushibaike.com{}'.format(url) for url in tree.xpath('//ul[@class="pagination"]/li/a/@href')]
        return contents,urls

# 数据保存
class DataOutPut():
    def do_save(self,datas):
        with open("./duanzi.txt",'a',encoding='utf-8') as fp:
            for data in datas:
                fp.write(data+'\\n')

# URL管理器
class URLManager():
    def __init__(self):
        self.new_url = set()
        self.old_url = set()
    # 加入一个url
    def add_url(self,url):
        if url is not None and url and url not in self.old_url:
            self.new_url.add(url)
    # 加入多个url
    def add_urls(self,urls):
        for url in urls:
            self.add_url(url)
    # 获取一个url
    def get_new_url(self):
        url = self.new_url.pop()
        self.old_url.add(url)
        return url
    # 获取还有多少url需要爬取
    def get_new_url_size(self):
        return len(self.new_url)
    # 获取是否还有url需要爬取
    def is_have_new_url(self):
        return self.get_new_url_size() > 0

#调度器
class Scheduler():
    def __init__(self):
        self.download = Downloader()
        self.parse = Parser()
        self.data_out_put = DataOutPut()
        self.url_manager = URLManager()

    def start(self,url):
        self.url_manager.add_url(url)
        while self.url_manager.is_have_new_url():
            url = self.url_manager.get_new_url()
            html = self.download.do_download(url)
            datas,urls = self.parse.do_parse(html)
            self.data_out_put.do_save(datas)
            self.url_manager.add_urls(urls)

if __name__ == '__main__':
    scheduler = Scheduler()
    url = 'https://www.qiushibaike.com/text/'
    scheduler.start(url)

效果图

在这里插入图片描述

以上是关于python爬虫--类级别写法的主要内容,如果未能解决你的问题,请参考以下文章

python爬虫最全总结

scrapy按顺序启动多个爬虫代码片段(python3)

scrapy主动退出爬虫的代码片段(python3)

python 爬虫scrapy的两种写法

Python-利用beautifulsoup写个豆瓣热门图书爬虫

Python爬虫入门教程 64-100 反爬教科书级别的网站-汽车之家,字体反爬之二