python爬虫 书籍 外文_Python爬虫——WuXiaWorld英文版小说
前言
工作有一段时间了,每天早上醒来刷朋友圈发现朋友们都在国外,想想他们当年的英语水平,也比我高不到哪里去,而我现在由于半年没碰英语,怕是单词都不认识几个了吧。但我又很讨厌背单词,读一些艰难苦涩的英文小说也很难读下去。突然想起来之前看资讯的时候,说国内的一些网络武侠/玄幻小说在国外十分盛行,还有人建立了专门的网站,将中文小说一点点翻译成英文供大家看。——诶?我也很爱看这些网络小说啊!三少、土豆西红柿,当年上学的时候不知道有多少个夜晚偷偷看他们的书。
我决定从之前看过很多次的《星辰变》开始,读一读它的英文版。但是网页版的在手机里毕竟兼容性不好,不如下载下来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英文版小说相关推荐
- python爬虫的用途_Python爬虫的作用与地位(附python3教程+爬虫技术路线图)
小编说:网络爬虫是一种伴随着互联网诞生与演化的"古老"的网络技术,随着互联网进入大数据时代,爬虫技术迎来了一波新的振兴浪潮. 本文通过企业内部与互联网两个场景向大家讲书爬虫发挥了哪 ...
- python编程理论篇_Python爬虫入门实战之猫眼电影数据抓取(理论篇)
前言 本文可能篇幅较长,但是绝对干货满满,提供了大量的学习资源和途径.达到让读者独立自主的编写基础网络爬虫的目标,这也是本文的主旨,输出有价值能够真正帮助到读者的知识,即授人以鱼不如授人以渔,让我们直 ...
- python爬虫开发环境_python爬虫开发教程下载|Python爬虫开发与项目实战(范传辉 著)pdf 完整版_ - 极光下载站...
Python爬虫开发与项目实战pdf扫描版下载.Python爬虫开发是一个Pthyon编程语言与HTML基础知识引领读者入门知识,重点讲述了云计算的相关内容及其在爬虫中的应用,进而介绍如何设计自己的爬 ...
- python爬虫自学路线_python 爬虫学习路线:从入门到进阶
大家好,我是凉拌 今天给大家详解一下我的爬虫学习路线. 对于小白来说,爬虫可能是一件非常复杂.技术门槛很高的事情.比如有的人则认为先要掌握网页的知识,遂开始 HTML\CSS,结果入了前端的坑,浪费了 ...
- python爬虫面试问题_Python爬虫面试总结
## Python爬虫面试总结 1. 写一个邮箱地址的正则表达式? [A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$ 2. 谈 ...
- python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)
本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式 Python爬虫教程-19-数据提取-正则表达式(re) 正则表达式 ...
- python爬虫知识大全_Python爬虫入门有哪些基础知识点
1.什么是爬虫 爬虫,即网络爬虫,大家可以理解为在网络上爬行的一直蜘蛛,互联网就比作一张大网,而爬虫便是在这张网上爬来爬去的蜘蛛咯,如果它遇到资源,那么它就会抓取下来.想抓取什么?这个由你来控制它咯. ...
- python爬虫的用途_python爬虫用途
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 专业点来说就是应用多台机器同时实现爬虫任务,这多台机器上的爬虫,就是称作分布式爬 ...
- python爬取网页内容_Python爬虫原理解析
笔者公众号:技术杂学铺 笔者网站:mwhitelab.com 本文将从何为爬虫.网页结构.python代码实现等方面逐步解析网络爬虫. 1. 何为爬虫 如今互联网上存储着大量的信息. 作为普通网民,我 ...
最新文章
- jQuery 表格插件汇总
- 大数据-07-Spark之流数据
- [2015-11-10]iis远程发布配置
- MySQL GROUP BY:分组查询
- python 计时器 timeit 报错:ValueError: stmt is neither a string nor callable
- java测试类生成对象,java编写student类 用Java编写一段测试程序,生成student类的两个对象,并输出每个对象基本信息?...
- ai怎么调界面大小_科研论文作图系列-从PPT到AI (一)
- 前端学习(3064):vue+element今日头条管理-状态管理
- 第十五期:真相了,中台到底“出路”还是“末路”?
- java实现米和厘米比较好_java如何根据实际经、纬度和已知经、纬度做对比,计算出具体偏差米数。(以米为单位)...
- 东南大学RM装甲板识别算法详解
- 游戏开发中的数学和物理算法(13):点积和叉积
- .NET的垃圾回收机制引发的问题
- 【Android安全】fastboot相关
- 流氓又见流氓!-有感雅虎中国通过公证部门 证明雅虎助手非恶意软件
- NLP学习笔记「第二章」2.2 N-gram Language Models(N元语言模型)
- input输入的时候统计字数的代码
- 作用域和自由变量的介绍
- APISpace 动态活体检测API
- 无需括号的xss payload
热门文章
- 大数据分析哪些错误需避免
- 制造业实施大数据战略面临哪些挑战
- wps多人协作的意义_全民皆扁平?WPS时隔六年更新图标,W却变胖了…
- android平台上的sprite,tilelayer设计,android平台上的sprite,tilelayer设计
- java inputstream长度_Java InputStream.available获取数据流字节长度大小
- tolua unity 报错_Unity3D热更新之LuaFramework篇[01]--从零开始
- 液晶手写板原理拆解_汽车抬头显示HUD的拆解
- print python 带回车_python标准库threading源码解读【二】
- mysql常用的语句_MySQL常用语句集锦
- windows 截屏快捷键x220_电脑截屏快捷键是什么啊