抓取漫画的网址是:sf互动传媒

抓取漫画的由来也是看了知乎上有人说用爬取漫画,然后自己也玩玩

首页中每个漫画的url是类似这样存储的:

  1. <tr>
  2. <td height="30" align="center" bgcolor="#FFFFFF">
  3. <a href="http://comic.sfacg.com/HTML/KOL/" target="_blank">K.O.I 偶像之王</a>
  4. </td>
  5. </tr>

然后用lxml通过cssselect(tr>td>a)将能用到的解析出来,然后解析出来会有很多其他的页面的url和信息,然后我是通过url中包含"/mh/"或者是"/HTML/"进行过滤的

比较蠢的办法了

然后通过对象,将过滤出来的漫画的url和漫画的名字保存在一个这样的类中,然后通过列表进行存储

  1. class Cartoon():
  2. url = None
  3. name = None

然后用随便一个漫画作为例子:勇者赫鲁库

漫画一共很多章,并且所有章的信息都在如下标签中包含

  1. <ul class="serialise_list Blue_link2">....</ul>

然后通过BS将每一章的信息进行存储,然后可以看到其完整的url是:http://comic.sfacg.com/HTML/YZHLK/096/

然后每一章会有很多的page,并且每一章的内容是ajax进行加载的,然后从检查->网络中可以看到有一个这样的请求

然后请求的response里面包含本章的所有图片,然后只需将在每一章的页面中将.js接口找到,然后将本章的图片信息存储,然后就可以得到本章的图片信息,然后存储到本地

  1. # -*- coding: utf-8 -*-
  2. import re
  3. import urllib
  4. import urllib2
  5. import os
  6. import stat
  7. import itertools
  8. import re
  9. import sys
  10. import requests
  11. import json
  12. import time
  13. import socket
  14. import urlparse
  15. import csv
  16. import random
  17. from datetime import datetime, timedelta
  18. import lxml.html
  19.  
  20. from zipfile import ZipFile
  21. from StringIO import StringIO
  22. from downloader import Downloader
  23. from bs4 import BeautifulSoup
  24. from HTMLParser import HTMLParser
  25. from itertools import product
  26. import sys
  27. reload(sys)
  28. sys.setdefaultencoding('utf8')
  29. URL = 'http://comic.sfacg.com'
  30. picture = 'http://coldpic.sfacg.com'
  31.  
  32. class Cartoon():
  33. url = None
  34. name = None
  35.  
  36. def download(url, user_agent='wswp', num_try=2):
  37.  
  38. headers = {'User_agent': user_agent}
  39. request = urllib2.Request(url, headers=headers)
  40. try:
  41. html = urllib2.urlopen(request).read()
  42. except urllib2.URLError as e:
  43. print 'Download error', e.reason
  44. html = None
  45. if num_try > 0:
  46. if hasattr(e, 'code') and 500 <= e.code < 600:
  47. return download(url, user_agent, num_try - 1)
  48. elif e.code == 403:
  49. return None
  50. return html
  51.  
  52. def get_section_url(url):
  53. html = download(url)
  54. if html == None:
  55. return None
  56. soup = BeautifulSoup(html, "html.parser")
  57. results = soup.find_all(name='ul', attrs={'class': 'serialise_list Blue_link2'})
  58. res = r'<a.*?href="([^"]*)".*?>([\S\s]*?)</a>'
  59. links = re.findall(res, str(results),re.S | re.M)
  60. return links
  61.  
  62. def get_section_page(url):
  63.  
  64. html = download(url)
  65. if html == None:
  66. return None
  67. soup = BeautifulSoup(html, "html.parser")
  68. results = soup.find_all(name='script', attrs={'type': 'text/javascript'})
  69. tt = len(results)
  70. js = results[tt-1]
  71. mm = js.get('src')
  72. if mm == None:
  73. result = soup.find_all(name='script', attrs={'language': 'javascript'})
  74. js1 = result[1]
  75. mm = js1.get('src')
  76. html1 = download(URL+mm)
  77. list = html1.split(';')
  78. List = []
  79. for each in list:
  80. if 'picAy[' in each:
  81. src = each.split('=')
  82. List.append(picture+src[1][2:-1])
  83.  
  84. return List
  85.  
  86. def download_cartoon(url, cartoon_name,Section,num):
  87.  
  88. path = "自己定义的路径"+cartoon_name
  89.  
  90. if not os.path.exists(path):
  91. os.mkdir(path)
  92. path = path + "/"+Section
  93. if not os.path.exists(path):
  94. os.mkdir(path)
  95. content = requests.get(url).content
  96. with open(path + '/' + str(num) + '.jpg', 'wb') as f:
  97. f.write(content)
  98. print "Downloading cartoon_name " + path + str(num)+ "下载完成"
  99. f.close()
  100.  
  101. if __name__ == '__main__':
  102. cartoon_list = []
  103.  
  104. html = download(URL)
  105. tree = lxml.html.fromstring(html)
  106. results = tree.cssselect('tr > td > a')
  107. for each in results:
  108. ti = each.get('href')
  109. if '/mh/' in ti or '/HTML/' in ti:
  110. if each.text_content() != "":
  111. cartoon = Cartoon()
  112. cartoon.url = each.get('href')
  113. cartoon.name = each.text_content().replace(' ','')
  114. cartoon_list.append(cartoon)
  115.  
  116. for each in cartoon_list:
  117. print each.url
  118. print each.name
  119. links = get_section_url(each.url)
  120. links = list(reversed(links))
  121. section = 0
  122. for link in links:
  123. ul = URL + link[0]
  124. List = []
  125. List = get_section_page(ul)
  126. section = section + 1
  127. Section = r'第'+ str(section) + r'章'
  128. num = 1
  129. for mm in List:
  130. #print mm
  131. download_cartoon(mm,each.name,Section,num)
  132. num = num + 1
  133. print each.name + Section + "下载完成"+str(num-1)+"张"

