代码语言: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好像有写过吧,我找一找。。。。