|
发表于 2019-1-17 14:17:11
|
显示全部楼层
楼主您好,我初学,试着加了一些注解,方便后面同样初学的人。
# -*- coding: cp936 -*-
'''
python 3
多进程爬取金庸小说全集,存在程序运行目录下,应用windows
'''
import time
import os
from urllib import request
from multiprocessing import Pool
from lxml import etree
from concurrent.futures import ThreadPoolExecutor
def get_html(url):
#定义函数get_html
headers = {'User-Agent': r'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0',
'Connection': r'keep-alive',
'Referer': r'http://www.itcast.cn/channel/teacher.shtml'}
#设置爬虫的虚拟头
req = request.Request(url, headers=headers)
#等于req = request.get(url)#多了一个headers头伪装
page = request.urlopen(req).read().decode('utf-8')#得到表页
html = etree.HTML(page)#新增表页地址
print(page)
return html #得到新的地址
def download(url_3,m):
html_3 = get_html(url_3)
# 得到小说名称
title_novel = html_3.xpath('//div/div/span/a/text()')[1]
# print(title_novel)
#得到小说每一个章节的名称
chapter = html_3.xpath('//div/h1/text()')[0]
# print(chapter)
#得到每一个章节小说的内容
content = html_3.xpath('//body/div/div/p/text()')
if m == 'o':
folder = r'旧版/%s/' % title_novel
#定义小说名的目录
if (not os.path.exists(folder)):
os.makedirs(folder)
#如果没有目录,就新建这个目录
elif m == 'n':
folder = '新修版/%s/' % title_novel
if (not os.path.exists(folder)):
os.makedirs(folder)
else:
folder = '修订版/%s/' % title_novel
if (not os.path.exists(folder)):
os.makedirs(folder)
filename = folder + chapter + '.txt'
with open(filename, 'a', encoding="utf-8") as f:
f.write(chapter + '\n')
for j in content:
with open(filename, 'a', encoding="utf-8") as f:
f.write(j + '\n')
print('正在下载' + title_novel + chapter + ',请稍后....')
def main(url):
url_2 = 'http://www.jinyongwang.com' + url
html_2 = get_html(url_2)
data_urls = html_2.xpath('//ul[@class="mlist"]/li/a/@href')
#进入微循环,下载每一个资料,并交download函数处理
for i in data_urls:
#循环处理data_urls里面的数据
url_3 = 'http://www.jinyongwang.com' + i
#在每一个data_urls里面的数据前面加上http://www.jinyongwang.com的全称,然后赋值给url_3
m = i[1]
download(url_3,m)
if __name__ == '__main__':
#需要获取的第一个网址
#程序开始,如果执行名包括程序名,程序开始执行
start_time = time.time()
#记录程序开始时间
star_url = 'http://www.jinyongwang.com/book/'
#设置要抓哪个网址
html_1 = get_html(star_url)
print(html_1)
'''
#用def的get_html函数第一步处理目标网址
urls = html_1.xpath('//ul[@class="list"]/li/p[@class="title"]/a/@href')
p = ThreadPoolExecutor(max_workers=20)
#线程池的个数不超过CPU的5倍,20是双核四线程cpu
for i in urls:
#进入循环,处理urls里面的每一个值,并且把每一个值赋给i,然后处理完。
p.submit(main,i)#下载页面。利用main函数
p.shutdown()
#处理得到的页面,并整理保存。
end_time = time.time()
#记录程序结束时间
time1 = end_time-start_time
print("用时" + time1)
#输出程序结束时间-开始时间,得到程序执行了多久。
''' |
|