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

目录
  • 写作背景
  • 爬虫代码
  • 在 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制作爬虫代码模板内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • python爬虫爬取图片的简单代码

    Python是很好的爬虫工具不用再说了,它可以满足我们爬取网络内容的需求,那最简单的爬取网络上的图片,可以通过很简单的方法实现.只需导入正则表达式模块,并利用spider原理通过使用定义函数的方法可以轻松的实现爬取图片的需求. 1.spider原理 spider就是定义爬取的动作及分析网站的地方. 以初始的URL**初始化Request**,并设置回调函数. 当该request**下载完毕并返回时,将生成**response ,并作为参数传给该回调函数. 2.实现python爬虫爬取图片 第一步

  • 利用Python网络爬虫爬取各大音乐评论的代码

    python爬虫--爬取网易云音乐评论 方1:使用selenium模块,简单粗暴.但是虽然方便但是缺点也是很明显,运行慢等等等. 方2:常规思路:直接去请求服务器 1.简易看出评论是动态加载的,一定是ajax方式. 2.通过网络抓包,可以找出评论请求的的URL 得到请求的URL 3.去查看post请求所上传的数据 显然是经过加密的,现在就需要按着网易的思路去解读加密过程,然后进行模拟加密. 4.首先去查看请求是经过那些js到达服务器的 5.设置断点:依次对所发送的内容进行观察,找到评论对应的UR

  • Python爬虫爬取爱奇艺电影片库首页的实例代码

    上篇文章给大家介绍了Python爬取爱奇艺电影信息代码实例 感兴趣的朋友点击查看下. 今天给大家介绍Python爬虫爬取爱奇艺电影片库首页,下面是实例代码,参考下: import time import traceback import requests from lxml import etree import re from bs4 import BeautifulSoup from lxml.html.diff import end_tag import json import pymys

  • python实现scrapy爬虫每天定时抓取数据的示例代码

    1. 前言. 1.1. 需求背景. 每天抓取的是同一份商品的数据,用来做趋势分析. 要求每天都需要抓一份,也仅限抓取一份数据. 但是整个爬取数据的过程在时间上并不确定,受本地网络,代理速度,抓取数据量有关,一般情况下在20小时左右,极少情况下会超过24小时. 1.2. 实现功能. 通过以下三步,保证爬虫能自动隔天抓取数据: 每天凌晨00:01启动监控脚本,监控爬虫的运行状态,一旦爬虫进入空闲状态,启动爬虫. 一旦爬虫执行完毕,自动退出脚本,结束今天的任务. 一旦脚本距离启动时间超过24小时,自动

  • Python 爬虫批量爬取网页图片保存到本地的实现代码

    其实和爬取普通数据本质一样,不过我们直接爬取数据会直接返回,爬取图片需要处理成二进制数据保存成图片格式(.jpg,.png等)的数据文本. 现在贴一个url=https://img.ivsky.com/img/tupian/t/201008/05/bianxingjingang-001.jpg 请复制上面的url直接在某个浏览器打开,你会看到如下内容: 这就是通过网页访问到的该网站的该图片,于是我们可以直接利用requests模块,进行这个图片的请求,于是这个网站便会返回给我们该图片的数据,我们

  • python爬虫爬取某网站视频的示例代码

    把获取到的下载视频的url存放在数组中(也可写入文件中),通过调用迅雷接口,进行自动下载.(请先下载迅雷,并在其设置中心的下载管理中设置为一键下载) 实现代码如下: from bs4 import BeautifulSoup import requests import os,re,time import urllib3 from win32com.client import Dispatch class DownloadVideo: def __init__(self): self.r = r

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

    目录 写作背景 爬虫代码 在 Pycharm 中设置代码模板 写作背景 最近本菜鸡有几个网站想要爬,每个爬虫的代码不一样,但 有某种联系,可以抽出一部分通用的代码制成模板,减少代码工作量,于是就有了这篇文章. 如果觉得我这篇文章写的好的话,能不能给我 点个赞 ,评论 .收藏 一条龙(☆▽☆).如果要点个 关注 的话也不是不可以. 如果 有什么问题,还 请各位大佬提出,不胜感激. 爬虫代码 我的爬虫代码都是使用的 自己 写的 多线程. 因为我的代码能力很差,所以如果代码有哪里让各位大佬倍感不适,请

  • 如何在pycharm中安装第三方包

    有的时候我们在使用pycharm编辑python,需要导入各种各样的包,这些包是不能直接使用的,需要先进行安装.否则就会出现模块导入错误.下面介绍如何在pycharm中安装第三方包. 第一步 首先打开pycharm,在菜单栏找到File,然后点击找到settings,见图: 第二步 找到Project Interpreter,点击右侧的"+"号,添加: 第三步 在输入栏中直接输入自己想要的包,比如"numpy",就会自动出现.找到后点击设置包: 这样就设置成功啦~

  • 教你如何在pycharm中安装opencv,tensorflow,keras

    目录 一.首先安装Anaconda,python和pycharm 二.首先安装opencv 三.安装tensorflow和kerass 四.小结 我在安装环境的时后,怎么都装不上去,搞了好久,现在来写一下心得. 一.首先安装Anaconda,python和pycharm 有很多教程,我就不在此赘述 二.首先安装opencv 1.点击左下角的Terminal 2.输入pip install opencv-python,然后按键盘上的enter(亲测有效) 3.看到successfully就说明安装

  • 如何在pycharm中配置pyqt5设计GUI操作教程

    目录 PyQt5简介 为什么选择PyQt5 在Pycharm中配置PyQt5 一.标题安装PyQt5模块 1.点击设置 2.安装pyqt5,pyqt5-tools,pyqt5designer 3.默认从官网上下载模块 二.配置PyQt5设计器(Qt Designer)及转换工具 1.Qt Designer 2.PyUIC 3.qrcTOpy PyQt5简介 1.什么是GUI:Graphical User Interface,图形用户界面,用于人机交互. 2.怎么设计GUI:Qt 3.什么是Qt:

  • 教你如何在Pycharm中导入requests模块

    1.找到python的安装路径: 如果忘记可以在Pycharm运行如下代码: import sys pythonpath = sys.executable print(pythonpath) 路径如下: 2.打开CMD: 转到python路径下的Scripts文件夹下: 3.输入要下载的PiP命令:pip install requests 等待下载,出现Successfully,,,,则下载成功 4.出现错误的解决办法: 如果出现如上图错误,则继续在CMD上运行: 1.输入语句"pip3 ins

  • 教你如何在pycharm中使用less

    前端css中用到less,在pycharm中安装配置less操作步骤如下: 1.点开setting,在Plugins中搜索node.js(安装less之前得安装node.js),安装成功后关闭重新打开pycharm. 2.点开pycharm左下角的Terminal,输入 npm install -g less ,安装less: 3.检查是否安装成功,执行命令"lessc -v"查看版本: (正常执行命令之后应该会看到less版本号信息,但是我的pycharm不知道为什么报如下截图错误,

  • 如何在android中制作一个方向轮盘详解

    目录 先上效果图 原理很简单,其实就是一个自定义的view 计算滑块位置的原理: 通用性很好的接口: 小技巧: 代码部分 写在最后: 先上效果图 原理很简单,其实就是一个自定义的view 通过观察,很容易发现,我们自己的轮盘就两个view需要绘制,一个是外面的圆盘,一个就随手指移动的滑块: 外面的圆盘很好绘制,内部的滑块则需要采集手指的位置,根据手指的位置计算出滑块在大圆内的位置: 最后,我们做的UI不是单纯做一个UI吧,肯定还是要用于实际应用中去,所以要加一个通用性很好的回调. 计算滑块位置的

  • 如何在pycharm中快捷安装pip命令(如pygame)

    这是我自己实测过的方法,直接在命令行里输入pip install +(所需要的库),即可成功下载,可能它会自动检测电脑Python的版本而下载对应的版本,各位可以试一下! 比如:在命令框输入 pip install pygame 安装 pyganme pip install matplotlib 安装 matplotlib 测试: 无任何提示即表明安装成功! 补充:Python在终端通过pip安装好包以后,在Pycharm中依然无法使用的解决办法 在终端通过pip装好包以后,在pycharm中导

  • PyCharm中如何直接使用Anaconda已安装的库

    前言 实习生问:我咋看见你经常用Anaconda的jupyter notebook写python代码,为啥不用PyCharm呢? - 对于我个人而言现在主要的工作是数据分析,挖掘,直接下载Anaconda安装后,就可以启动jupyter notebook,写代码也感觉比较方便,尤其是PyCharm的启动和运行很笨重 但是之前用Django以及爬虫项目的时候,PyCharm优势就非常明显了 较为详细的解释 Jupyter notebook的特点: 开源. 支撑 30 种语言,包括一些数据科学领域很

  • 在PyCharm中安装PaddlePaddle的方法

    如何在PyCharm中安装PaddlePaddle? 1.基本环境 Python:3.8.5 PyCharm:COMMUNITY 2019.3 2.检查PyCharm中是否可以正常运行代码 2.1查看安装的Python版本 按快捷键win+R,输入cmd: 输入"python --version"后回车,可查看到python版本显示为3.8.5: 2.2查看安装的PyCharm版本 打开PyCharm,点击Help,选择About: 此处PyCharm版本显示为:COMMUNITY 2

随机推荐