疯狂的鲨鱼 发表于 2020-5-24 15:15

【python】漫画网站爬虫(仅供参考,不能直接运行)

## 背景
之前学校的校园网收费制度对于我这种天天上网的人来说十分不友好,可幸的事ipv6是完全免费的。
于是乎我就找了一个同时可以拥有ipv4和ipv6的服务器作为中间,就可以用ipv6浏览全网啦。(服务器的月租远低于校园网网费)
同时,我又发现了一个几乎没有防爬虫机制且漫画巨多的网站,于是就有了以下脚本。
(当时一晚上就下载了500G的漫画,考虑到爬下全站可能有好几T的资源就停止下载了。后来校园网收费机制更新后,我就没再使用过中间服务器和此脚本。)

## 说明
此脚本仅供交流,因为涉及到proxy且不保证目标网站已更新不可直接运行,并且具体网站没有给出。
在实际使用脚本时,我添加了多线程下载,下载速度提升巨大基本等于实际网速。(我似乎明白了那些下载工具为什么下载这么快了。)
有一个问题我有些不解,我在window10和ubuntu上都实际测试过,在硬件基础完全相同的情况下,linux系统的下载速度似乎快很多。

## 测试图


## 源码:list_manga.py (列出所有漫画的信息)
import socket
import socks
import requests
import re

# global variable define
ROOT_OF_WEB = "http://www.h********2.com"

# class define
class Book():

    def __init__(self):

      self.bookNumber = ""
      self.bookName = ""
      self.bookLabel = ""
      self.bookPagesNumber = 0

# main
def main():

    # socks5 proxy setting
    socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
    socket.socket = socks.socksocket

    file = open('result_manga.txt', 'a')

    #文件最后一个的序号
    number = 0

    #for page in range(1,3):
    for page in range(1, 1587 + 1):
      
      print("Page:" + str(page))

      # get web
      url = ROOT_OF_WEB + "/hentai_manga/page_" + str(page) + ".html"
      webResp = requests.get(url)

      # analyse
      # 抽离出折页的所有书
      regex = '<div class="col-md-3 resent-grid recommended-grid">[\n|\t]*(.*?)</ul>\n[\t]*</div>\n[\t]*</div>'
      BooksOfThePage = re.findall(regex,webResp.text,re.S)

      for i in range(0,len(BooksOfThePage)) :

            number = number + 1
            file.write("NUMBER:" + str(number) + "\n")
            file.write("CODIFICATION:" + re.search('<a href="/hentai_manga/(\d*)/" class="thumbnail">',BooksOfThePage).group(1) + "\n")
            file.write("NAME:" + re.search('/" class="title">(.*)</a></h5>',BooksOfThePage).group(1) + "\n")
            file.write("LABEL:" + re.search('<div class="time small-time">\n\t*<p>(.*)</p>',BooksOfThePage).group(1) + "\n")
            file.write("PAGES:" + re.search('<li class="right-list"><p class="views views-info">(.*) 頁</p></li>',BooksOfThePage).group(1) + "\n\n")

    file.close()

if __name__ == '__main__':

    main()


## 源码:download_manga.py (下载漫画)
import socket
import socks
import os
import requests
import re
from urllib.request import urlretrieve

# global variable define
DOWNLOAD_LOCATION = "/home/wngg/PycharmProjects/testProject"
ROOT_OF_WEB = "http://www.h********2.com"
TYPT_OF_BOOK = "hentai_manga"
#TYPT_OF_BOOK = "hentai_doujin"

def main():

    # socks5 proxy setting
    socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 1080)
    socket.socket = socks.socksocket

    # download
    fileName = "result_manga.txt"
    #fileName = "result_doujin.txt"
    file = open(fileName)

    while True:
      if not file.readline() :
            break

      cadification = file.readline()
      file.readline()
      file.readline()
      numberOfPages = file.readline()
      file.readline()
      downloadBook(TYPT_OF_BOOK,cadification,numberOfPages)

    file.close()

def downloadBook(typeOfBook,cadification,numberOfPages) :

    # 提示
    print("Download : " + cadification)

    # 检测此文件是否已经下载
    if os.path.exists(DOWNLOAD_LOCATION + "/" + cadification) :
      if os.path.exists(DOWNLOAD_LOCATION + "/" + cadification + "/" + "%03d" %int(numberOfPages) + ".jpg") :
            return
    else :
      os.makedirs(DOWNLOAD_LOCATION + "/" + cadification)

    # 获取下载链接
    urlOfDownload = re.search('class="thumbnail"><img src="(.*)/\d*.jpg" alt=""></a>', requests.get(ROOT_OF_WEB + "/" + typeOfBook + "/" + cadification).text).group(1)
    for i in range(1,int(numberOfPages) + 1) :
      urlretrieve(ROOT_OF_WEB + urlOfDownload + "/" + "%03d" %i + ".jpg" , DOWNLOAD_LOCATION + "/" + cadification + "/" + "%03d" %i + ".jpg")


if __name__ == '__main__':

    main()

疯狂的鲨鱼 发表于 2020-5-24 16:16

Zeaf 发表于 2020-5-24 16:01
我以为有多线程下载实例
这样先列出信息后下载的方法不错啊

后来实际下载的速度比较慢嘛,然后改成了多线程但是源文件丢了。
当时看了点关于多线程的文章然后就成功了,应该是比较简单的。。。
列出信息当时是这样想的:原网站只能通过一个Labal找漫画,想要找同时符合多个Lable的漫画就很麻烦,所以我就想列出信息写一个检索程序。

疯狂的鲨鱼 发表于 2020-5-24 16:22

大兵马元帅 发表于 2020-5-24 16:15
持续关注大佬作品,弱弱问一句,Python可以把Excel数据导入到我的某办公软件中,代替手工操作吗?谢谢

应该是有关于excel的模块的,如果也有关于你的办公软件的现成的模块的话那就比较方便了。

e96116 发表于 2020-5-24 15:45

{:1_927:}可惜我看不懂

Zeaf 发表于 2020-5-24 16:01

我以为有多线程下载实例:rggrg
这样先列出信息后下载的方法不错啊

hs_f 发表于 2020-5-24 16:06

学习了。感谢!

大兵马元帅 发表于 2020-5-24 16:15

持续关注大佬作品,弱弱问一句,Python可以把Excel数据导入到我的某办公软件中,代替手工操作吗?谢谢

魂殇 发表于 2020-5-24 16:16

感觉你在开车

大兵马元帅 发表于 2020-5-24 16:31

我怎么才能知道有没有我软件的模块?

疯狂的鲨鱼 发表于 2020-5-24 16:33

大兵马元帅 发表于 2020-5-24 16:31
我怎么才能知道有没有我软件的模块?

百度就好了。
页: [1] 2
查看完整版本: 【python】漫画网站爬虫(仅供参考,不能直接运行)