Y25
- 导入需要使用的模块(建议用到什么,导什么)
- 创建网络请求对象,禁用urllib3警告(可写可不写),模拟浏览器访问
- 定义函数实现网络数据爬取的功能
- 设置主进程(__ name __==’ __ main __’)下的需要获取数据的网址链接
- 定义函数完成页面数据下载(根据页面的布局设置逻辑)
# 导入urllib3模块,os文件操作模块,time时间模块
import urllib3, os, time
# 导入lxml库中的额etree,方便解析数据
from lxml import etree
# 导入进程池
from multiprocessing import Pool
# 创建网络请求对象
http = urllib3.PoolManager()
# 禁用urllib3警告(urllib3在进行https请求时,可能会抛出对应的警告,可以设置disable_warnings禁用对应的警告)
urllib3.disable_warnings()
# 模拟浏览器访问网页
header = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.116 Safari/537.36', 'Content-type':'text/json'}
# 定义函数完成网络数据爬取(可传入回调函数和网络链接,或者直接传入网络链接)
def get_net_data(url, method='get', callBack=None):
# 发送网络请求
response = http.request(method,url,headers=header, retries=5)
# 回调函数不为空,返回对应数据
if callBack is not None:
callBack(response.data)
# 只传入网络链接的下,直接利用etree方法,解析提取html页面数据的方式。转化为节点树的方式
else:
return etree.HTML(response.data)
# 定义函数完成页面数据下载
def download_page(url):
# 调用get_net_data函数爬取对应网站数据
data = get_net_data(url)
# 根据对应的节点路径表达式来选取网页中的节点或节点集
srcs = data.xpath("//ul[@class='new-img']/ul/li/a/img/@src")
titles = data.xpath("//ul[@class='new-img']/ul/li/a/@title")
for j in range(len(srcs)):
os.mkdir('img/{0}'.format(titles[j]))
response = http.request('get',srcs[j],headers=header)
f = open('img/{0}/{1}'.format(titles[j],srcs[j].split('-')[-1]),'wb+')
f.write(response.data)
print('第%s张下载完成'%j)
f.close()
# 设置主进程
if __name__ == '__main__':
url = "http://www.7160.com/yulebagua/"
# 创建进程池,实现多个进程同步执行的操作,并且方便管理多进程。(实现5个进程同时执行任务)
pool = Pool(5)
# apply_async用来向进程池中添加一个异步执行的进程。 apply则用来向进程池中添加一个同步执行的融进程。
pool.apply_async(download_page, args=(url,))
# 关闭进程池,一旦进程池调用close操作,此后,进程池不再接受任何进程任务。
pool.close()
# 设置主进程等待子进程任务执行完毕
pool.join()
结果展示:
个人小结,定有不足,欢迎指点。
谢谢~