小天0027 发表于 2020-5-7 23:22

【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:36

本帖最后由 Zeaf 于 2020-5-7 23:46 编辑

因为没学过etree所以看不懂(貌似是xpath的必须前置步骤,我用的正则表示不了解,大佬两个灵活组合才是最秀的),其它都还行,感觉代码很成熟啊
{:1_925:}大佬们总是喜欢装萌新

多页完全不是问题,就是那个p1在变

小天0027 发表于 2020-5-8 18:39

zz77244920 发表于 2020-5-8 00:57
我刚刚学django 看到你的代码 赶快停止了学习 好好的观摩一下,果然大佬评分已经送上了

Django跟爬虫不冲突啊,我还想做一个爬虫音乐网站的说

fbs 发表于 2020-5-7 23:37

支持,赞一个

小天使xx 发表于 2020-5-7 23:40

有机会学学python,

Asy_少洋 发表于 2020-5-7 23:42

有成品可用吗。纯小白

Zeaf 发表于 2020-5-7 23:44

Asy_少洋 发表于 2020-5-7 23:42
有成品可用吗。纯小白

建议下个python,安装代码里import上面涉及的库就可以了,这样之后都可以玩
如果想直接玩需要打包

hmily65 发表于 2020-5-8 00:13

感谢分享,学习了

zz77244920 发表于 2020-5-8 00:57

zhwwhz 发表于 2020-5-8 02:10

学习知识了

zsj7953187 发表于 2020-5-8 02:25

爬虫学好了,基本就从小白到大神的一个阶段的进阶。值得学习。感谢分享
页: [1] 2 3
查看完整版本: 【Python爬虫】纵横免费小说,第一页,试水