记录一下一下自己学习的经历,希望可以对其他人提供一些帮助。
虽然难度不大,但是慢慢来。
如果有错误的地方,也希望大家给予我意见或者建议。
在这里谢谢大家了!
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(" ","").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(" ","").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:第一次输入全职高手是为了寻找自己要的书。
第二输入表示在找到的这么多书中选择自己喜欢的书。
结果如下:
至此,这本小说就已经爬取下来了。