摘要
爬取的目标网页是笔趣阁的飞剑问道
使用requests + xpath 的方法,xpath使用xml模块解析
说明
基本步骤如下:
- 使用requests获取网页内容
- 使用xpath提取所有的a标签,并将a标签上章节的标题和href属性的url通过字典保存起来,比如{"第一章 归来":"/18_18820/8643948.html",...}
- 遍历字典
3.1 通过requests访问字典中的url,获取网页内容
3.2 使用xpath提取小说内容
3.3 将字典中的key(章节标题)和小说内容按一定格式写入文件中
代码实现
import requests
import os
import traceback
from lxml import etree
import requests
import os
import traceback
from lxml import etree
def getHTMLText(url, code="gbk"):
'获取页面'
try:
kv = {"user-agent":"Mozilla/5.0"}
html = requests.get(url, headers=kv)
html.raise_for_status()
html.encoding = code
return html.text
except:
return ""
def getNovelDict(dic, url):
'获取各个章节的url'
html = getHTMLText(url)
selector = etree.HTML(html)
try:
global fName
fName = selector.xpath("//div[@id='info']/h1/text()")[0]
lists = selector.xpath("//div[@id='list']//a")
for each in lists:
href = each.get('href')
string = each.text
dic[each.text] = href
except:
traceback.print_exc()
return ""
def getContent(url):
'获取章节内容'
html = getHTMLText(url)
selector = etree.HTML(html)
content = selector.xpath("//div[@id='content']")[0]
text = content.xpath("string(.)")
return text
def saveFile(text, fPath, fName):
'保存文件'
if not os.path.exists(fPath):
os.mkdir(fPath)
path = fPath + fName + ".txt"
try:
with open(path, "a") as f:
text = text.replace(u'\xa0', u'') # 将’\xa0‘替换成u’ ‘空格,这个\xa0就是那个html中的&nbps空格
# UnicodeEncodeError: 'gbk' codec can't encode character '\xa0' in position 7: illegal multibyte sequence
f.write(text)
except:
traceback.print_exc()
return ""
def main():
# '程序入口函数'
baseUrl = "http://www.biquge.com.tw/"
novelCode = "18_18820/"
url = baseUrl + novelCode
fPath = "novels/"
global fName
count = 0
sDict = {} # 章节名 :link
getNovelDict(sDict, url)
dictLen = len(sDict)
for (key,value) in sDict.items():
try:
url = baseUrl + value
content = getContent(url)
text = key + "\n" + content + "\n"
saveFile(text, fPath, fName)
count += 1
print(r"已下载" + str(count*100//dictLen) + "%")
except:
continue
fName = ''
if __name__ == '__main__':
main()
上面代码获取了“飞剑问道”小说的内容,通过改变baseUrl和novelCode可以改变小说的获取,用过改变fPath可以改变文件的保存路径。当然,重点在于页面的分析。
分析过程:
- 发现小说地址http://www.biquge.com.tw/18_18820/中的18_18820其实是小说的代号,随机点击其它小说就可以发现
- 发现章节链接是诸如“/18_18820/8643948.html”的格式,也就是网站目录http://www.biquge.com.tw下的页面,每次只要将http://www.biquge.com.tw和章节链接拼接起来就是每一章存放的网址。可以通过requests跳转到章节地址。
- 提取章节内容(比较简单略)
- 只要在外层套一个循环遍历所有章节链接,就可以实现整本小说的获取