多进程爬虫爬取图片

2020-05-09 15:43:48 浏览数 (2)

代码语言: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:pycharmclasstest图片{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:pycharmclasstest图片{}{}'.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好像有写过吧,我找一找。。。。

0 人点赞