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

我是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种拼接参数”)

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

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

你这个任务主要的瓶颈在获取网页的时间等待,建议使用异步或者协程的方法单线程执行。可使用的模块有: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栏目的......作为思路参考吧