python爬虫-多进程-爬百度贴吧图片
python爬虫-多进程-爬百度贴吧贴吧
工欲善其事必先利其器,需要使用的python模块如下:
- urllib.request :用于发送HTTP请求
- re:用于使用正则表达式
- os:调用Windows系统函数
- multiprocessing:添加进程
import urllib.request
import re
import os
import multiprocessing
踩点:
-
打开百度贴吧,随便点一个讨论,例如: (https://tieba.baidu.com/p/5977620714)博主基于这个网页爬取,即程序默认网址
-
分析网页
上图圈主的即为图片下载的真实连接
接下来 多打代码少动脑:
1.主要构成部分:
- 完善函数open_url:
def open_url(url="https://tieba.baidu.com/p/5977620714"):
#下载网页
req = urllib.request.Request(url)
req.add_header('User-Agent',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.26 Safari/537.36 Core/1.63.5773.400 QQBrowser/10.2.2059.400')
response = urllib.request.urlopen(req)
html = response.read()
return html
- 完善函数img_get:
def img_get(html):
#获取图片链接
html = html.decode('utf-8')
p = r'<img class="BDE_Image" src="([^"]+\.jpg)'
img_lists = re.findall(p, html)
return img_lists
- 完善sava_img:
def save_img(img_lists, q):
#保存图片
for img_list in img_lists:
filename = img_list.split('/')[-1]
file = open_url(img_list)
with open(filename, 'wb')as f:
f.write(file)
q.put(img_list)
- 完善main:
def main():
url = str(input('请输入网址:(使用默认地址输入Y)'))
if url == 'Y':
html = open_url()
else:
html = open_url(url)
#print(html)
img_lists = img_get(html)
if img_lists:
folder = str(input('请输入存储图片文件夹名称:'))
# 建立文件夹
os.mkdir(folder)
os.chdir(folder)
#创建队列
q=multiprocessing.Queue()
#开辟子进程
t1=multiprocessing.Process(target=save_img, args=(img_lists, q))
t1.start()
#主线程--进度条
finish_num = 0
all_lists_num = len(img_lists)
while True:
q.get()
finish_num +=1
print("\r已完成dowload:%f%%" % (finish_num * 100 / all_lists_num), end="")
if finish_num > all_lists_num:
break
print("")
else:
print("Eerror!网址出错,非静态可下载网页\n")
Last
利用re 简化构造正则表达式过程
采用队列实现主子进程之间数据的联系
利用多进程实现下载,显示下载进度
默认爬取网址图自有亮点