今天主要学的是线程池和进程池的内容,有一个关于守护的问题,就是只有当子程序的进程都结束了之后才能继续进行主程序,这个行为称之为守护。
#线程池:一次性开放一些线程,用户直接把任务交给线程池,由线程池把任务分配给各个线程
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def fun(url):
for i in range(1000):
print(url,i)
if __name__ == '__main__':
#创建线程池
with ThreadPoolExecutor(50) as t:
for i in range(100):
t.submit(fun,url=f"线程{i}")
#等待线程池中所有任务都执行完毕才能执行下面步骤(守护)
print("over")
接下来是一个使用xpath解析,利用多线程进行爬取的过程,顺带复习xpath解析,反正是忘得差不多了。
#1.如何提取单个页面的数据
#2.上线程池,多个页面同时爬取
import requests
from lxml import etree#用xpath
import csv
from concurrent.futures import ThreadPoolExecutor
f= open("data.csv","w")
csvwriter=csv.writer(f)
def download_page(url):
resp=requests.get(url)
html=etree.HTML(resp.text)
#这里是直接定位到我们需求的数据,然后复制xpath进来,这里的table是一个列表,里面只含有一个元素,所以需要直接定位到元素[0]
table=html.xpath("/html/body/div[3]/div/div[1]/div[3]/div[2]")[0]
uls=table.xpath("./ul")[1:]#所有的ul里面第0个是表头,我们跳过[1:]
#uls=table.xpath("./ul[position()>1]")方法二
for ul in uls:
text=ul.xpath("./a/li/text()")
#对数据做简单处理:把//和\\去掉
text=(item.replace("/","").replace("\\","") for item in text)
csvwriter.writerow(text)
print(url,"提取完毕")
if __name__=="__main__":
#创建线程池
with ThreadPoolExecutor(50) as t:
for i in range(1,2489):#我们选择的url总共有2488页
#把下载任务移交给线程池
t.submit(download_page,url=f"https://www.guo68.com/market?page={i}")
print("over!")