我是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栏目的......作为思路参考吧