爬虫从入门到入预(15)

今天主要学的是线程池和进程池的内容,有一个关于守护的问题,就是只有当子程序的进程都结束了之后才能继续进行主程序,这个行为称之为守护。

#线程池:一次性开放一些线程,用户直接把任务交给线程池,由线程池把任务分配给各个线程
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!")

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值