如何在Pycharm中制作自己的爬虫代码模板
作者:lhys666 发布时间:2021-03-09 12:07:57
标签: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 。
测试一下:
成功完成任务!!!?
来源:https://blog.csdn.net/lhys666/article/details/122182124
0
投稿
猜你喜欢
- 一、构造dataframeimport pandas as pdimport numpy as npdf=pd.DataFrame(np.a
- 加了三个验证漏洞以及四个getshell方法# /usr/bin/env python3# -*- coding: utf-8 -*-# @
- 本文主要介绍下如何使用第三方库。1. 理解第三方库Python相当于一个手机,第三方库相当于手机里各种各样的APP。当我们想搭建网站时,可以
- 像素是计算机视觉中图像的重要属性。它们是表示图像 * 定空间中光的颜色强度的数值,是图像中数据的最小单位。图像中的像素总数是高度、宽度和通道的
- MySQL扩展库操作MySQL数据库的步骤如下:1:获取连接.2:选取书库。3:设置操作编码。4:发送SQL指令(MySQL数据库可以分为四
- 咱们Python 集中营有一个专题就是分享一些有意思的东西,今天大概看了一下pygame的这个非标准库就想着使用它来做个小游戏-拼图。通过加
- 注意事项:1.PyCharm尽量在官网下载:https://www.jetbrains.com/pycharm/download/也可以用本
- 有时候在使用 Python 的时候,想要对一个数字或者字符串进行补零操作,即把「1」变为一个八位数的「00000001」,这个时候可以使用一
- 前段时间冷空气突袭的时候,据说郊区密云的雪积得挺厚,但北京城内除了飘了一点小雪粒,毫无动静。应该是气温过高所致,我在慈云寺桥附近拍下的照片可
- binascii模块用法binascii模块用于在二进制和ASCII之间转换>> import binascii# 将binar
- 0.偶然间看到一个奇怪的现象>>> x = 1>>> a = var()>>> a[&
- python这样注释,让你的代码看起来更加的优雅,是不是常常感觉自己的python代码写出来,看起来特别的乱,虽然可以正常运行,但是在优雅性
- function commafy() { var num = document.getElementById("NumA"
- 用 Python 关机你肯定听过或者实践过,那么用 Python 开机呢?这是一个神奇的方法,教你如何用 Python 来开机。GitHub
- Python字符串问题在arcpy中版本为 python2.x在QGIS中版本为 python2.x 或者 python3.xpython2
- 报错代码粉丝群里面的一个小伙伴想用requests爬虫,然后遍历Xpath定位的数据列表的时候,发生了报错(当时他心里瞬间凉了一大截,跑来找
- 现象:已知,连接的WIFI网络需要通过代理服务器才能连接外网,按照正常的程序无法发送邮件,而直连一个没有代理的网络【如自己的wifi热点】,
- 目录1. 流程分析2. 具体实现3. 百度图片爬虫+生成素描图我给大家带来的是 50行代码,生成一张素描图。让自己也是一个素描“大师”。那废
- 一、生成器1、生成器定义在Python中,一边循环一边计算的机制,称为生成器:generator2、生成器存在的意义列表所有数据都在内存中,
- 本文实例讲述了php实现的验证码文件类。分享给大家供大家参考。具体如下:<?php/*** @file* @version 1.0*