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