Python爬虫——WuXiaWorld英文版小说

前言

工作有一段时间了,每天早上醒来刷朋友圈发现朋友们都在国外,想想他们当年的英语水平,也比我高不到哪里去,而我现在由于半年没碰英语,怕是单词都不认识几个了吧。但我又很讨厌背单词,读一些艰难苦涩的英文小说也很难读下去。突然想起来之前看资讯的时候,说国内的一些网络武侠/玄幻小说在国外十分盛行,还有人建立了专门的网站,将中文小说一点点翻译成英文供大家看。——诶?我也很爱看这些网络小说啊!三少、土豆西红柿,当年上学的时候不知道有多少个夜晚偷偷看他们的书。

我找到了这家网站:http://www.wuxiaworld.com/

我决定从之前看过很多次的《星辰变》开始,读一读它的英文版。但是网页版的在手机里毕竟兼容性不好,不如下载下来txt版本的放在手机里看。

准备工作

首先,我们找到目标小说《星辰变》的首页,在Completed里,其英文名为Stellar Transformations


定位到星辰变主页.png

找到了http://www.wuxiaworld.com/st-index/这个页面,是星辰变的主页啦。
下面我们来分析一下网页结构:
我用的Chrome浏览器,鼠标选中章节链接后,右键->检查,可以定位到源代码中相应的元素。
如下图所示:

image.png

能够定位到信息了,首先需要做的,是找到所有Chapter对应的地址链接,即上图红框中href部分的内容。

首先把一些基础信息写下,包括目录页面url及请求头,一般比较简单的网站,请求头只把User-Agent写上就可以了,具体值可以去network里随便找一个请求,复制一下自己相应的值。

homepage_url = 'http://www.wuxiaworld.com/st-index/'
headers = {'User-Agent': *******}

获取所有需要爬取的页面链接

接下来我们去获取页面源代码,然后定位到相应元素。

def get_all_url():
    # 获取页面源代码
    request_url = homepage_url
    request = urllib2.Request(request_url, headers=headers)
    response = urllib2.urlopen(request)
    homepage = response.read()

    # 定位到相应元素的根节点  
    homepage_tree = etree.HTML(homepage)
    index_node = homepage_tree.xpath('//*[@id="post-4993"]/div/div[1]/div')
    # print index_node
    # print etree.tostring(index_node) # 打印当前节点中的内容
    
    # 定位到相应链接
    urls = index_node.xpath('.//p/a[starts-with(@href,"http://www.wuxiaworld.com/st-index")]')
    #print [etree.tostring(each) for each in urls]
    print len(urls)

    contentpage_list = []
    for each in urls:
        url = each.xpath('./@href')
        if len(url) == 1:
            contentpage_list.append(url[0])
    return contentpage_list

获取文本内容

已经找到每个章节的对应链接了,下面需要做的是将页面中的文本元素提取出来,保存到txt文件中。

定位页面文本元素

可以看到其实每一段文本都存在

元素中,那么我们只要定位到这些

元素的根节点,读取

元素下所有文本信息,就可以按段保存了。

首先是获取章节页面源代码:

def get_content(contentpage_url, txt):
    request_url = contentpage_url
    request = urllib2.Request(request_url, headers=headers)
    response = urllib2.urlopen(request)
    contentpage = response.read()

然后根据源代码及lxml方法,定位到根节点:

    contentpage_tree = etree.HTML(contentpage)
    content_root_node = contentpage_tree.xpath('//*[@itemprop="articleBody"]')[0]
    #print len(content_root_node)

获取所有

节点及文本内容,并存入txt文件中:

    content = content_root_node.xpath(u'./p/text()')
    print content
    fp = open(txt + '.txt', 'w')
    for each in content:
        each = each.decode("utf8")
        fp.write('%s' % each + '\n')
    fp.close()

效果如图:


附:

完整代码如下:

# usr/bin/python
# -*- coding: utf-8 -*-
import re
import urllib2
from lxml import etree
import sys
import os


reload(sys)
sys.setdefaultencoding('utf-8')

homepage_url = 'http://www.wuxiaworld.com/st-index/'
headers = {'User-Agent':
               'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36'}


def get_all_url():
    contentpage_list = []
    # 验证list是否为空
    if len(contentpage_list) != 0:
        raise ValueError("该列表不为空")
    request_url = homepage_url
    request = urllib2.Request(request_url, headers=headers)
    response = urllib2.urlopen(request)
    homepage = response.read()
    homepage_tree = etree.HTML(homepage)
    index_node = homepage_tree.xpath('//*[@id="post-4993"]/div/div[1]/div')
    if len(index_node) == 1:
        index_node = index_node[0]
    else:
        raise ValueError("有不止一个目录节点")
    print index_node
    # print etree.tostring(index_node) # 打印当前节点中的内容
    #urls = index_node.xpath('.//p/a[starts-with(@title,"ST Book")]')       # 第九章开始没有title了,爬不全
    urls = index_node.xpath('.//p/a[starts-with(@href,"http://www.wuxiaworld.com/st-index")]')
    #print [etree.tostring(each) for each in urls]
    print len(urls)
    for each in urls:
        url = each.xpath('./@href')
        if len(url) == 1:
            contentpage_list.append(url[0])
    return contentpage_list


def get_content(contentpage_url, txt):
    request_url = contentpage_url
    request = urllib2.Request(request_url, headers=headers)
    response = urllib2.urlopen(request)
    contentpage = response.read()
    contentpage_tree = etree.HTML(contentpage)
    content_root_node = contentpage_tree.xpath('//*[@itemprop="articleBody"]')[0]
    #print len(content_root_node)
    content = content_root_node.xpath(u'./p/text()')
    print content
    fp = open(txt + '.txt', 'w')
    for each in content:
        each = each.decode("utf8")
        fp.write('%s' % each + '\n')
    fp.close()

    #print etree.tostring(content_root_node[0])



if __name__ == '__main__':
    contentpage_list = get_all_url()
    #print contentpage_list[0]
    #contentpage_list = ['']
    #contentpage_list[0] = 'http://www.wuxiaworld.com/st-index/st-book-1-chapter-1/'
    for each_url in contentpage_list[303::]:
        print each_url
        tmp = re.findall('.*/st-index/st-(.*)/', each_url)
        if len(tmp) == 0:
            tmp = re.findall('.*/st-index/(.*)/', each_url)
        if len(tmp) == 0:
            tmp = re.findall('.*/st-index/(.*)', each_url)
        print len(tmp)
        get_content(each_url, tmp[0])

你可能感兴趣的:(Python爬虫——WuXiaWorld英文版小说)