爬取笔趣阁小说
类似笔趣阁这类无验证,不用登陆的网页爬取数据是相当简单的了,在获取到网页后抓取想要的数据就可以了。
初步想法
在爬取数据前首先要想好需要做些什么,有了大致的想法后才能有效的完成:
- 首先需要获取到想要爬取的网站,这里的网站为http://www.xbiquge.la;
- 在进入网站后选取自己想看的小说后获取小说所有的章节名称以及每章节的url在这里我想看的是斗罗大陆Ⅰ,url:http://www.xbiquge.la/1/1710/;
- 在获取到每一个章节的url后,我就需要对每一个url都去发起请求来获取每一章节下的文本内容。
三种获取章节名和url的方法
1)BeautifulSoup模块
由于不怎么会用bs4来获取,对于<dd><a>content</a></dd>这样的标签不会简便的获取方法所以写的比较复杂,还是以自己的喜好为主。
2)正则获取
相比于bs4的标签直接获取来说,正则可能是最简便的方法,但同时也是最难的方法。
3)etree.HTML()
etree.Html()可以用来解析html文档的字符串格式对象,讲字符串转变成_Element对象,方便使用xpath来抓取想要的数据。具体参考链接:
https://blog.csdn.net/u012067766/article/details/79903455
获取每一章内容
在获得所有章节url后只需要对每一个url都去做一次请求就可以了,完整的代码如下:
import requests
from tqdm import tqdm
from lxml import etree
from fake_useragent import UserAgent
#这里的user_agent是用的模拟火狐浏览器,可以直接用打开的浏览器中的ua替代
ua = UserAgent()
class biquge():
def __init__(self):
self.start_url = 'http://www.xbiquge.la'
self.next_url = 'http://www.xbiquge.la/1/1710/'
self.header = {
"Connection": "keep-alive",
'User-Agent': ua.random,
}
def parse_url(self, url):
response = requests.get(url, headers=self.header, timeout=5,
verify=False).content.decode()
return response
def save(self, name, data):
with open(name + ".txt", 'a', encoding='utf-8') as f:
f.writelines(data + '\n')
def url_list(self):
res = []
response = self.parse_url(self.next_url)
html = etree.HTML(response)
part_list = html.xpath('//div[@id="list"]/dl/dd/a/text()')
url_list = html.xpath('//div[@id="list"]/dl/dd/a/@href')
for part, url in zip(part_list, url_list):
if '新书' not in part:
new_url = self.start_url + url
res.append(part + ',' + new_url)
return res
def run(self):
data = self.url_list()
for k in tqdm(range(len(data))):
i = data[k].split(',')
response = self.parse_url(i[1])
html = etree.HTML(response)
passage = html.xpath('//div[@id="content"]/text()')
self.save('斗罗大陆Ⅰ', i[0]+'\n')
for j in passage:
j = j.strip()
self.save('斗罗大陆Ⅰ', j)
if __name__ == '__main__':
xs = biquge()
xs.run()
当然了,在爬虫的世界里还存在着各种各样的难关,也需要各种方法去提升爬取的效率,希望这篇文章对你有帮助。