iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何在Pycharm中制作自己的爬虫代码模板
  • 596
分享到

如何在Pycharm中制作自己的爬虫代码模板

2024-04-02 19:04:59 596人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录写作背景爬虫代码在 PyCharm 中设置代码模板写作背景 最近本菜鸡有几个网站想要爬,每个爬虫的代码不一样,但 有某种联系,可以抽出一部分通用的代码制成模板,减少代码工作量,于

写作背景

最近本菜鸡有几个网站想要爬,每个爬虫的代码不一样,但 有某种联系,可以抽出一部分通用的代码制成模板,减少代码工作量,于是就有了这篇文章。

如果觉得我这篇文章写的好的话,能不能给我 点个赞 ,评论 、收藏 一条龙(☆▽☆)。如果要点个 关注 的话也不是不可以。

如果 有什么问题,还 请各位大佬提出,不胜感激。

爬虫代码

我的爬虫代码都是使用的 自己 写的 多线程

因为我的代码能力很差,所以如果代码有哪里让各位大佬倍感不适,请及时在评论区 指出,谢谢各位大佬。

我的代码如下:


#!/usr/bin/python3
# -*- coding=utf-8 -*-
# @Author  : lhys
# @FileName: proxy_tool.py

import requests
import threading

timeout = 300
lock = threading.Lock()

# 请求头用自己的
headers = {
    '': ''
}

class MyProxy:

    def __init__(self, proxy_api='', proxy_server='', max_use=5000, try_count=5):

        if not (proxy_api or proxy_server):
            raise TypeError('Proxy_api and proxy_server cannot be empty at the same time.')

        self.proxies = None if not proxy_server else {
            'Http': proxy_server,
            'https': proxy_server
        }
        # 代理API
        self.proxy_api = proxy_api
        # 代理 IP 最大使用次数
        self.max_use = max_use
        # 测试代理 IP 次数,超过次数即认为代理 IP 不可用
        self.try_count = try_count
        # 是否爬虫请求出错,如果出错,直接更换 IP
        self.flag = 0
        # 代理 IP 剩余生存时间
        self.proxy_ttl = 0
        # 各种
        self.lock = threading.Lock()
        self.ttl_lock = threading.Lock()
        self.flag_lock = threading.Lock()
    
    def set_flag(self):
        self.flag_lock.acquire()
        self.flag = 1
        self.flag_lock.release()

    def get_flag(self):
        self.flag_lock.acquire()
        flag = self.flag
        self.flag_lock.release()
        return flag

    def decrease_ttl(self):
        self.ttl_lock.acquire()
        self.proxy_ttl -= 1
        self.ttl_lock.release()

    def get_ttl(self):
        self.ttl_lock.acquire()
        ttl = self.proxy_ttl
        self.ttl_lock.release()
        return ttl

    def set_ttl(self):
        self.ttl_lock.acquire()
        self.proxy_ttl = self.max_use
        self.ttl_lock.release()

    def get_proxy(self):
        self.lock.acquire()
        proxy = self.proxies
        self.lock.release()
        return proxy

    def set_proxy(self):

        if self.proxy_ttl > 0 and self.flag == 0:
            return

        old = self.proxies

        if self.flag == 1:

            for try_count in range(self.try_count):

                try:
                    requests.get('https://www.baidu.com', headers=headers, proxies=old, timeout=timeout)
                    print(f'Test proxy {old} successfully.')
                    return

                except requests.exceptions.ProxyError or requests.exceptions.ConnectionError or requests.exceptions.ConnectTimeout:
                    print(f'Test proxy {old} failed.')
                    break

                except Exception as e:
                    print(e)

        if not self.proxy_api:
            raise ValueError('代理 IP 不可用,且代理 IP API未设置。')

        while True:

            res = requests.get(self.proxy_api)

            # 这一部分按照自己的代理 IP 文档来,仅供参考
            try:

                if res.JSON()["ERRORCODE"] == "0":

                    ip, port = res.json()["RESULT"][0]['ip'], res.json()["RESULT"][0]['port']

                    self.lock.acquire()

                    self.proxies = {
                        'http': 'http://%s:%s' % (ip, port),
                        'https': 'http://%s:%s' % (ip, port)
                    }

                    print(f'Set proxy: {ip}:{port}.')

                    self.flag = 0

                    self.lock.release()

                    self.set_ttl()

                    return

                else:
                    print(f'Set proxy failed.')

            except Exception as e:
                print(e)

