因为某些众所周知的原因,有些漫画在大网站上看不到了。然后小网站上体验较差又没有更新提醒,每次都要打开看有没有更新,有些不方便。闲来无事就写了个爬虫。再闲来无事写个教程好了,就当是回报各大python博主的教导,嘿嘿。

准备工具

python 3.6.3、mysql、chrome浏览器

相关知识

python、html、正则表达式、xpath、爬虫相关库

步骤:

1、分析网站结构,找出所需信息的位置

以该网址为例:http://comic.kukudm.com/comiclist/941/

F12召唤控制台,选中漫画记录的页面元素,看代码发现每话漫画的页面是在id为comlistn的dl中的dd里面,其中a的href属性就包含漫画网址。

2、获取最新的漫画记录

只是为了追更,那就只要获取dl中最后一个dd就好了。

关键代码如下,这里使用了urllib、lxml、xpath,注意保存漫画名的编码

        res = urllib.request.urlopen(comicurl)html = res.read().decode('gbk', 'ignore').encode('utf-8').decode()# print(html)html = etree.HTML(html)dd_s = html.xpath('//*[@id="comiclistn"]/dd')for i in range(len(dd_s)-1,0,-1) :a_s = dd_s[i].findall('a')print(a_s[0].tag, a_s[0].attrib)nowurl = "http://comic3.kukudm.com" + a_s[0].get('href')nowtitle = a_s[0].text.replace(' ','')nowurl = nowurl.encode('utf-8').decode()nowtitle = nowtitle.encode('utf-8').decode()print(nowurl)print(nowtitle)

3、把更新的漫画记录存入数据库

因为要知道抓取到的漫画记录是不是更新了,所以每次都要保存漫画记录。为此建了两张表。一个是要抓取的漫画的网页kukumanhualist。一个是漫画记录kukumanhuarecord。

结构如下(好像暴露了什么):

关键代码如下:

            try:if cursor.execute("SELECT * FROM kukumanhuarecord WHERE comicName='%s' AND recordUrl='%s'" % (comicname,nowurl)) == 1 :print("有该漫画记录")breakelse:print("没有该漫画记录")try:insertsql = "INSERT INTO kukumanhuarecord VALUES ('%s','%s','%s','%s',%d)" % (comicname, nowurl, nowtitle, today, 0)print(insertsql)cursor.execute(insertsql)db.commit()print("插入成功")except Exception as err:print(err)db.rollback()print("插入失败")except Exception as err:print(err)print("查询记录失败")

以上两步作为抓取漫画记录页面的完整的功能实现保存为一个py文件

完整代码如下:

import urllib.request
from lxml import etree
import time
import pymysql
​
​
​
if __name__ == '__main__':
​today = time.strftime("%Y-%m-%d", time.localtime())print(today)
​db = pymysql.connect("localhost","root","","myspyder",use_unicode=True, charset="utf8")cursor = db.cursor()cursor.execute("SELECT * FROM kukumanhualist")comic_list = cursor.fetchall()for row in comic_list:print(row)comicname = row[0]comicname = comicname.encode('utf-8').decode()print(comicname)comicurl = row[1]
​res = urllib.request.urlopen(comicurl)html = res.read().decode('gbk', 'ignore').encode('utf-8').decode()# print(html)html = etree.HTML(html)dd_s = html.xpath('//*[@id="comiclistn"]/dd')for i in range(len(dd_s)-1,0,-1) :a_s = dd_s[i].findall('a')print(a_s[0].tag, a_s[0].attrib)nowurl = "http://comic3.kukudm.com" + a_s[0].get('href')nowtitle = a_s[0].text.replace(' ','')nowurl = nowurl.encode('utf-8').decode()nowtitle = nowtitle.encode('utf-8').decode()print(nowurl)print(nowtitle)try:if cursor.execute("SELECT * FROM kukumanhuarecord WHERE comicName='%s' AND recordUrl='%s'" % (comicname,nowurl)) == 1 :print("有该漫画记录")breakelse:print("没有该漫画记录")try:insertsql = "INSERT INTO kukumanhuarecord VALUES ('%s','%s','%s','%s',%d)" % (comicname, nowurl, nowtitle, today, 0)print(insertsql)cursor.execute(insertsql)db.commit()print("插入成功")except Exception as err:print(err)db.rollback()print("插入失败")except Exception as err:print(err)print("查询记录失败")