python爬取漫画的更多相关文章

  1. Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

  2. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  3. python爬取某个网页的图片-如百度贴吧

    python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...

  4. Python:爬取乌云厂商列表,使用BeautifulSoup解析

    在SSS论坛看到有人写的Python爬取乌云厂商,想练一下手,就照着重新写了一遍 原帖:http://bbs.sssie.com/thread-965-1-1.html #coding:utf- im ...

  5. 使用python爬取MedSci上的期刊信息

    使用python爬取medsci上的期刊信息,通过设定条件,然后获取相应的期刊的的影响因子排名,期刊名称,英文全称和影响因子.主要过程如下: 首先,通过分析网站http://www.medsci.cn ...

  6. python爬取免费优质IP归属地查询接口

    python爬取免费优质IP归属地查询接口 具体不表,我今天要做的工作就是: 需要将数据库中大量ip查询出起归属地 刚开始感觉好简单啊,毕竟只需要从百度找个免费接口然后来个python脚本跑一晚上就o ...

  7. Python爬取豆瓣指定书籍的短评

    Python爬取豆瓣指定书籍的短评 #!/usr/bin/python # coding=utf-8 import re import sys import time import random im ...

  8. python爬取网页的通用代码框架

    python爬取网页的通用代码框架: def getHTMLText(url):#参数code缺省值为‘utf-8’(编码方式) try: r=requests.get(url,timeout=30) ...

  9. 没有内涵段子可以刷了,利用Python爬取段友之家贴吧图片和小视频(含源码)

    由于最新的视频整顿风波,内涵段子APP被迫关闭,广大段友无家可归,但是最近发现了一个"段友"的app,版本更新也挺快,正在号召广大段友回家,如下图,有兴趣的可以下载看看(ps:我不 ...

随机推荐

  1. smarty调用php函数

    模板书写: {'param1'|functionName:'param2':'param3'} php函数原型: echo functionName('param1','param2','param3 ...

  2. 【二维树状数组】【CF10D】 LCIS

    传送门 Description 给你两个串,求他们的最长公共上升子序列 Input 第一行是第一个串的长度\(n\) 第二行\(n\)个数代表第一个串 第三行是第二个串的长度\(m\) 第四行\(m\ ...

  3. Codeforces Round #427 (Div. 2) D dp

    D. Palindromic characteristics time limit per test 3 seconds memory limit per test 256 megabytes inp ...

  4. UVA - 1262 数学

    UVA - 1262 题意: 有两个6*5 的大写字母组成的矩阵,需要找出满足条件的字典序第k小的密码:密码中每个字母在两个矩阵的对应的同一列中都出现过 代码: // 先处理出来每一列可以取的字母,例 ...

  5. Centos7中使用ipset

      1.禁用firewalld systemctl stop firewalld systemctl disable firewalld   2.安装ipset yum -y install ipse ...

  6. mysql 自动记录数据最后修改时间

    原文 -- mysql ,还真有这样的说法: mysql> create table test( ), -> uptime timestamp on update current_time ...

  7. 怎样安装Command Line Tools in OS x Mavericks&Yosemite(Without xcode)--转载

    How to Install Command Line Tools in OS X Mavericks & Yosemite (Without Xcode) Mac users who pre ...

  8. mysql5.7中root密码忘记后修改密码

    一.更改my.cnf配置文件 1.用命令编辑/etc/my.cnf配置文件,即:vim /etc/my.cnf 或者 vi /etc/my.cnf 2.在[mysqld]下添加skip-grant-t ...

  9. python---Celery分布式任务队列了解

    linux下定时器了解 Celery 框架学习笔记(不错哟) Celery 分布式任务队列快速入门 Celery的最佳实践 一.Celery介绍 Celery 是一个 基于python开发的分布式异步 ...

  10. 2017-2018-2 20179207 《网络攻防技术》第十三周作业 python3实现SM234算法

    国密算法SM234 的python3实现 国家标准 GM/T 0002-2012 <SM4分组密码算法> GM/T 0003.1-2012 <SM2椭圆曲线公钥密码算法 第1部分:总 ...