花都网站(建设信科网络),深圳外贸人才网,影视传媒公司,优设网官网教程转载#xff1a;蚂蚁学python 网址#xff1a;【【2021最新版】Python 并发编程实战#xff0c;用多线程、多进程、多协程加速程序运行】 https://www.bilibili.com/video/BV1bK411A7tV/?p8share_sourcecopy_webvd_sourced0ef3d08fdeef1740bab49cdb3e96467实战案…转载蚂蚁学python 网址【【2021最新版】Python 并发编程实战用多线程、多进程、多协程加速程序运行】 https://www.bilibili.com/video/BV1bK411A7tV/?p8share_sourcecopy_webvd_sourced0ef3d08fdeef1740bab49cdb3e96467实战案例对于网络爬虫来讲是属于I/O 操作,比较适用多线程爬虫多进程就不太适合如果对协程分支异步编程asyncio 较为熟悉的话也很方便。小项目任务获取博客园文章标题以及访问连接当然你也可以去访问本网站csdn需要改变的代码部分访问网址以及通过正则提取网页数据网页请求代码这里只是通过单线程串行的方式获取了一页数据blog_spider 文件先创建这样以 blog_spider 命名的python文件import requests
import re
urls [fhttps://www.cnblogs.com/#p{page}for page in range(1,51)]
def craw(url):r requests.get(url).textreturn rdef parse(html):url_Data re.findall(a classpost-item-title href(.*?) target_blank(.*?)/a,html)return url_Data
if __name__ __main__:for result in parse(craw(urls[3])):print(result)
在创建一个名为 thread_pool python文件import concurrent.futures
import pprintimport blog_spider
#这里是导入自己写的一个包我的理解是封装成一个包或者是模块可以供其他python文件调用
with concurrent.futures.ThreadPoolExecutor() as pool:htmls pool.map(blog_spider.craw,blog_spider.urls)htmls list(zip(blog_spider.urls,htmls))for url,html in htmls:print(url,len(html))
print(craw over)
with concurrent.futures.ThreadPoolExecutor()as pool:futures {}for url,html in htmls:future pool.submit(blog_spider.parse,html)futures[future] urlfor future in concurrent.futures.as_completed(futures):url futures[future]print(url,future.result())关于多进程和多线程的关系进程适用cpu密集型线程适用IO密集型线程是由进程所创建的创建一个进程会自动帮你创建一个主线程由主线程可以创建其他子线程线程的数量是有限的因为python由于 GIL(全局事务解释器)锁的限定无论你是多核cpu但是只允许你在同一时间执行一个线程在请求IO时线程是在不定时进行切换的会损耗一定的资源如果线程数量过多线程的切换开销过大这样就会抵消多线程带来的速度优势。第五十页请求到的数据看看获取的数据是否正确检查了一下的确数据不对有可能是反扒机制识别等待时间和网址信息填充存在问题我已经排除我太忙了有时间我会在看看。