4、根据最新漫画记录的网址抓取漫画图片

前面的代码在kukumanhuarecord生成了recordStatus为0(即未抓取图片)的漫画记录。现在根据漫画记录的url去页面抓取图片。

页面分析发现,很好,漫画的每一页就是修改url最后的页数.htm就好了,很方便逐页抓取。同第二步,找出每页中包含图片的元素。

完整代码如下,这里使用了request、re:

import osimport pandas as pd
import requests
import time
import re
import pymysqlif __name__ == "__main__":db = pymysql.connect("localhost","root","","myspyder",use_unicode=True, charset="utf8")cursor = db.cursor()cursor.execute("SELECT * FROM kukumanhuarecord WHERE recordStatus=0")record_list = cursor.fetchall()if len(record_list) == 0 :print("没有要更新的漫画")cwd = os.getcwd()for row in record_list:sql = "UPDATE kukumanhuarecord SET recordStatus=1 WHERE recordUrl='%s'" % (row[1])cursor.execute(sql)print(sql)comicdir = "\\" + row[0] + "\\" + re.search('\d+', row[2]).group()try:os.makedirs(cwd + comicdir)except Exception as err:print(err)continueos.chdir(cwd + comicdir)now_page_url = row[1]print(now_page_url)headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11'}res = requests.get(now_page_url, headers=headers)pattern = re.compile(r'/\d+\.htm')t = pattern.search(now_page_url).span()[0]print(t)print(now_page_url[t])i = 0while True:i += 1tt = list(now_page_url)if i > 10:tt[t+2] = ''tt[t+1] = str(i)else:tt[t+1] = str(i)now_page_url = ''.join(tt)print(now_page_url)headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}res = requests.get(now_page_url, headers=headers)if res.status_code == 404:print(res.status_code)breakif i == 48:print(i)breakprint(res)html = res.content.decode('gbk', 'ignore').encode('utf-8').decode()# print(html)match_url = re.search('newkuku(\S)+jpg',html)print(match_url.group())img_link = 'http://n5.1whour.com/' + match_url.group()path = '~/comic/'+'.jpg'imgpage = requests.get(img_link, headers=headers)#获取图片的名字方便命名file_name = str(i)+'.jpg'#图片不是文本文件,以二进制格式写入,所以是html.contentf = open(file_name,'wb')f.write(imgpage.content)f.close()db.commit()db.close()

5、使用命令行并保存为批处理文件

每次要用都要打开命令行输

python get_kukumanhuarecord.py

python get_kukumanhuaimgs.py

好麻烦啊.然后百度了一下可以保存为批处理文件就可以了.具体做法就是写个txt文件把命令写进去,再修改后缀名为bat,就可以双击运行命令了。记得要末尾要加个pause,就可以暂停看print的信息和报错了。

第一次写教程,有所欠缺的地方欢迎指教,谢谢。

