首页 > 其他分享 >异步爬虫

异步爬虫

时间:2023-05-19 14:15:06浏览次数:27  
标签:__ 异步 Thread 爬虫 func import main def

异步爬虫

  • 多线程
  • 多进程
  • 协程

多线程与多进程

进程:运行中的程序,每次我们执行一个程序,操作系统对自动的为这个程序准备一些必要的资源(如:分配内存,创建一个能够执行的线程)

线程:程序内,可以直接被CPU调度的执行过程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位

# 两种写法

# 第一种
from threading import Thread


# 创建任务
def func(name):
    for i in range(10):
        print(name, i)


def main():
    # 创建线程
    t1 = Thread(target=func, args=("周杰伦",))
    t2 = Thread(target=func, args=("马斯克",))
    t3 = Thread(target=func, args=("周星驰",))

    # 启动线程
    t1.start()
    t2.start()
    t3.start()

main()

# 第二种 用方法来写 不会

多线程写法

# 两种写法

# 第一种
from threading import Thread


# 创建任务
def func(name):
    for i in range(10):
        print(name, i)


def main():
    # 创建线程
    t1 = Thread(target=func, args=("周杰伦",))
    t2 = Thread(target=func, args=("马斯克",))
    t3 = Thread(target=func, args=("周星驰",))

    # 启动线程
    t1.start()
    t2.start()
    t3.start()

main()

多线程练习

from threading import Thread
import requests
from bs4 import BeautifulSoup

def func(index):
    url = f"http://2chsck.cc/vodtype/1-{index}.html"
    resp = requests.get(url)
    html = resp.text

    page = BeautifulSoup(html, "html.parser")

    # img
    jpg = page.findAll("a", attrs={"class": "stui-vodlist__thumb lazyload"})

    for item in jpg:
        jpgHref = item.get("data-original")
        photo = requests.get(jpgHref)
        jpgName = item.get("title")
        with open(f"images/{index}- {jpgName}.jpg", mode="wb") as f:
            f.write(photo.content)


def main():
    for i in range(101, 201):
        Thread(target=func, args=(f"{i}",)).start()
main()

线程池

# import requests
# from bs4 import BeautifulSoup
# from concurrent.futures import ThreadPoolExecutor
#
#
# def func(page):
#     url = f"https://pic.netbian.com/4kmeinv/index_{page}.html"
#     resp = requests.get(url)
#     resp.encoding = "gbk"
#     html = resp.text
#     page = BeautifulSoup(html, "html.parser")
#     ul = page.find("div", attrs={"class": "slist"})
#     img = ul.findAll("img")
#
#     for item in img:
#         src = "https://pic.netbian.com" + item.get("src")
#         photo = requests.get(src)
#         # print(src)
#         try:
#             with open(f"{src}.jpg", mode="wb") as f:
#                 f.write(photo.content)
#         except:
#             print("error")
#
#
# def main():
#     # 线程池
#     with ThreadPoolExecutor(3) as t:
#         for i in range(2, 10):
#             t.submit(func, i)
#
#
# if __name__ == "__main__":
#     main()


# ----------------------       ^待查询^        -----------------------------

from concurrent.futures import ThreadPoolExecutor

线程池案例

import requests
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48",
}

f = open("新发地.csv", mode="a", encoding="utf-8")


def download(url):
    resp = requests.get(url, headers=headers)
    tree = etree.HTML(resp.text)
    a_list = tree.xpath("//li[@class='market-list-item']/a")
    for a in a_list:
        span = a.xpath("./span/text()")[:4]
        s = ",".join(span)
        f.write(s)
        f.write("\n")
    print(f"{url} 已完成")

for i in range(1, 2):
    with ThreadPoolExecutor(10) as t:
        for i in range(1, 100):

            # 新发地 请求过多需要验证 待解决 2023年4月18日13:16:28
            url = f"https://www.cnhnb.com/hangqing/cdlist-2003192-0-0-0-0-{i}/"
            t.submit(download, url)

多进程

from multiprocessing import Process


def func(name):
    for i in range(1000):
        print(name, i)


