多线程爬虫
目的
为了提高爬虫效率,实现多线程同步运行,比如一秒同时爬取50个连接。主要用到的是python自带的多线程库threading
# 实现 首先引用所需要的库 1
2import threading
from threading import Thread
Notice
需要注意的是两个参数
locks = threading.Lock()#线程锁
主要用来多线程对单一资源进行写入的时候,能锁住所有线程,避免多个线程同时对一个资源进行读写操作threadmax = threading.BoundedSemaphore(50)#总线程数
设置一下这个爬虫系统最大的线程数,避免资源过度消耗,或者线程无限增加导致被爬取的服务器出现宕机等情况
主要代码
1 | class Duoxiancheng(): |
通常多线程还会涉及到代理ip池的运用
相较于免费的代理ip,付费的会更加稳定,为了避免打广告,我这里不推荐哪一个公司的产品,感兴趣可以私信我,下面提供一个较为通用的通过付费ip池构建一个项目的代理ip池的方法
1
2
3
4
5
6def get_ip_from():
global ip_list
print('获取ip')
proxyurl='你自己申请的代理ip api'
prox=requests.get(proxyurl).text.split('\r\n')
ip_list=prox1
2
3
4
5from threading import Timer
def time1():
t1=4*60
t = Timer(t1, get_ip_from)
t.start()1
2
3
4
5
6
7
8def get_ip_from():
global ip_list,task_continue
print('获取ip')
proxyurl='你自己申请的代理ip api'
prox=requests.get(proxyurl).text.split('\r\n')
ip_list=prox
if task_continue:
time1()1
2
3
4
5
6prox=ipp_list[random.randint(0, len(ip_list))]
proxies = {
'http':'http://' +prox ,
'https': 'https://'+prox,
}
response=requests.get('url',headers=headers,cookies=cookies,proxies=proxies)1
2
3
4
5
6
7
8
9
10while True:
try:
result=requests.get('url',headers=headers,cookies=cookies,proxies=proxies)
except:
prox=ip_list[random.randint(0, len(ipp_list))]
print('更换ip')
proxies = {
'http':'http://' +prox ,
'https': 'https://'+prox,
}