Proxy = MyProxy()

def request_by_proxy(url, use_proxy=True):

    while True:

        try:
            # 使用代理
            if use_proxy:
            
                proxy_ttl = Proxy.get_ttl()
                print(proxy_ttl)
                
                # 如果 超过最大使用次数 或者 请求出现错误,重新设置 IP
                if proxy_ttl <= 0 or Proxy.get_flag():
                    Proxy.set_proxy()

                print(Proxy.get_ttl())

                proxy = Proxy.get_proxy()

                lock.acquire()
                res = requests.get(url, headers=headers, proxies=proxy, timeout=timeout)
                lock.release()

                Proxy.decrease_ttl()

                return res

            else:

                res = requests.get(url, headers=headers, timeout=timeout)

                return res

        except requests.exceptions.ProxyError as pe:
            if use_proxy:
                lock.release()
            print(f'Proxy {Proxy.proxies} is not available, reason: {pe}.')
            Proxy.set_flag()

        except requests.exceptions.Timeout as t:
            if use_proxy:
                lock.release()
            print(f'Time out, reason: {t}.')
            Proxy.set_flag()

        except Exception as e:
            if use_proxy:
                lock.release()
            print(e)

#!/usr/bin/python3
# -*- coding=utf-8 -*-
# @Author  : lhys
# @FileName: spider.py

import time
import threading
from multiprocessing import Queue
from proxy_tool import request_by_proxy

threshold = 30
queue = Queue()

class Spider(threading.Thread):

    def __init__(self, use_proxy=True):
        super(Spider, self).__init__()
        self.use_proxy = use_proxy

    def get_data(self, url):

        try:

            res = request_by_proxy(url, self.use_proxy)
            
            # 响应处理
            pass

        except Exception as e:

            print(e)

        return

    def run(self):

        while True:

            # 如果队列空了,等待一会儿。
            # 过了指定的时间后,如果队列出现数据,就继续爬
            # 如果队列还是空的,停止线程

            if queue.empty():
                time.sleep(threshold)

            if not queue.empty():
                url = queue.get()
                self.get_data(url)
                time.sleep(threshold)

            else:
                print('Queue is empty.')
                return

在 Pycharm 中设置代码模板

打开 File -> settings -> Editor -> Live Templates,点击 Python,如下图所示:

可以看到,已经有一些自动补全的模板了,以 tcp_Client 为例,如下图所示:

可以看到 Pycharm 有提示。

使用 TCP_Client。

如果我们要制作自己的代码模板,就点击 + ,如下图所示:

点击 Live Template 。(第二个是 创建模板组,目前我们不需要,直接在 Python 模板组下创建就好了)。

其中:

  • Abbreviation 译为 缩写,就是 自动补全框中出现的名字 。
  • Description 译为 描述,就是 对这个代码模板进行描述,可空。
  • Template text 译为 模板文本,就是 要设置的模板代码。

然后在下方 define 处选择在哪个模板组中定义,可 根据自己需求或喜好选择模板组 ,我这里选择 Python ,点击 ok 。

测试一下:

成功完成任务!!! 

到此这篇关于如何在Pycharm中制作自己的爬虫代码模板的文章就介绍到这了,更多相关Pycharm制作爬虫代码模板内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 如何在Pycharm中制作自己的爬虫代码模板

