前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多进程爬虫爬取图片

多进程爬虫爬取图片

作者头像
kirin
发布2020-05-09 15:43:48
3460
发布2020-05-09 15:43:48
举报
文章被收录于专栏:Kirin博客
代码语言:javascript
复制
今天学django学到脑子发热,写个爬虫来降降温吧,
从19点开始写,中间因为引发的绝对路径问题耗费了我1.5个小时,好气噢,
也去翻了翻之前写的爬虫,没法看,我宁愿重写也不想去看自己写的代码,这特么都什么玩意啊!!!
 
import requests
import time
from lxml import etree
import os
import random
import multiprocessing
ip=['112.74.185.33:80','47.101.134.187:8888','47.52.209.8:80','118.24.7.218:80','47.75.62.90:80']
 
t={'http':random.choice(ip)}
if not os.path.exists('./图片'):
    os.mkdir('./图片')
    print('图片文件夹创建成功')
 
 
def get_page_url(url):
    html=requests.get(url,proxies=t)
    data=etree.HTML(html.text)
    dd=data.xpath('.//div//ul[@class="ali"]')
    aa=[]
    bb=[]
    for p in dd:
        a=p.xpath('./li/p/a/text()')
        b=p.xpath('./li/p/a/@href')
        for x1, x2 in zip(a, b):
            x2 = ''.join(x2).strip()
            x2 = 'https://www.ivsky.com' + x2
            aa.append(x1)
            bb.append(x2)
    return {'名字':aa,'链接':bb}
    # 返回字典 里边有图片名字 和详情页的链接
 
# 爬取详情页并存入文件夹中
def get(url):
    # url='https://www.ivsky.com/tupian/kilimanjaro_v57868/'
    html=requests.get(url,proxies=t)
    time.sleep(1)
    data=etree.HTML(html.text)
    title=''.join(data.xpath('.//div[@class="al_tit"]/h1/text()')).strip() # etree
    if not os.path.exists(f'D:\pycharm\class\test\图片\{title}'): # 一开始抛了个notFoundfile错误,去问群上的dalao们,结果吹了半小时牛逼,哎。。。
        os.mkdir(f'./图片/{title}')   # 其实引发的错误并不是路径问题导致的,真正的罪魁祸首是title 
                                    # 因为直接变量引用没有经过join的拼接他还是一个etree对象,所以在下面保存文件时会引发没有找到路径的异常
        print('文件夹创建完毕:',title)
        time.sleep(0.5)
    dd=data.xpath('.//div/ul[@class="pli"]') # 用xpath找标签,
    for xx in dd:
        a=xx.xpath('./li/div/a/img/@src')
        for x in a:
            x=''.join(x).replace('/t/','/pre/')
            x='https:'+x  # 进行字符串的拼接处理 因为获取到的图片是没有请求头http的
            sa=requests.get(x,proxies=t).content # 保存为一个二进制文件
            print(x[-10:])
            with open(r'D:\pycharm\class\test\图片\{}\{}'.format(title,x[-10:]),'wb')as f:
                f.write(sa) # 一开始我使用的相对路径,群里的dalao们说不对,改了过来,最后发现并不是路径的问题,而是etree对象没有转换成字符的问题
    print('文件写入完成,文件夹名称为:',title)
# aaa=os.path.dirname(os.path.abspath(__file__))
# print(aaa)
 
if __name__ == '__main__':
    s_time=time.time()
    pool=multiprocessing.Pool(4) # 开启4个进程来下载图片,速度海星,10s一个页面吧
    for i in range(1, 3):
        url = 'https://www.ivsky.com/tupian/chengshilvyou/index_%s.html' % i # 需要爬取多少页的url构造
        pages=get_page_url(url)
        for page in pages['链接']: # 获取到每一页图片的详情页链接
            pool.apply_async(get,(page,))
    pool.close()
    pool.join()
    print('总共用时',time.time()-s_time,'s')
 
 
好了,到此结束了,多线程爬电影的爬虫好像也写过,ennn好像有写过吧,我找一找。。。。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/03/05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档