python爬虫开发之“读文章”网页爬取

目标:

将小说网站上所有的青春校园小说,保存到本地磁盘。(以小说标题为目录,保存各个章节的小说章节)

小说网站入口:

http://xs.duwenzhang.com/list1/

因为前两天发表的那篇博客虽然说能够成功抓取,但是还是存在着一些小问题,如乱码。。

今天的我,逻辑比较清晰,索性就把它给修改了。

开发的过程中,主要出现了以下几个问题:


  1. 由于入口地址只能够抓取,7页小说所在的url,并且url中是有重复的,为什么呢?这是因为首页的url和入口的url是一样的。所以需要把首页爬取下来的url放入集合中。那么怎么才能够抓取19页(青春校园小说一共有19页小说)的url呢?我是通过将首页的url抓取下来,通过自己构造的函数,再一次的去抓取它们。。 (目前我的水平是这样,如果有大佬能够指点一下我,我将万分感谢)
  2. 抓取下来的小说标题作为目录名时,需要注意,有的小说名很长....还有,小说存在着创建目录时不能使用的字符,例如 ':'、'\t'、等等问题,都需要将其替换了。
  3. 最后就是有的小说内容是不存在的!因为源网站上的资源找不到了..(大概是内容被和谐了)所以通过BeautifulSoup获取的Tag下的对象需要判断是不是为空!不然会报错。
  4. 最后附上源代码,望大佬们指正
import os
import re
import urllib.request
from bs4 import BeautifulSoup


# 目标: 将该小说网站上所有的青春校园小说,保存到本地磁盘。(以小说标题为目录,保存各个章节的小说章节)

def get_url_list(url):
    new_url = set()
    new_url.add(url)  # 把第一页添加到新的url列表中http://xs.duwenzhang.com/list1/
    rq = urllib.request.urlopen(url)
    soup = BeautifulSoup(rq, 'html.parser')
    url_list = soup.find_all('a', href=re.compile(r'/list1/[0-9]+.html'))
    for url in url_list:
        new_url.add(url['href'])
    return new_url


def get_full_urlList(url_list):
    new_url = list(url_list)
    for url in new_url:
        rq = urllib.request.urlopen(url)
        soup = BeautifulSoup(rq, 'html.parser', from_encoding='iso-8859-1')
        new_url_list = soup.find_all('a', href=re.compile(r'/list1/[0-9]+.html'))
        for deep_url in new_url_list:
            if deep_url['href'] not in new_url:
                new_url.append(deep_url['href'])
    return set(new_url)


def Create_novel_dir_and_href(url_list):
    href_set = set()
    for url in url_list:
        rq = urllib.request.urlopen(url)
        soup = BeautifulSoup(rq, 'html.parser', from_encoding='gbk')
        # 
title_list = soup.find_all('h2') href_list = soup.find_all('a', href=re.compile(r'/1/[0-9]+/')) for href in href_list: href_set.add('http://xs.duwenzhang.com' + href['href']) for title in title_list: correct = title.get_text() string = re.compile(r'\|') correct_title = string.sub(' ', correct) # 把|替换成 ' ' # if len(correct_title) > 20: correct_title = correct_title[:20] dir_path = 'F:/爬虫文件/青春校园小说/' + correct_title # 文件目录不能有 | if not os.path.exists(dir_path): os.mkdir(dir_path) print('小说目录创建成功!') return href_set def get_chapter_list(url_list): for url in url_list: chapter_href = set() rq = urllib.request.urlopen(url) soup = BeautifulSoup(rq, 'html.parser', from_encoding='gbk') title = soup.find('h1').get_text() # 题目的长度要小于12 if len(title) > 12: title = title[:12] dir_path = ('F:/爬虫文件/青春校园小说/[青春 校园] ' + title).strip() chapter_list = soup.find_all('a', href=re.compile(r'/1/[0-9/]+.html')) for lst in chapter_list: chapter_href.add(lst['href']) for page_url in chapter_href: rq = urllib.request.urlopen(page_url) soup = BeautifulSoup(rq, 'html.parser', from_encoding='gbk') page_title = soup.find(name='dt') # 文章标题不能有冒号.... page_content = soup.find(name='dd') if page_title and page_content: string = re.compile(r'(:|/\t|/?|\t)') page_content = page_content.get_text() page_title = page_title.get_text() page_title = string.sub('', page_title) page_path = dir_path + '/' + page_title + '.txt' f = open(page_path, 'w', encoding='gbk', errors='ignore') f.write(page_content) f.close() print('成功写入了小说:%s,小说章节:%s' % (title, page_title)) else: continue print('爬取成功') if __name__ == '__main__': root_url = 'http://xs.duwenzhang.com/list1/' # 根url,即校园小说首页 Url_List = get_url_list(root_url) # 入口函数,获得 主页url和其它页url Full_url = get_full_urlList(Url_List) Novel_url = Create_novel_dir_and_href(Full_url) # 创建小说目录,并返回这些小说的入口url get_chapter_list(Novel_url)

python爬虫开发之“读文章”网页爬取_第1张图片

python爬虫开发之“读文章”网页爬取_第2张图片python爬虫开发之“读文章”网页爬取_第3张图片

 

---end

 

你可能感兴趣的:(python爬虫开发,文章爬取,爬虫,存储到本地文件,bs4)