简单的漫画爬虫,python爬虫实战相关推荐

  1. python爬虫项目实战教学视频_('[Python爬虫]---Python爬虫进阶项目实战视频',)

    爬虫]---Python 爬虫进阶项目实战 1- Python3+Pip环境配置 2- MongoDB环境配置 3- Redis环境配置 4- 4-MySQL的安装 5- 5-Python多版本共存配 ...

  2. Python爬虫 | Python爬虫获取女友图片

    Python爬虫 | Python爬虫获取女友图片 前言 程序说明 二次元女友获取程序 观察网页结构 页面解析 创建图片保存路径 图片下载 格式转换 爬取结果展示 完整程序 前言 (又到了常见的无中生 ...

  3. 看不懂别做爬虫-----python爬虫实战---大众点评评论

    python爬虫实战-爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 2.分析网页 查看到下面有些字体经过加密处理 刷新页面会发现 每一次加密的字体是不一样的 3.发送请求获取数据 查看网 ...

  4. python爬虫-Python爬虫学习之(一)| 从零开始

    大家好,相信点进来看的小伙伴都对爬虫非常感兴趣,博主也是一样的.博主刚开始接触爬虫的时候,就被深深吸引了,因为感觉SO COOL啊!每当敲完代码后看着一串串数据在屏幕上浮动,感觉很有成就感,有木有?更 ...

  5. 老司机带你学爬虫——Python爬虫技术分享

    什么是"爬虫"? 简单来说,写一个从web上获取需要数据并按规定格式存储的程序就叫爬虫: 爬虫理论上步骤很简单,第一步获取html源码,第二步分析html并拿到数据.但实际操作,老 ...

  6. python贴吧爬虫-Python 爬虫练习: 爬取百度贴吧中的图片

    背景:最近开始看一些Python爬虫相关的知识,就在网上找了一些简单已与练习的一些爬虫脚本 实现功能:1,读取用户想要爬取的贴吧 2,读取用户先要爬取某个贴吧的页数范围 3,爬取每个贴吧中用户输入的页 ...

  7. python爬虫-python爬虫是什么?为什么把python叫做爬虫?

    今天我们来讲解python的基本概念性的知识.很多刚接触python的朋友有很多疑问,python爬虫是什么?那又为什么把python叫做爬虫? python爬虫是什么? 在进入文章之前,我们首先需要 ...

  8. python爬虫-Python爬虫入门这一篇就够了

    何谓爬虫 所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本.万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息. 爬虫三要素 抓取 分析 存储 基础 ...

  9. python爬虫-Python 爬虫介绍

    一.什么是爬虫 爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息. 二.Python爬虫架构 Python 爬虫架构主要由五个部分组成,分别是调度器.URL管理器.网页下载器.网 ...

  10. python刷阅读_简单的37行python爬虫刷CSDN博客阅读数

    # -*- coding:utf-8 -*- # 利用爬虫刷CSDN博客阅读数 import requests from bs4 import BeautifulSoup # 解析源码 def Get ...

最新文章

  1. boost::pointee用法的测试程序
  2. synchronized的理解
  3. java调用C++ DLL库方法
  4. [转载]Sybase数据库SQL语句REPLACE的对应函数
  5. python response.json_Python - Django - JsonResponse 对象
  6. 递归和对面对象编程初步
  7. 原版windows下载地址
  8. 【教程】油猴脚本开发入门教程
  9. git log 日期格式
  10. [面试] 步步为营:吉大学士的PG宝洁面经
  11. 内存卡格式化的原因有哪些 内存卡格式化怎么恢复
  12. “2020 博客之星”年度总评选 TOP 200 名单已出,速来认领!
  13. USACO 1359. 城堡(并查集)
  14. python火车票自我编写_自己动手写100行Python代码抢火车票!
  15. CAD等高线转地形高程散点
  16. cool edit工具介绍及使用
  17. 基金知识汇总和实战经验分享
  18. c语言数独出题程序,我用C语言写解数独程序(一)
  19. 时间合并、周一至周五
  20. 不解,排名靠前那么多的人为什么抄袭我的activit博文??

热门文章

  1. 十年码农讲解Linux型内核,操作系统 --- 虚拟文件系统
  2. R语言实战笔记--第四五章 数据管理
  3. VC 强制重启电脑的方法
  4. 下列python保留字中、用于异常处理_下列Python保留字中,用于异常处理结构中用来捕获特定类型异常的是...
  5. 不可盲目优化,否则不是缘木求鱼就是南辕北辙
  6. index DB使用方法,学生成绩信息存储本地
  7. TensorFlow中 tf.space_to_depth()函数的用法
  8. YOLOv5输出端损失函数
  9. (秦路)七周成为数据分析师(第三周)—— Excel
  10. 服务器返回协议解析错误 24577,热血三国2大补贴