zoukankan      html  css  js  c++  java
  • 代理ip的使用以及多进程爬取

    一.代理皮的简单使用

    简单的看一二例子即可
    
    import requests
    #代理ip 高频的ip容易被封,所以使用ip代理
    #免费代理 ip:www.goubanjia.com    快代理  西祠代理
    headers={
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36'
    }
    url='https://www.baidu.com/s?wd=ip'
    #ip代理的使用proxies,先指定协议的类型,http,https,再指定ip的端口
    page_text=requests.get(url=url,headers=headers,proxies={'https':'1.10.186.79:8080'}).text
    
    with open('ip.html','w',encoding='utf-8') as f:
        f.write(page_text)

     二.多进程爬取

    import requests
    import re
    import random
    from multiprocessing.dummy import Pool
    from lxml import etree
    
    #多线程爬取一定是在耗时比较多的情况下
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.98 Safari/537.36 LBBROWSER'
    }
    #爬取第一页数据
    url='https://www.pearvideo.com/category_6'
    page_text=requests.get(url=url,headers=headers).text
    tree=etree.HTML(page_text)
    #xpath解析返回一个列表
    li_list=tree.xpath('//ul[@id="listvideoListUl"]/li')
    # print(li_list)
    #循环列表获取视频的url
    
    #解析出视频详情页的url
    video_url_list=[]
    for li in li_list:
        detail_url='https://www.pearvideo.com/'+li.xpath('./div/a/@href')[0]
        detail_page_text=requests.get(url=detail_url,headers=headers).text
        ex='srcUrl="(.*?)",vdoUrl'
        video_url=re.findall(ex,detail_page_text,re.S)[0]#re.单行匹配,一定要记得写,返回的额还是列表
        # 存放的是所有视频的url
        video_url_list.append(video_url.rstrip('"'))
    
    #从网页直接获取视频
    def video_download(url):
        return requests.get(url=url,headers=headers).content
    #保存下来的视频
    def save_video(data):
        name=str(random.randint(1,5000))+'.mp4'
        with open(name,'wb') as f:
            f.write(data)
            print(name+'保存成功')
    
    if __name__ == '__main__':
        # #获取视频数据和写入都是比较耗时间的,我我们就用多进程进行会比较块
        # #实例化一个进程池
        pool=Pool(5)
        #map函数接收两个参数,第一是函数,第二是可迭代对象,函数会依次作用到可迭代对象的每一个元素
        video_data=pool.map(video_download,video_url_list)
        print("-->",video_data)
        #持久化存储视频的过程也是比价耗时间的,所以需要多进程会比较块一点
        pool.map(save_video,video_data)
        pool.close()
        pool.join()
  • 相关阅读:
    List接口之ArrayList
    锁定线程:同步方法
    锁定线程:同步块
    通过Lambda表达式实现多线程
    通过实现Runnable接口来实现多线程
    通过继承Thread类实现多线程
    super关键字的经典案例
    Merge Two Sorted Lists
    Remove Element
    Remove Duplicates from Sorted List
  • 原文地址:https://www.cnblogs.com/tjp40922/p/10444015.html
Copyright © 2011-2022 走看看