【爬虫】七、多线程、异步爬虫
创始人
2025-05-30 03:55:08
0

1、多线程

线程启动时间由cpu定。
构造方法:
Thread(group=None, target=None, name=None, args=(), kwargs={})
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 线程名;
args/kwargs: 要传入方法的参数,必须是元组

from threading import Thread#方式1
# def func():
#     for i in range(100):
#         print("func:",i)
#
# if __name__ == '__main__':
#     t = Thread(target=func)
#     t.start()
#
#     for i in range(100):
#         print("main",i)# #方式2
# class MyThread(Thread):   #继承
#     #重写run()
#     def run(self):
#         for i in range(100):
#             print("MyThread",i)
#
# if __name__ == '__main__':
#     t = MyThread()
#     t.start()
#
#     for i in range(100):
#         print("main",i)# 方式3.传参
def func(name):for i in range(100):print(name,i)if __name__ == '__main__':t1 = Thread(target=func,args=("t1",))  #传入的参数必须是元组,若无,会误认为字符t1.start()t2 = Thread(target=func,args=("t2",))t2.start()for i in range(100):print("main",i)

2、多进程

耗资源大,少用。
构造方法:
Process(group=None, target=None, name=None, args=(), kwargs={})

group:参数未使用,值始终为None
target:表示调用对象,即子进程要执行的任务
args:表示调用对象的位置参数元组,args=(1,2,‘egon’,)
kwargs:表示调用对象的字典,kwargs={‘name’:‘egon’,‘age’:18}
name:为子进程的名称

from multiprocessing import Process# #方式1
# def func():
#     for i in range(100):
#         print("func",i)
#
# if __name__ == '__main__':
#     p = Process(target=func)
#     p.start()
#
#     for i in range(100):
#         print("main",i)#方式2
class MyProcess(Process):def run(self):for i in range(100):print("MyProcess",i)
if __name__ == '__main__':p = MyProcess()p.start()for i in range(100):print("main",i)

3、线程池和进程池

语法:

from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor#module
def func(name):for i in range(1000):print(name,i)if __name__ == '__main__':#创建容量为50的线程池,with ThreadPoolExecutor(50) as t:for i in range(100):  #100个任务t.submit(func,name = f"线程{i}")# 等待线程池的任务全部执行完毕才继续执行(守护)print("ok")

例子:用线程池爬JD

import csv
import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor#用线程池爬JDurl = "https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&wq=%E6%89%8B%E6%9C%BApage={i}&s=1&click=0"
header = {"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
}f = open("attachment/JD.csv",mode='w',encoding='utf-8',newline="")
csvwriter = csv.writer(f)def load_page(url,header):resp = requests.get(url,headers=header)resp.encoding = "utf-8"# print(resp.text)# xpath解析html = etree.HTML(resp.text)  #etree.html()可以解析html文件:(服务器上返回的html数据)resp.close()liList = html.xpath("/html/body/div[5]/div[2]/div[2]/div[1]/div/div[2]/ul/li")# print(len(liList))# result = []for li in liList:name = " ".join(li.xpath("./div/div[4]/a/em/text()"))price = str(li.xpath("./div/div[3]/strong/i/text()")).strip("[]''")shop = str(li.xpath("./div/div[7]/span/a/text()")).strip("[]''")commit = str(li.xpath("./div/div[5]/strong/a/text()")).strip("[]''")result = [name,price,shop,commit]csvwriter.writerow(result)print(url,"完成")returnif __name__ == '__main__':#创建含5个线程的线程池with ThreadPoolExecutor(5) as t:for i in range(20):   #一共20个任务分给5个线程t.submit(load_page,url = f'https://search.jd.com/Search?keyword=%E6%89%8B%E6%9C%BA&wq=%E6%89%8B%E6%9C%BApage={i}&s=1&click=0',header=header)print("ok")f.close()

相关内容

热门资讯

造假泛滥、虫入车间、产能拉胯:... 订阅 快刀财经 ▲ 做您的私人商学院世界药房的致命短板。作者:朱末来源:快刀财经(ID:kuai...
影石创新股价“脚踝斩”,刘靖康... 出品|达摩财经近日,第三方数据公司IDC发布了2026年一季度全球手持智能相机行业报告。报告数据显示...
美股半导体股,集体上涨 美股半... 6月29日,美股三大指数集体高开,道指涨0.29%,纳指涨0.96%,标普500指数涨0.55%。 ...
三只*ST股,将摘星脱帽 st... 6月29日晚间,A股三家*ST公司公告称将“摘星脱帽”。 具体来看,*ST艾艾发布关于撤销退市风险警...
【就业创业典型】大棚逐梦人:一... 编者按:近年来,延安市残疾人工作坚持以习近平新时代中国特色社会主义思想为指导,以促进残疾人事业全面高...
公募基金锚定新质生产力,多维赋... 6月22日消息,中国证监会主席吴清近日在2026陆家嘴论坛上表示,资本市场与新质生产力双向奔赴、相互...
液冷服务器概念震荡走强,冰轮环... 6月22日消息,午后液冷服务器概念震荡走强,冰轮环境9天5板,此前康盛股份涨停,大元泵业、川润股份、...
涉留神峪煤矿事故,国家矿山安全... 6月22日消息,国家矿山安全监察局山西局监察执法八处三级调研员耿青禄涉嫌严重违法,涉通洲集团留神峪煤...
周立成拟任中国投资协会秘书长 6月22日消息,中国投资协会发布关于中国投资协会第五届理事会届中调整负责人人选的公示:周立成,男,汉...
以防长称以军已做好对伊采取独立... 据央视新闻,以色列国防部长卡茨日前在与军事记者的闭门谈话中,阐述了以色列在黎巴嫩、伊朗及加沙地带等多...