|
吾爱游客
发表于 2020-8-18 10:52
1、申 请 I D:2virgo3
2、个人邮箱:1135032976@qq.com
3、原创技术文章:Python-异步爬虫爬取图片
===========================================
使用的模块:
iimport os,requests
from lxml import etree
from multiprocessing.dummy import Pool
===========================================
总流程:
1.使用requests库对网站发起请求,获得网站源码
2.创建etree对象
3.使用xpath解析数据
4.使用Pool类异步下载数据
5.使用os库创建文件夹,持久化存储数据
===========================================
代码:
import os,requests
from lxml import etree
from multiprocessing.dummy import Pool
def img_pages(i)://图片名称以及URL获取
if i == 1:
url = 'http://pic.netbian.com/4kfengjing/index.html'
if i != 1:
url = 'http://pic.netbian.com/4kfengjing/index_'+str(i)+'.html'
page_text = requests.get(url=url,headers=headers).text
tree = etree.HTML(page_text)
li_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')
for li in li_list:
img_url ='http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
img_name=img_name.encode('iso-8859-1').decode('gbk')
dic={
"name":img_name,
"url":img_url,
}
all_img.append(dic)
def get_img_date(dic): //图片下载(堵塞)
src = dic['url']
name = dic['name']
print(name,'正在下载.......'+'\n')
response = requests.get(url=src,headers=headers).content
file_path = 'pic/'+name
with open(file_path,'wb') as fp:
fp.write(response)
print(name,'下载完成'+'\n')
//开始
headers = {
"User-Agent":"Mozilla/5.0"
}
all_img=[]//储存解析到的图片URL和图片名字
if not os.path.exists('./pic')://创建文件夹
os.mkdir('./pic')
for i in range(1,5)://下载 1-5 页图片
img_pages(i)
pool = Pool(5)//开启5个线程
pool.map(get_img_date,all_img)//载入堵塞
pool.close()
pool.join()
===========================================
小记:
1.os库:Python标准库,常用路径操作、进程管理、环境参数等几类。
2.requests库:它比urllib更加方便,可以节约我们大量的工作,常用.get()和.post()。
3.为什么用xpath解析?
-不太喜欢正则表达式,有太多的元字符,运算符还有优先级的考虑。
-BeautifulSoup很多人觉得简单而且API人性化,但是性能上没有xpath强。
-xpath,因为底层是C语言编写,性能没话说。操作难易上,网页右键检查,选中需要的标签后再右键可以直接复制xpath,个人感觉xpath会更方便一些。
4.进程池pool进行自动控制进程
-注意调用join之前先调用close,否则会出错。
-启用线程不能过多。
-要将程序中阻塞操作(图片下载)封装为函数,作为.map()的参数。 |
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|