D.A. 发表于 2020-6-15 22:44

python爬虫小说

本帖最后由 D.A. 于 2020-6-17 22:34 编辑

爬虫初学者第一个完整的爬虫代码,爬取了旧时光文学网的小说,由于初学代码都比较简单易懂。
得益于楼中网友的交流指点,将代码完善了。直接输入小说名称即可实现搜索。

import requests
from lxml import etree
from fake_useragent import UserAgent
import os
import urllib

#设置headers
ua = UserAgent()
headers = {
    "Accept-Encoding": "gzip, deflate, br",
    "Accept-Language": "zh-CN,zh;q=0.9",
    'Connection':'close',
    "User-Agent": ua.random
    }

#获取url链接的xml格式
def getxml(url):
    res = requests.get(url, headers, timeout = 30)
    res.encoding = res.apparent_encoding
    text = res.text
    xml = etree.HTML(text)
    return xml

#获取文章内容
def getcontent(xml):
    data = xml.xpath('//div[@class="readcontent"]/text()')
    for text in data:
      if text =='\n':
            pass
      else:
            f.write(text.replace('\n',''))

#获取整本小说
def getbook(url):
    # 获取小说全部章节及链接
    xmllist = getxml(url)
    name = xmllist.xpath('//h1/text()')
    chapters = xmllist.xpath('//div[@id="list-chapterAll"]//dd/a/text()')
    links = xmllist.xpath('//div[@id="list-chapterAll"]//dd/a/@href')
    print('《' + name + '》' + '已获取,共' + str(len(links)) + '章\n')
    # 进入小说章节页,爬取章节内容,并存入txt文档中
    f.write(name+'\n\n\n')
    for i in range(0, 2):
      f.write('\n'+ chapters +'\n')
      urltxt = 'https://www.oldtimescc.cc/go/42472/' + links
      xmlcont = getxml(urltxt)
      page = xmlcont.xpath('//div[@class="book read"]//small/text()')
      getcontent(xmlcont)
      if '(1/2)' in page:
            urltxt2 = urltxt + '_2.html'
            xmlcont2 = getxml(urltxt2)
            getcontent(xmlcont2)
      print(chapters + ': 已完成')
    f.close()


searchname = input('请输入小说名:')
f = open('E:/'+searchname+'.txt', 'w', encoding='utf-8')
search = urllib.parse.quote(searchname.encode('gbk'))
searchurl = 'https://www.oldtimescc.cc/modules/article/search.php?searchkey='+search
print(searchname + '正在搜索中......')
searchxml = getxml(searchurl)
try:
    bookname = searchxml.xpath('//div[@class="bookinfo"]/h1/text()')
    getbook(searchurl)
    print('下载完成,已保存在E盘根目录中!')
except:
    print('未查找到'+searchname+',请重试!')

wilison1992 发表于 2020-6-18 16:17

如果楼主想改进下脚本的话提下修改意见   
1. searchkey也可以搜索作者名字,然后抓取所有该作者下的小说,最后整合成class,加点user input 什么的,弄个菜单,terminal直接就可以调用,类似windows cmd直接运行。   
2.搜集更多类似小说网站,输入一个名字就可以提供更多下载渠道      
3.多线程下载e.g. pool   
4. 大概一个盗版小说框架就搭载完了   
{:301_1001:}

wilison1992 发表于 2020-6-17 00:50

本帖最后由 wilison1992 于 2020-6-17 01:14 编辑

D.A. 发表于 2020-6-16 09:03
好的,fiddler还不太会,有空再学习学习
我看了,这个小说网上的搜索名字是加密过的。

import urllib
a = '杀马特'
urllib.parse.quote(a.encode('gbk'))
##'%C9%B1%C2%ED%CC%D8'

vethenc 发表于 2020-6-15 23:01

感谢分享

随遇而安8 发表于 2020-6-15 23:08

输入关键词后网站不变,这是怎么回事?好多网站都这样,坐等打脸

Ly_轮回 发表于 2020-6-16 00:04

感谢分享

wilison1992 发表于 2020-6-16 07:32

有些网站检验cookie,建议加cookie.   
另外爬虫只能爬虫到有权限阅读的东西,如果vip权限限制,还是建议用charles/fiddler 修改   

明明很皮 发表于 2020-6-16 08:20

关于“无法通过在代码中输入小说名直接获取小说”,一点小思路仅供参考,楼主有时间可以尝试下。先爬取所有小说名和对应的url生成一个字典,后面就可以直接通过小说名找到对应的url,然后下载指定小说

D.A. 发表于 2020-6-16 09:02

明明很皮 发表于 2020-6-16 08:20
关于“无法通过在代码中输入小说名直接获取小说”,一点小思路仅供参考,楼主有时间可以尝试下。先爬取所有 ...

之前也想过,可是也没找到方法{:1_907:}
有空我试试看fiddler行不行

D.A. 发表于 2020-6-16 09:03

wilison1992 发表于 2020-6-16 07:32
有些网站检验cookie,建议加cookie.   
另外爬虫只能爬虫到有权限阅读的东西,如果vip权限限制,还是建议 ...

好的,fiddler还不太会,有空再学习学习

D.A. 发表于 2020-6-16 09:05

随遇而安8 发表于 2020-6-15 23:08
输入关键词后网站不变,这是怎么回事?好多网站都这样,坐等打脸

应该也是反爬设置吧,提高爬取难度

poetboxbak 发表于 2020-6-16 17:42

随遇而安8 发表于 2020-6-15 23:08
输入关键词后网站不变,这是怎么回事?好多网站都这样,坐等打脸

你研究一下用searchkey加书名传递参数应该就能解决
页: [1] 2
查看完整版本: python爬虫小说