用面向对象写一个通用爬虫模板

前言

本文内容及代码仅供交流学习使用,如有不足之处,请多指点,如有用于恶意攻击网站等违法行为,请自行负责.

初衷

学习python爬虫有一段时间了.经常会想如果我有那么一个标准的轻量化模板,对于简单的网页,只要输入网址,我就可以得到网页源码.省那么一点点导库,设参,把主要精力放在解析提取数据上面,要是能把重试,错误日志,提高爬取速率等等也加上去,像scrapy一样用注释预设好,对于经常忘代码和参数的我,省点时间翻查代码,又不需要像scrapy那样复杂的各种设置,那该是不错的吧?

实现

先来一个最简单的爬虫类

现在开始,一步一步来实现需求.如标题,我的目标是使用面向对象,用类来定义一个爬虫,所以得先有一个最简单的爬虫类和运行方法.
先来看爬虫的步骤,分析网页,获取数据,解析提取数据,保存数据.要得到一个最简单的爬虫类,获取数据,解析提取数据,是必不可少的,运行的方法,我也写到类里去,详见代码:

import requests

class Web_spider:

    def get_response(self, url):
        """
        获取数据的方法
        :param url:
        :return:
        """
        response = requests.get(url)
        return response

    def data_parser(self, response):
        """
        数据解析的方法
        :param response:
        :return:
        """
        print(response.status_code)
        print(response.text)

    def run(self,url):
        """
        运行的方法
        :param url:
        :return:
        """
        response = self.get_response(url)
        self.data_parser(response)

if __name__ == '__main__':
    url = 'https://www.baidu.com'
    Web_spider().run(url)

给简单的类加点参数

运行一下,结果正常,下面继续加点料
因为不是每个网站都可以像百度那样裸奔,所以我们需要加上请求头参数,请求头可以放在获取数据的函数里,也可以放在__init__方法里,这次我们看看放在__init__里的代码:

    def __init__(self):
        self.headers1 = {
   
            'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'}
        self.headers = {
   'User-Agent': UserAgent().random
                        ,
                        }

一些网站需要做会话维持才能拿到想要的数据的,UA还变来变去那不是明摆着告诉人家你是爬虫么,至于一般情况,用随机请求头就够了.你也许会奇怪我为什么把逗号做了换行处理,其实那只是为了在需要增加参数的时候更方便一点.当然,读者也许会有更好的方法,不喜勿喷.
请求头参数定义好了,自然不能忘了去做设置.
针对一些网站源代码编码经常和我们程序设置的编码不一致的处理代码先放上去,在需要的时候启用它,整合完成后代码如下:

    def get_response(self, url):
        """
        获取数据的方法
        :param url:
        :return:
        """
        response = requests.get(url, headers=self.headers)
        # response.encoding = response.apparent_encoding
        return response

重试的方法

关于重试的方法,之前学过一种,代码如下:

def download(url, times=5):  
# times 控制异常重试的次数, 超过这个次数, 程序任然会报错    
try:        
	all_url = 'http://www.xbiquge.la' + url        
	response_2 = requests.get(all_url)        
	response_2.encoding = response_2.apparent_encoding         
    html_data_2 = response_2.text        
    
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值