【爬虫】七、多线程、异步爬虫
创始人
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()

相关内容

热门资讯

燕梳之星明亚保险经纪揭聪:向前... 我是揭聪,因为姓氏不多见,很容易被大家记住。凭借学科竞赛加分升入本地最好的高中,到保送研究生,再到进...
收千万罚单,多人被禁业,浦发银... 浦发银行(600000.SH)再收千万级罚单。日前,国家金融监管总局官网消息显示,浦发银行因三项违法...
“水果第一股”将正式退市 曾被誉为“水果第一股”的洪九果品,迎来退市终局。12月24日,香港联交所发布公告,从12月30日上午...
重大资产重组获批 五新隧装将切... 中经记者 庄灵辉 卢志坤 北京报道筹划约一年后,五新隧装(835174.BJ)重大资产重组近日获得中...
2025年投行人“忙到飞起” 2025.12.26本文字数:2956,阅读时长大约5分钟作者 |第一财经 周楠封图 |AI生成今年...
合肥,又将诞生一个明星IPO 合肥又一家明星独角兽要IPO了。在90后“天才”贺羽带领下,估值超95亿元的国仪量子于近日冲向A股。...
臭宝合作《疯狂动物城2》,品牌... 作者|乌塔编辑|李小天凌晨的影院座无虚席,院内的周边被一扫而空。这个冬日,“狐兔CP”的粉丝们盛装出...
罕见!这一平台上,比特币突发闪... 每经编辑|杜宇 币圈,上演罕见一幕! 数据显示,当地时间周三晚间,在币安交易所的BTC/USD1交...
变革生进适变图强——收官“十四... 在生猪产业经历了“猪周期”的剧烈震荡与深度洗牌后,中国养猪业正从规模扩张的“上半场”,全面转入降本增...
胜通能源,走出11连板 12月26日盘初,胜通能源再度涨停,报42.1元/股,走出11连板行情,最新总市值逼近120亿元。 ...