if __name__ == '__main__':
    p1 = Process(target=func, args=("周杰伦",))
    p2 = Process(target=func, args=("林俊杰",))
    p1.start()
    p2.start()


"""
何时使用多线程 何时使用多进程
1. 多线程:任务相对统一,互相特别的相似
2. 多进程:多个任务相互独立,很少有交集
"""

标签:__,异步,Thread,爬虫,func,import,main,def
From: https://www.cnblogs.com/sroot/p/17414902.html

相关文章

  • 爬虫基础
    爬虫概述爬虫善:不破坏被爬取的网站的资源恶:影响网站的正常运营(抢票,秒杀,使网站资源宕机)爬虫的矛与盾反爬机制反反爬策略robots.txt协议第一个爬虫fromurllib.requestimporturlopenurl="http://www.baidu.com"resp=urlopen(url)content......
  • #yyds干货盘点#灵活的 Node.js 多功能爬虫库 —— x-crawl
    x-crawlx-crawl是一个灵活的Node.js多功能爬虫库。灵活的使用方式和众多的功能可以帮助您快速、安全、稳定地爬取页面、接口以及文件。如果你也喜欢x-crawl,可以给 x-crawl存储库 点个star支持一下,感谢大家的支持!GitHub:https://github.com/coder-hxl/x-crawl特征异步同步......
  • Python爬虫学习之Requests库
    Requests请求库Requests是⽤Python语⾔编写,基于urllib,采⽤Apache2Licensed开源协议的HTTP库。它⽐urllib更加⽅便,可以节约我们⼤量的⼯作,完全满⾜HTTP测试需求。⼀句话——Python实现的简单易⽤的HTTP库1.了解requests库requests库的介绍requests是一个优雅而简单的Py......
  • 关于razor 异步调用的一些新鲜点,记录
    很久没有写razor了,今天在做一个小工具的时候,通过查资料等,学习了新东西。关于razor通过js异步提交的问题。(不是访问特定的webapi)1.razro自带防 XSRF攻击,因而,调用后台的OnGet或者Onpost方法的时候,都会返回400错误。第一,razor页面,带上 @Html.AntiForgeryToken()第二,在startu......
  • SpringMVC 异步(长轮询)实现消息定点推送
    $(function(){getMsg();});functiongetMsg(){$.ajax({url:"/polling/msg",type:"get",data:{},success:function(data){if(data......
  • WPF 异步加载数据,窗体事件
    加载WPF界面时,需要获取数据,而数据返回的时间比较长,这个时候可以异步加载数据到界面。 1、首先在XAML中触发窗口载入事件 2、在后台代码中处理窗口载入事件(1)找到主窗口类 (2)在MainWindow类中添加XAML中加入的窗口载入事件 这个事件中可以放置各种界面预处理代码 n......
  • 基于转子磁链定向的异步电机矢量控制系统仿真模型 转速在2
    基于转子磁链定向的异步电机矢量控制系统仿真模型转速在2秒由500变为1400,3秒由空载变为额定负载的图如下。转速可调。ID:88160676868051065......
  • 异步编排多任务异步执行
    参考: https://blog.csdn.net/teachy/article/details/104971814创建线程池:/***自定义线程池*intcorePoolSize,核心线程数=CPU核数*intmaximumPoolSize,最大线程数=CPU核数*2*longkeepAliveTime,等待时间,线程池线程>核心线程数,没......
  • 通过网站日志做网络爬虫和恶意访问分析
    普通爬虫分别查看有爬虫标志的访问次数和合计的总页面访问次数catwww.access.log|grepspider-ccatwww.access.log|wc查看爬虫来ip地址来源catwww.access.log|grepspider|awk'{print$1}'|sort-n|uniq-c|sort-nr在防火墙上对其地址做限制/e......
  • vue elementui validate异步校验改成同步校验返回结果
     异步的校验 <script>import{defineComponent,ref}from'vue'exportdefaultdefineComponent({methods:{getFormDataStatus(){letresult=ref(false)this.ruleForm.validate((valid)=>{if(valid){......