Python爬虫:爬取某网站时,有多个路径,每个路径有多种参数,要爬取全部数据,如何提速,多线程还是多进程?如何构架?怎样实现? 20C

我是Python爬虫小白,假如某网站有多个栏目,他们的url路径不同,每个栏目又可以拼接多种不同参数。如果要爬取全部数据,我该如何提速,多线程还是多进程?

结合代码来看,我现在已经写好了每个栏目的爬取代码,单线程/进程的伪代码如下:

我想爬取该网站A栏目路径下的3种不同数据(3种不同的参数)和B栏目路径下的3种数据(3种不同的参数),我该如何提速?用多线程还是多进程?如何构架?怎么实现呢?

def login(url):
    登陆函数

def get_A(拼接参数):
    url = “A栏目对应的url?”
    params = {
    "参数":拼接参数
    }
    data = requests.get(url, headers=hearders,params=params)
    解析并获取A路径下拼接参数的数据
    return 爬取数据

def get_B=(拼接参数):
    url = “B栏目对应的url?”
    params = {
    "参数":拼接参数
    }
    data = requests.get(url, headers=hearders,params=params)
    解析并获取B路径下拼接参数的数据
    return 爬取数据


if__name__="__main__"
    login(登陆网站)
    get_A(“A栏目的第1种拼接参数”)
    get_A(“A栏目的第2种拼接参数”)
    get_A(“A栏目的第3种拼接参数”)
    get_B(“B栏目的第1种拼接参数”)
    get_B(“B栏目的第2种拼接参数”)
    get_B(“B栏目的第3种拼接参数”)
vaassen
vaassen 如果对这个进行多线程实现,该如何编写呢?
7 天之前 回复

4个回答

看瓶颈在哪里
如果是外部因素,比如服务器带宽、你的网络带宽、服务器限速等情况,无论哪种优化都没用
如果是cpu密集操作同时你有多个处理器,或者网络延迟比较大,那么多线程或者多进程可以提高速度
多进程可以增加稳定性,编写程序难度低,适合多计算机扩展
多线程在线程之间传递同步数据更方便,内存消耗少

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复vaassen: python本身就支持多线程啊,但是你要自己去写任务分割、汇总和同步
7 天之前 回复
u011109586
爱月亮 回复: 多线程还是多进程根据你的部署方式和机器资源来分析。如果单台机子,你就用多线程吧没啥大区别。
7 天之前 回复
u011109586
爱月亮 回复vaassen: 用python threading包 参考 文章 https://www.cnblogs.com/fnng/p/3670789.html
7 天之前 回复
vaassen
vaassen 请问,如果多线程实现的话,怎么写呢?
7 天之前 回复

实际上多进程更简单,分别运行多个程序,每个程序负责一块,最好做个参数配置,省得改代码

jingluan666
jingluan666 回复jingluan666: 多进程,就是你把程序打包成exe文件,可以复制几份,分别运行
7 天之前 回复
vaassen
vaassen 回复jingluan666: 这个是多线程吧,您说的多进程该怎么写呢?
7 天之前 回复
jingluan666
jingluan666 回复vaassen: https://blog.csdn.net/yexudengzhidao/article/details/86750810
7 天之前 回复
vaassen
vaassen 回复: 多进程* 不好意思
7 天之前 回复
vaassen
vaassen 请问怎么写多线程呢?
7 天之前 回复

你这个任务主要的瓶颈在获取网页的时间等待,建议使用异步或者协程的方法单线程执行。可使用的模块有:gevent、grequest、tornado、asyncio、aiohttp

当然多进程或多线程也可以,他们分别对应的模块为:
多进程:multiprocessing模块
多线程模块:threading模块 或multiprocessing.dummy 模块

很明显,拆分每个栏目逻辑...具体参数在 函数内部获取......多线程就可以...最高效率的话,自己测试线程数量就可以了.

import queue
url_list= queue.Queue()  # 使用队列....里面装的就是每一个 url
def get_B():  # 不要参数..直接用 队列获取.
    while 1:
          url = url_list.get() # 获取队列中单个值, 比如  “B栏目对应的url?”
            params = {
            "参数":拼接参数
            }
            data = requests.get(url, headers=hearders,params=params)
            解析并获取B路径下拼接参数的数据
            return 爬取数据
if__name__="__main__"
    login(登陆网站)

        for _ in range(5):  #  5 就是分别开启 5 个线程..
                     t1 = threading.Thread(target=get_A, name=_tname).start()
                    t2 = threading.Thread(target=get_A, name=_tname).start()

多线程就这样的啊...不复杂..也不会导致线程不安全.. ...上面已经写了 b栏目的......作为思路参考吧

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问