" name="sm-site-verification"/>
侧边栏壁纸
博主头像
PySuper 博主等级

千里之行,始于足下

  • 累计撰写 206 篇文章
  • 累计创建 14 个标签
  • 累计收到 2 条评论

目 录CONTENT

文章目录

面向对象爬虫示例

PySuper
2019-11-04 / 0 评论 / 0 点赞 / 28 阅读 / 0 字
温馨提示:
本文最后更新于2024-05-28,若内容或图片失效,请留言反馈。 所有牛逼的人都有一段苦逼的岁月。 但是你只要像SB一样去坚持,终将牛逼!!! ✊✊✊

面向对象

  • 确实很多爬虫我们直接面向过程也可以解决
  • 但是大家可能忘了一个问题:三大特性
  • 面向对象来写的话,代码复用就能给我们省去很多时间了
  • 面向过程和面向对象,以及切片编程,后面再给大家细说,下面就上模板啦

模板文件

写在前面

  • 一个方法实现一个功能
  • 注意区分形参实参
  • 区分yield列表推导式
  • 解析函数方法很多:xpathbeautifulsoup4正则表达式
  • 记得处理返回值None
  • 不同情况使用不同的调用方式

初始化方法

  • 定义当前类里面用到的变量
  • 未知参数在具体函数中使用.format(参数)替换(%s也可以,推荐.format())
import requests
from lxml import etree


class Template():
    def __init__(self):
        """
        初始化变量
        """
        self.base_url = "https://123123/list/020000,000000,0000,00,9,99,2,{}.html?"
        self.headers = {}

获取URL列表

  • 可以生成器,亦可以使用列表推导式
    • 生成器:一个一个返回,数据生成时间较长时使用比较好用
    • 列表推导式:处理完所有数据再返回,数据生成时间短时比较好用
    def get_url_list(self):
        """
        通过base_url获取URL的列表
        :return: 通过base_url获取到的url_list
        """
        # 1. 使用yield返回数据
        for page in range(1, 100):
            url = self.base_url.format(page)
            yield url
        # 2. 使用列表推导式
        return [self.base_url.format(page) for page in range(1, 100)]

获取网页源码

  • 这里是获取网页源码,对于Ajax请求直接返回数据的注意返回值
  • 注意状态码编码、返回的是html
    def get_url_html(self, url):
        """
        获取当前url的html
        :param url: 需要抓取的url
        :return: 当前url的html
        """
        response = requests.get(url, headers=self.headers)
        if response.status_code == 200:
            response.encoding = response.apparent_encoding  # 指定编码
            return response.text
        return None

解析网页源码

  • 拿到网页源码之后,在这里解析,可用的方法比较多,大家自行选择
  • 就像上面提到的,这里就比较适合用yield返回
    def parse_html(self, html):
        """
        解析当前html
        :param html: 需要解析的html文本
        :return: 当前html中的数据
        """
        x_html = etree.HTML(html)
        items = x_html.xpath("")  # xpath/
        for item in items:
            yield item

处理结果数据

  • 记住一个方法只做一件事,这里我们只保存一个数据
  • 这与面向过程有点区别,面向过程的时候,这里可能就要处理上一个函数返回的列表了
  • 一样,存文本、存SQL(MySQL、MongoDB),或者再处理都是可以的
    def parse_item(self, item):
        """
        处理结果:文本,SQL,print...
        :param item: 需要处理的数据
        :return: 当前数据的处理结果
        """
        print(item)

入口函数

  • 这里就编写整个处理流程就可以了
  • 上面没有做的一些事在这里就可以操作了
  • 如果想把入口函数写的简洁,把这里的iffor放到函数里就可以了
    def run(self):
        for url in self.get_url_list():
            html = self.get_url_html(url)
            if html == None:
                continue
            for item in self.parse_html(html):
                if item == None:
                    continue
                self.parse_item(item)

调用

  • 这里是直接实例化一个对象,然后调用它的方法
  • 如果在其他情况调用,酌情选择调用方式
template = Template()
template.run()
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区