import requests,os
from lxml import html#调用lxml模块和requests模块
url = 'http://www.xbiquge.la/7/7004/'
首先咱们调用模块然后解析这个网页
hl = requests.get(url) # 获取源码
hl = hl.content.decode("utf-8")
先将书名找到保存起来,
可以看到书名是在这个地方,我们可以写代码来获取它
selector = html.fromstring(hl)
list = selector.xpath('//div[@id = "info"]/h1/text()')
name_book = list[0]
htmls_list = []#创建一个空列表来存储所有章节链接
selector = html.fromstring(hl)
html_list = selector.xpath('//div[@id = "list"]/dl/dd/a/@href')#获得链接列表
#将链接与网页网址连接,形成每一章的网址
for i in html_list:
htmls_list.append(url + i)
name_list = selector.xpath('//div[@id = "list"]/dl/dd/a/text()')
打印这两个列表,得到结果如下
我只截取了一部分,可以看到两个列表,分别是章节链接和章节名称。
然后我们就可以通过章节链接到每一章里去获得内容。
通过遍历获取每个章节的链接,然后进入,我们需要在浏览器进入某个章节,找出章节内容的规律。如图
可以看到内容是在
id = "content"下,
所以我们可以写代码来获取这章的内容,这里的函数url传的是我们在上面取的章节链接,我们可以取一个链接来看看
import requests,os
import lxml,html
url = 'http://www.xbiquge.la/7/7004/3246381.html'
txt = ''
hl = requests.get(url) # 获取源码
hl = hl.content.decode("utf-8")
selector = html.fromstring(hl)
txt_list = selector.xpath('//div[@id = "content"]/text()')
for i in txt_list:
i = repr(i).replace(r'\r','').replace(r'\xa0','').replace("'",'')#这里将文章中多余的转义字符删掉,repr函数让字符串中的转义字符不起作用。类似于r
txt += i#将列表中的字符串粘贴在一起,就是我们的文章内容
print(txt)
上面代码的url我直接在浏览器上取了网址,但其实它已经存在于我们的列表中了。打印结果如下
可以看到我们获得了第一章的内容,这就是我们想要的小说内容。现在我们书名,每章链接,章名都有了,接下来就是存储了
存储代码如下
def creat(name_book,chapter,txt):
os.makedirs(name_book,exist_ok=True)
with open(name_book + r'/'+ chapter+'.txt',"w",encoding= "utf-8") as f:
f.write(txt)
我在这里定义了一个函数来存储数据。三个参数分别是书名,章名,还有小说内容。
我们将上面内容全部封装为函数,因为经常要将网址转换为源码,所以我先写转换函数
def zhuanhuan(url):
hl = requests.get(url) # 获取源码
hl = hl.content.decode("utf-8") # 源码变为字符串
return hl
请原谅我英语不太好,用拼音代替
然后就是获取书名的函数
def nbook(url):
hl = zhuanhuan(url)
selector = html.fromstring(hl)
list = selector.xpath('//div[@id = "info"]/h1/text()')
name_book = list[0]
return name_book
获取章节链接和章名
def list_fun(hl,url):
htmls_list = []#创建一个空列表来存储所有章节链接
selector = html.fromstring(hl)
html_list = selector.xpath('//div[@id = "list"]/dl/dd/a/@href')#获得链接列表
#将链接与网页网址连接,形成每一章的网址
for i in html_list:
htmls_list.append(url + i)
name_list = selector.xpath('//div[@id = "list"]/dl/dd/a/text()')
return htmls_list,name_list
获取章节内容
def article(url):
txt= ''
hl = zhuanhuan(url)
selector = html.fromstring(hl)
txt_list = selector.xpath('//div[@id = "content"]/text()')
for i in txt_list:
i = repr(i).replace(r'\r','').replace(r'\xa0','')
txt += i
最后再在一个主函数里将列表遍历,获得每一章的内容存储在本地
def main(url):
hl = zhuanhuan(url)
y = list_fun(hl,url)#接出两个列表
name_book = nbook(url)#书名
for i,j in zip(y[0],y[1]):
txt = article(i)#章节内容
name = j.replace("?",'').replace('*','').replace('/','')#章节名称
creat(name_book,name,txt)
章节名称里替换那些符号是因为windows系统里文件命名是不能有\ / : * ? " < > |
这九个符号的,这个问题曾经也困扰了我好几天,导致我每次爬到某一章就停下来,后来才知道是命名规则的问题,其实可以将这九个符号放在列表中,检查每个章名,然后替换。我这里是直接替换的
所以总的代码就如下图
import requests,os
from lxml import html,etree
#转换网址为源代码
def zhuanhuan(url):
hl = requests.get(url)
hl = hl.content.decode("utf-8")
return hl
#存储网址列表和名称列表(每一章)
def list_fun(hl,url):
htmls_list = []#创建一个空列表来存储所有章节链接
selector = html.fromstring(hl)
html_list = selector.xpath('//div[@id = "list"]/dl/dd/a/@href')#获得链接列表
#将链接与网页网址连接,形成每一章的网址
for i in html_list:
htmls_list.append(url + i)
name_list = selector.xpath('//div[@id = "list"]/dl/dd/a/text()')
return htmls_list,name_list
#获得章节内容
def article(url):
txt= ''
hl = zhuanhuan(url)
selector = html.fromstring(hl)
txt_list = selector.xpath('//div[@id = "content"]/text()')
for i in txt_list:
i = repr(i).replace(r'\r','').replace(r'\xa0','')
txt += i
return txt
#获取书名
def nbook(url):
hl = zhuanhuan(url)
selector = html.fromstring(hl)
list = selector.xpath('//div[@id = "info"]/h1/text()')
name_book = list[0]
return name_book
#创建文件
def creat(name_book,chapter,txt):
os.makedirs(name_book,exist_ok=True)#检查是否有这个文件夹存在,如果没有,则创建
with open(name_book + r'/'+ chapter+'.txt',"w",encoding= "utf-8") as f:
f.write(txt)
def main(url):
hl = zhuanhuan(url)
y = list_fun(hl,url)
name_book = nbook(url)
for i,j in zip(y[0],y[1]):
txt = article(i)
name = j.replace("?",'').replace('*','').replace('/','')
creat(name_book,name,txt)
if __name__ == "__main__":
url ='http://www.xbiquge.la/7/7004/'
main(url)
print("爬取完成!")
看我爬取到的内容,虽然速度有点慢
欢迎大家哦