【Python爬虫】纵横免费小说,第一页,试水
本帖最后由 小天0027 于 2020-5-8 22:29 编辑# 因某人的要求,写了个小说爬虫,应该大家都能看的懂,我下面就直接上代码了(更新个翻页+随机头,断点续传以后再说,哈哈哈)。
### 最后声明:本代码仅供技术交流,请勿商用,如有侵权,请告知本人,本人立即删除。
```
import re, os, time
from lxml import etree
from requests import get
from fake_useragent import UserAgent
class NovelDownload(object):
def __init__(self):
self.next = True # 翻页标记
self.page = 1
self.url = 'http://book.zongheng.com/store/c0/c0/b0/u0/p{}/v0/s1/t0/u0/i1/ALL.html'# 纵横免费小说
self.catalog_url = 'http://book.zongheng.com/showchapter/'# 目录页面前面的部分
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.36 Safari/537.36',
}
def get_ids(self):
res = get(url=self.url.format(self.page), headers=self.headers)
# print(res.text)
html = etree.HTML(res.text)
novel_list = html.xpath('//div[@class="bookname"]/a/text()')
novel_url_list = html.xpath('//div[@class="bookname"]/a/@href')
try:
next_page = html.xpath('//div[@class="pagenumber pagebar"]/a[@class="block scrollpage"]/@title')
if len(next_page) > 1 or self.page == 1:
self.page +=1
else:
self.next =False
except :
self.next =False
ids = []
for i in novel_url_list:
id = re.findall(r'http://book.zongheng.com/book/(\d+)\.html', i)
ids.append(id)
return ids, novel_list
def get_detail(self, id):
catalog_url = self.catalog_url + id + '.html'
res = get(catalog_url, self.headers)
# print(res.text)
html = etree.HTML(res.text)
detail_url = html.xpath('//li[@class=" col-4"]/a/@href')
# print(detail_url)
return detail_url
def get_content(self, detail_url):
detail = get(detail_url, self.headers)
res = etree.HTML(detail.text)
content = res.xpath('//div[@class="content"]/p/text()')
title = res.xpath('//div[@class="title_txtbox"]/text()')
detail = '\r\n'.join(content).strip().replace('\u3000', '')
return title, detail
def save_file(self, title, detail, name):
# print(title,detail,name)
with open('f:/novel/{}/{}.txt'.format(name, title), 'w', encoding='utf-8') as f:
f.write(detail)
def main(self):
n = 0
ids, novel_list = self.get_ids()
print('这是第{}页'.format(self.page-1))
for name in novel_list:
if not os.path.exists('f:/novel'):
os.mkdir('f:/novel')
if not os.path.exists('f:/novel/{}'.format(name)):
os.mkdir('f:/novel/{}'.format(name))
b = self.get_detail(ids)
for detail_url in b:
title, detail = self.get_content(detail_url)
self.save_file(title, detail, name)
print('《{}》,{}下载完毕'.format(name,title))
time.sleep(5)
ua = UserAgent()
self.headers['User-Agent'] = ua.random
# print(self.headers)
n += 1
if self.next:
self.main()
else:
print('已经完了')
if __name__ == '__main__':
a =NovelDownload()
a.main()
```
## emmm,没有图片,也没有说明,看函数定义就知道每个函数要做的什么,然后希望能给有需要的同学提供下思路(~~,其实我也是渣渣,大声BB)
# 最后,谢谢各位的浏览 本帖最后由 Zeaf 于 2020-5-7 23:46 编辑
因为没学过etree所以看不懂(貌似是xpath的必须前置步骤,我用的正则表示不了解,大佬两个灵活组合才是最秀的),其它都还行,感觉代码很成熟啊
{:1_925:}大佬们总是喜欢装萌新
多页完全不是问题,就是那个p1在变 zz77244920 发表于 2020-5-8 00:57
我刚刚学django 看到你的代码 赶快停止了学习 好好的观摩一下,果然大佬评分已经送上了
Django跟爬虫不冲突啊,我还想做一个爬虫音乐网站的说 支持,赞一个
有机会学学python, 有成品可用吗。纯小白 Asy_少洋 发表于 2020-5-7 23:42
有成品可用吗。纯小白
建议下个python,安装代码里import上面涉及的库就可以了,这样之后都可以玩
如果想直接玩需要打包 感谢分享,学习了 学习知识了 爬虫学好了,基本就从小白到大神的一个阶段的进阶。值得学习。感谢分享