前言

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

我决定从之前看过很多次的《星辰变》开始,读一读它的英文版。但是网页版的在手机里毕竟兼容性不好,不如下载下来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爬虫 书籍 外文_Python爬虫——WuXiaWorld英文版小说相关推荐

  1. python爬虫的用途_Python爬虫的作用与地位(附python3教程+爬虫技术路线图)

    小编说:网络爬虫是一种伴随着互联网诞生与演化的"古老"的网络技术,随着互联网进入大数据时代,爬虫技术迎来了一波新的振兴浪潮. 本文通过企业内部与互联网两个场景向大家讲书爬虫发挥了哪 ...

  2. python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)

    前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...

  3. python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...

    Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...

  4. python爬虫自学路线_python 爬虫学习路线:从入门到进阶

    大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...

  5. python爬虫面试问题_Python爬虫面试总结

    ## Python爬虫面试总结 1. 写一个邮箱地址的正则表达式? [A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 2. 谈 ...

  6. python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

    本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...

  7. python爬虫知识大全_Python爬虫入门有哪些基础知识点

    1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...

  8. python爬虫的用途_python爬虫用途

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 专业点来说就是应用多台机器同时实现爬虫任务,这多台机器上的爬虫,就是称作分布式爬 ...

  9. python爬取网页内容_Python爬虫原理解析

    笔者公众号:技术杂学铺 笔者网站:mwhitelab.com 本文将从何为爬虫.网页结构.python代码实现等方面逐步解析网络爬虫. 1. 何为爬虫 如今互联网上存储着大量的信息. 作为普通网民,我 ...

最新文章

  1. jQuery 表格插件汇总
  2. 大数据-07-Spark之流数据
  3. [2015-11-10]iis远程发布配置
  4. MySQL GROUP BY:分组查询
  5. python 计时器 timeit 报错:ValueError: stmt is neither a string nor callable
  6. java测试类生成对象,java编写student类 用Java编写一段测试程序,生成student类的两个对象,并输出每个对象基本信息?...
  7. ai怎么调界面大小_科研论文作图系列-从PPT到AI (一)
  8. 前端学习(3064):vue+element今日头条管理-状态管理
  9. 第十五期:真相了,中台到底“出路”还是“末路”?
  10. java实现米和厘米比较好_java如何根据实际经、纬度和已知经、纬度做对比,计算出具体偏差米数。(以米为单位)...
  11. 东南大学RM装甲板识别算法详解
  12. 游戏开发中的数学和物理算法(13):点积和叉积
  13. .NET的垃圾回收机制引发的问题
  14. 【Android安全】fastboot相关
  15. 流氓又见流氓!-有感雅虎中国通过公证部门 证明雅虎助手非恶意软件
  16. NLP学习笔记「第二章」2.2 N-gram Language Models(N元语言模型)
  17. input输入的时候统计字数的代码
  18. 作用域和自由变量的介绍
  19. APISpace 动态活体检测API
  20. 无需括号的xss payload

热门文章

  1. 大数据分析哪些错误需避免
  2. 制造业实施大数据战略面临哪些挑战
  3. wps多人协作的意义_全民皆扁平?WPS时隔六年更新图标,W却变胖了…
  4. android平台上的sprite,tilelayer设计,android平台上的sprite,tilelayer设计
  5. java inputstream长度_Java InputStream.available获取数据流字节长度大小
  6. tolua unity 报错_Unity3D热更新之LuaFramework篇[01]--从零开始
  7. 液晶手写板原理拆解_汽车抬头显示HUD的拆解
  8. print python 带回车_python标准库threading源码解读【二】
  9. mysql常用的语句_MySQL常用语句集锦
  10. windows 截屏快捷键x220_电脑截屏快捷键是什么啊