爬取笔趣阁小说

记录一下一下自己学习的经历,希望可以对其他人提供一些帮助。

虽然难度不大,但是慢慢来。

如果有错误的地方,也希望大家给予我意见或者建议。

在这里谢谢大家了!

1、首先先仔细浏览笔趣阁官网

输入自己想要的书名:

然后点击搜索结果如下图所示:

这里发现他传入了一个叫searchkey的参数,这里应该是采用中文加密的方式对“全职高手”进行加密处理,尝试验证。

发现全职高手进行编码之后就可以得到searchkey加密后的数据了。(后面那个submit参数并不会对url有太大影响,一样可以获取到正确的网址)

2、获得到了几本书名之后

所以想办法索引出自己想要的书,还有书所在的url。

这里采用谷歌浏览器的右键检查按钮。查看数据源码 

然后右键选择copy-->copy-->xpath  获取到对应的xpath(具体可以去学习xpath的使用教程)。

获得可以索引。

req = requests.get(url,headers = header)
req.encoding = "GB2312"
html = req.text
html = etree.HTML(html)  
# 保存名字和url列表
name_list = []
url_list= []
for item in  html.xpath('//*[@id="main"]/div[1]')[0][1:-1]:
    name_list.append(item.xpath("span/a")[0].xpath('string(.)'))
    url_list.append(item.xpath("span/a/@href")[0])
print("相关结果如下:")
for i in range(len(url_list)):
    print(name_list[i],url_list[i])

 实现结果如下:

然后就可以通过自己再次输入的自己想要的书名就可以获得对应的url了。

然后同理通过xpath就可以获得想要的数据啦!

for directory_url in directory_html.xpath('//*[@id="list"]/dl')[0].xpath("dd")[12:100]:
    directory_name = directory_url.xpath('string(.)')
    text_req = requests.get(book_url+ directory_url.xpath("a/@href")[0])
    text_html = etree.HTML(text_req.text)
    text_list = text_html.xpath('//*[@id="content"]')[0].xpath("br")
    text_ = []
    for i in range(1,len(text_list),2):
        text_.append(etree.tostring(text_list[i],encoding="GB2312").decode("GB2312").replace("<br/>","").replace("&#160;","").replace("<?xml version='1.0' encoding='GB2312'?>","").replace("\n",""))

其中[12:100]因为前面12章是倒序的,如最后一次上传,文本感言。100 表示前面(100-12)= 88章,意思就是获得前面的88章。

完整版代码如下:

import requests
import urllib.parse as parse 
from lxml import etree

name = input("请输入小说名字:")
url = "https://www.52bqg.net/modules/article/search.php?searchkey=" + parse.quote(name,encoding="GB2312") 

req = requests.get(url)
req.encoding = "GB2312"


header = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36' }
req = requests.get(url,headers = header)
req.encoding = "GB2312"
html = req.text
html = etree.HTML(html)

name_list = []
url_list= []
for item in  html.xpath('//*[@id="main"]/div[1]')[0][1:-1]:
    name_list.append(item.xpath("span/a")[0].xpath('string(.)'))
    url_list.append(item.xpath("span/a/@href")[0])
    
print("相关结果如下:")
for name in name_list:
    print(name)
    
name_select = input("同名书籍有如下几本,请再次选择要看的书籍(输入书名):")
book_url = url_list[name_list.index(name_select)]


directory_req = requests.get(book_url)
directory_html = etree.HTML(directory_req.text)


for directory_url in directory_html.xpath('//*[@id="list"]/dl')[0].xpath("dd")[12:100]:
    directory_name = directory_url.xpath('string(.)')
    text_req = requests.get(book_url+ directory_url.xpath("a/@href")[0])
    text_html = etree.HTML(text_req.text)
    text_list = text_html.xpath('//*[@id="content"]')[0].xpath("br")
    text_ = []
    for i in range(1,len(text_list),2):
        text_.append(etree.tostring(text_list[i],encoding="GB2312").decode("GB2312").replace("<br/>","").replace("&#160;","").replace("<?xml version='1.0' encoding='GB2312'?>","").replace("\n",""))
    
    with open(name_select + ".txt","a") as f:
        f.write(directory_name +"\n")
        for tx in text_:
             f.write(tx +"\n")
        f.write("\n\n")
print("爬取完毕!")

效果如下:

 ps:第一次输入全职高手是为了寻找自己要的书。

        第二输入表示在找到的这么多书中选择自己喜欢的书。

结果如下:

 至此,这本小说就已经爬取下来了。

  • 1
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值