第一次练习python爬虫: 爬取全书网-《盗墓笔记》

自己学习了大半年python,但是大部分时间在用Django搞web开发。今天忽然被boss cue到说给公司同事稍微讲讲python(公司主业为erp,使用python较少),带他们入门吧。
可我自己就是个刚入门的,还是半瓶子晃荡呢。但是我都答应了,那么就得想办法搞个demo来,起码给他们看看python的厉害之处吧,正发愁的时候,无意间打开了w3c的python3教程,看到了爬虫实战,我觉得这个应该可以引起一些人的兴趣,说不定就拐一个同事走上python的贼船呢。
之前我没有接触过任何的爬虫知识,搞了一下午后,跟着教程完成了这个程序。用很短的时间就可以自己实现一个小任务,这也是python一个很大的优点吧。
原文为W3C-python3教程-python3爬虫实战教程,第一个教程就是了。(原文的原文是本站的大佬Jack-Cui ~)仅为自己的结果展示,不用作任何用途。
当然了,直接copy大佬的程序肯定是不行滴,一是时间久远,笔趣看网站有了反爬机制了,在想爬就不是我现在这点三脚猫功夫能搞定的了,所以我换了无反爬的全书网 ;二是网站编码问题,不知道为什么大佬没遇到,但是我遇到了,解决方法学习自 这里。

# -*- coding:utf-8 -*-
import requests
from bs4 import BeautifulSoup
import sys

'''
类注释:爬取‘全书网’(http://www.quanshuwang.com/)小说《盗墓笔记》
input:none
return: none
author: wxy
last change: 2019/03/22 
'''
class Downloader():

    def __init__(self):
        self.server = 'http://www.quanshuwang.com/'
        self.target = 'http://www.quanshuwang.com/book/9/9055/'
        self.header = {
            'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
        }
        self.names = []     #章节名
        self.urls = []      #章节链接
        self.nums = 0       #章节数

    # 获取章节标题、下载链接
    def get_download_url(self):
        req = requests.get(url=self.target)
        req.encoding = 'GBK'
        html = req.text
        div_bf = BeautifulSoup(html)
        div = div_bf.find_all('div', class_='dirconone')
        a_bf = BeautifulSoup(str(div[0]))
        a = a_bf.find_all('a')
        self.nums = len(a)  # 统计章节数
        for item in a:      # 记录章节标题和url
            self.names.append(item.string)
            self.urls.append(item.get('href'))

    # 获取章节内容:
    # target:章节路径
    def get_contents(self,target):
        req = requests.get(url=target)
        req.encoding = 'GBK'
        html = req.text
        bf = BeautifulSoup(html)
        texts = bf.find_all('div', class_='mainContenr')
        texts = texts[0].text
        return texts

    # 将爬取的内容写入本地文件
    # name:章节名称
    # path:当前路径下,小说文件名
    # text:章节内容
    def writer(self, name, path, text):
        write_flag = True
        with open(path, 'a', encoding='utf-8') as f:
            f.write(name + '\n')
            f.writelines(text)
            f.write('\n\n')


if __name__ == '__main__':
    header = {
        'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0)',
    }
    # ##爬取单章
    # target = 'http://www.quanshuwang.com/book/9/9055/9674263.html'
    # req = requests.get(url=target,headers=header)
    # req.encoding = 'GBK'
    # html = req.text
    # bf = BeautifulSoup(html)
    # texts = bf.find_all('div', class_='mainContenr')
    # print(texts[0].text)

    # # 爬取目录页:
    # target = 'http://www.quanshuwang.com/book/9/9055/'
    # req = requests.get(url=target)
    # req.encoding = 'GBK'
    # html = req.text
    # div_bf = BeautifulSoup(html)
    # div = div_bf.find_all('div', class_='dirconone')
    # print(div[0])

    # # 提取目录url:
    # target = 'http://www.quanshuwang.com/book/9/9055/'
    # req = requests.get(url=target)
    # req.encoding = 'GBK'
    # html = req.text
    # div_bf = BeautifulSoup(html)
    # div = div_bf.find_all('div', class_='dirconone')
    # a_bf = BeautifulSoup(str(div[0]))
    # a = a_bf.find_all('a')
    # for item in a:
    #     print(item.string,item.get('href'))

    # 爬取整本:
    dl = Downloader()
    dl.get_download_url()
    print('《盗墓笔记》开始下载:')
    for i in range(dl.nums):
        dl.writer(dl.names[i], '盗墓笔记.txt', dl.get_contents(dl.urls[i]))
        sys.stdout.write("  已下载:%.3f%%" % float(i/dl.nums) + '\r')
        sys.stdout.flush()
    print('《盗墓笔记》下载完成')

你可能感兴趣的:(Python,爬虫)