Astray.R 发表于 2019-1-10 17:45:23

看看

hzxsxds01 发表于 2019-1-10 20:23:55

多进程爬取金庸小说全集 [修改]

CJPLBC 发表于 2019-1-10 21:06:17

好奇进来{:10_277:}看看

多幸运t 发表于 2019-1-11 04:46:15

yh6788 发表于 2019-1-9 15:04
我试了下,半个小时把全页面全下载下来了,然后我又进目标网址里看了下。

憋说啦,我有点懵😵

94385736 发表于 2019-1-11 06:25:47

zhuwenjian 发表于 2019-1-16 23:36:48


学习学习

woshiaxie 发表于 2019-1-17 08:41:41

多进程爬取金庸小说全集!!!!

yh6788 发表于 2019-1-17 14:17:11

楼主您好,我初学,试着加了一些注解,方便后面同样初学的人。


# -*- coding: cp936 -*-
'''
python 3

多进程爬取金庸小说全集,存在程序运行目录下,应用windows
'''
import time
import os
from urllib import request
from multiprocessing importPool
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()')
      # print(title_novel)
      #得到小说每一个章节的名称
      chapter = html_3.xpath('//div/h1/text()')
      # 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
      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)
    #输出程序结束时间-开始时间,得到程序执行了多久。
'''

denngyu 发表于 2020-3-21 05:03:40

谢谢谢

xysxys 发表于 2021-3-18 03:56:59

666

rsj0315 发表于 2021-3-19 09:25:43

kk

nikita001 发表于 2021-3-24 15:06:08

学习~~

975050208@qq.co 发表于 2021-3-25 10:10:33

{:5_108:}

yangwawa 发表于 2021-3-25 14:00:08

好棒

python初学者021 发表于 2021-3-25 15:33:48

这个只有回复才能看到内容?

slw507520 发表于 2021-6-4 14:01:43

66666666666
页: 1 2 [3]
查看完整版本: 多进程爬取金庸小说全集