本文链接: https://www.lsjlt.com/news/161145.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在Pycharm中制作自己的爬虫代码模板
    目录写作背景爬虫代码在 Pycharm 中设置代码模板写作背景 最近本菜鸡有几个网站想要爬,每个爬虫的代码不一样,但 有某种联系,可以抽出一部分通用的代码制成模板,减少代码工作量,于...
    99+
    2024-04-02
  • 如何在HTML中创建自己的颜色代码?
    HTML颜色代码由六个十六进制数字组成,范围从0到F。前两个数字表示红色,中间两个数字表示绿色,最后两个数字表示蓝色。例如,颜色代码#FF0000表示纯红色,#00FF00表示纯绿色,#0000FF表示纯蓝色。 您还可以使用RGB颜色代码...
    99+
    2024-02-14
    HTML 颜色代码 16进制 RGB
  • 如何在Sublime3中设置自己的代码片段
    本篇内容主要讲解“如何在Sublime3中设置自己的代码片段”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何在Sublime3中设置自己的代码片段”吧!在 Sublime Text 3 中设置...
    99+
    2023-06-25
  • gitee中如何创建自己的代码仓库
    本篇内容介绍了“gitee中如何创建自己的代码仓库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注册Gitee账号首先,需要在Gitee网站...
    99+
    2023-07-05
  • 如何在微信上制作自己的小程序卖东西
    在当今的数字化时代,微信小程序已成为电商行业的重要平台。本文将详细解析电商微信小程序的制作流程,帮助你了解从零到上线的过程。 一、前期准备 确定商城定位和目标群体:在制作电商微信小程序前,你需要明确商城的定位,如销售什么产品、面...
    99+
    2023-10-11
    微信小程序
  • 如何在PHP开发中进行版本控制和代码协作?
    如何在PHP开发中进行版本控制和代码协作?随着互联网和软件行业的迅速发展,软件开发中的版本控制和代码协作变得越来越重要。无论是独立开发者还是团队开发,都需要一个有效的版本控制系统来管理代码的变化和协同工作。在PHP开发中,有几个常用的版本控...
    99+
    2023-11-02
    PHP开发 版本控制 代码协作
  • 如何将自己的python代码发布在pip install给别人使用你知道吗
    目录1.编写模块结构1.1 git创建空文件1.2 编写包功能函数1.3 包必备函数1、README.md文件是在git上生成的说明项目的文件2、setup.py文件内容3、lici...
    99+
    2024-04-02
  • 如何在Visual Studio 2010中创建自定义的代码段
    这篇文章主要介绍了如何在Visual Studio 2010中创建自定义的代码段,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在项目中新增一个xml文件为carysn.sni...
    99+
    2023-06-17
  • 如何在 Python 中使用 path 模块,让你的代码更加高效?
    Python是一门强大的编程语言,它提供了许多内置模块和库,使得开发者可以更加高效地编写程序。其中,path模块是一个非常实用的模块,它可以帮助我们操作文件路径和目录,让我们的代码更加高效。本文将介绍如何在Python中使用path模块,以...
    99+
    2023-08-08
    教程 面试 path
  • PHP Git 实战:代码管理与协作中的版本控制如何实现?
    git,一种分布式版本控制系统,可用于管理 php 代码,提高组织性和协作性。步骤包括:1. 安装 git;2. 初始化存储库;3. 添加和提交代码;4. 克隆存储库;5. 拉取和推送更...
    99+
    2024-05-13
    php git
  • 如何在Go编程中使用自然语言处理技术,让你的代码更加智能?
    自然语言处理技术(NLP)是人工智能领域的一个重要分支,它旨在让计算机理解人类的自然语言。在Go编程中,使用NLP技术可以让我们的代码更加智能,本文将介绍如何在Go编程中使用NLP技术。 一、Go中的自然语言处理库 Go语言中有许多优秀的N...
    99+
    2023-06-20
    编程算法 学习笔记 自然语言处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作