爬虫分析:
简单流程:
Created with Raphaël 2.2.0一击男贴吧精品区url地址用xpath和re筛选目标标题保存标题名称和帖子url获取下一页的url地址循环获取所有符合的帖子标题和url遍历符合的帖子url列表分析帖子,获取所有一楼用户id所发的图片帖子下一页url获取所有图片url构造图片url,请求保存图片
分析筛选目标标题
  • 精品区url地址:https://tieba.baidu.com/f?kw=%E4%B8%80%E5%87%BB%E7%94%B7&ie=utf-8&tab=good&cid=1&pn=0
  • 参数kw=“贴吧名字”,这里是“一击男”。
  • tab=good 是精品区的意思,不用管。
  • cid=1 是精品区下的帖子分类,因为要爬取的是精品区的帖子,所以这里选cid=1,“村田重置”
  • 浏览器进入开发者模式,看看代码。Ctrl+f搜索一下某个标题,“二人”,因为要用xpath和re,所以要。找一下一下标题代码的规律。
  • <a rel="noreferrer" href="/p/6366353276" title="164话嵌字汉化【二人小组】" target="_blank" class="j_th_tit ">164话嵌字汉化【二人小组】</a>
  • 因为百度返回的html都在注释里面对使用xpath十分不友好,所以尝试使用re正则表达式直接弄出来。
  • 使用正则表达式:re_str = r'href="/p/(\d*)" title="(.*?)"'
  • 可以得到形如这样的列表:[('6459196128', '【团子汉化组】一击男重制版 168话'), ('6459257409', '168话嵌字汉化【二人小组】'), ('6459200478', '一击男168话【野生汉化菌】'),......,....]
  • 元组内第一个数字可以使用字符串拼接成帖子的url。
  • 元组第二个元素着是这个帖子的标题,可以再次使用正则判断筛选出我们想要的帖子。
获取下一页的url地址
  • 看了一下还是不能直接用xpath,同理还是使用正则表达式。
  • 使用正则表达式:index_netx_page_re_str = r'<a href="(.*?)" class="next pagination-item " >'(感觉正则还挺好用)可以获得下一页的url地址
  • 当到了尾页的时候,正则返回的结果为空列表,所以,可以一次为条件结束循环。
分析帖子,获取帖子内容。
  • 帖子的url还有一点小细节没有处理,不过问题不大,开始分析帖子内容。
  • 先把其中一个帖子的html下载下来看看。
  • 获取帖子内容的过程有点困难,不过,先用
  • pic_url = pic_html.xpath(r"//div[@class='left_section']/div[@id='j_p_postlist']/div/@data-field")
  • 获取了帖子里面每一楼的文件内容,是个字典
  • 图片ID就在pic_url[i][content][content]里面,这里还要用json解释一下才行
  • 再对这里面的字符串使用一次正则表达式
str1 = json.loads(pic_url[15])["content"]["content"]
print(re.findall(r'src="(.*?)"', str1))
  • 这样就得到了图片的地址啦
  • ['http://tiebapic.baidu.com/forum/w%3D580/sign=1a140bfedeea15ce41eee00186003a25/77a7ec025aafa40f52d4aba6bc64034f78f01915.jpg']
获取帖子的下一页
  • 这里可以使用xpath也可以使用re,看了一下好像xpath好像更好一点。那就使用xpath吧
  • next_pic_num = pic_html.xpath("//a[text()='下一页']/@href")
  • 这里获得了2个url地址,不过都是一样的,到时候用其中一个就可以。
修修补补
  • 上面获取到的url基本都需要自己使用字符串的拼接才能传入request模块去使用。
  • 先爬取一个帖子的图片试试看
  • 再爬取贴吧一页的贴子
  • 最后再爬取整个精品区的帖子
  • 几个循坏还需要理一理
  • 因为要爬取的数量可能比较大,考虑使用多线程进行爬取
  • 为了防止ip被封,可能还要加点延时,还是说使用代理ip,这个还要想一想
  • 因为贴吧好像不用登陆也能看,就不用带cookies了
下面开始写代码
  • 获取精品区帖子的url地址和标题和下一页的url地址

    • 请求帖子url地址,获取响应
    • 从响应中获取图片url地址和下一页url地址
      • 保存图片
    • 帖子的下一页内容
  • 精品区的下一页内容
  • 确定好了流程就先写个框架,再慢慢补充细节
class OnePunchManSpider:def __init__(self):self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/79.0.3945.88 Safari/537.36 "}self.boutique_area_url = "https://tieba.baidu.com/f?kw=%E4%B8%80%E5%87%BB%E7%94%B7&ie=utf-8&tab=good&cid=1&pn={}"self.post_url = "https://tieba.baidu.com/p/{}"def get_boutique_post_url(self):passdef get_response(self):passdef get_pic_response(self):passdef save_pic(self):passdef run(self):# 1. 获取精品区帖子的url地址和标题和下一页的url地址boutique_area_url, post_title = self.get_boutique_post_url()# 2. 请求帖子url地址,获取响应post_response = self.get_response()# 3. 从响应中获取图片url地址和下一页url地址pic_url, next_pic_page_url = self.get_pic_response()# 4. 保存图片self.save_pic()# 5. 帖子的下一页内容# 6. 精品区的下一页内容if __name__ == '__main__':

开始按照思路吧功能函数一个个补全。然后加一点细节,写出了一个初步能实现功能的程序。

# -*-coding:utf-8-*-import requests
from lxml import etree
import re
import json
import osclass OnePunchManSpider:def __init__(self):self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ""AppleWebKit/537.36 (KHTML, like Gecko) ""Chrome/79.0.3945.88 Safari/537.36 "}self.boutique_area_url = "https://tieba.baidu.com/f?kw=%E4%B8%80%E5%87%BB%E7%94%B7&ie=utf-8&tab=good&cid=1&pn=0"self.post_url = "https://tieba.baidu.com"self.re_post_url = re.compile(r'href="(/p/\d*)" title="(.*?)"')  # 获取帖子url的正则self.re_pic_url = re.compile(r'src="(.*?)"')self.re_boutique_post_next_page_num = re.compile(r'<a href="(.*?)" class="next pagination-item "')def get_boutique_post_url(self, response_str):post_list = self.re_post_url.findall(response_str)return post_listdef get_pic_url(self, pic_response_str):response_str_html = etree.HTML(pic_response_str)post_data = response_str_html.xpath("//div[@id='j_p_postlist']/div/@data-field")pic_num_list = []louzhu_id = json.loads(post_data[0])["author"]["user_id"]for i in post_data:user_id = json.loads(i)["author"]["user_id"]if user_id == louzhu_id:str1 = json.loads(i)["content"]["content"]pic_num_list += re.findall(r'src="(.*?.jpg)"', str1)return pic_num_listdef get_next_page_num(self, response_str):url = self.re_boutique_post_next_page_num.findall(response_str)if url:return url[0]def get_next_pic_page_num(self, response_str):pic_html = etree.HTML(response_str)next_pic_page_url = pic_html.xpath("//a[text()='下一页']/@href")if next_pic_page_url:return self.post_url + next_pic_page_url[0]def save_pic(self, pic_url_list, path):for i in pic_url_list:pic_name = path + '/' + str(pic_url_list.index(i))pic_response = requests.get(i, headers=self.headers)with open(pic_name, "wb") as f:f.write(pic_response.content)def analyze_post_list(self, post_list):need_post_list = []for i in post_list:if re.search('二人小组', i[1]):need_post_list.append(i)elif re.search('不良漢化', i[1]):need_post_list.append(i)elif re.search('超市特卖', i[1]):need_post_list.append(i)elif re.search('个人汉化', i[1]):need_post_list.append(i)return need_post_listdef get_post_url(self, need_post_list):return {i[1]: self.post_url + i[0] + '?see_lz=1' for i in need_post_list}def get_pic_url_list(self, post_url):pic_url_list = []while post_url:pic_response = requests.get(post_url, headers=self.headers)pic_response_str = pic_response.content.decode()pic_url_list += self.get_pic_url(pic_response_str)post_url = self.get_next_pic_page_num(pic_response_str)return pic_url_listdef mkdir(self, path):# 去除首位空格path = path.strip()# 去除尾部 \ 符号path = path.rstrip("\\")# 判断路径是否存在# 存在     True# 不存在   FalseisExists = os.path.exists(path)# 判断结果if not isExists:# 如果不存在则创建目录# 创建目录操作函数os.makedirs(path)printpath + ' 创建成功'return Trueelse:# 如果目录存在则不创建,并提示目录已存在printpath + ' 目录已存在'return Falsedef run(self):# 1. 获取精品区帖子的url地址和标题boutique_area_page_url = self.boutique_area_urlurl = 1while url:response = requests.get(boutique_area_page_url, headers=self.headers)response_str = response.content.decode()post_list = self.get_boutique_post_url(response_str)  # 获取每一页的帖子的标题和url地址need_post_list = self.analyze_post_list(post_list)  # 简陋的筛选出想要的帖子post_url_dict = self.get_post_url(need_post_list)  # 加工成{“标题”:“url”}形式的字典# 遍历字典,请求帖子获取帖子内容for i in post_url_dict: print(i)save_path = "./onepunchman/" + iif not os.path.exists(save_path):  # 判断目录是否存在self.mkdir(save_path)  # 创建目录pic_url_list = self.get_pic_url_list(post_url_dict[i])  # 获取图片url列表print(len(pic_url_list))print(pic_url_list)self.save_pic(pic_url_list, save_path)  # 保存图片url列表url = self.get_next_page_num(response_str)  # 获取下一页url地址if urlboutique_area_page_url = 'https:' + urlelse:breakif __name__ == '__main__':onepunchmanspider = OnePunchManSpider()onepunchmanspider.run()
程序说明
  • 爬取一击男贴吧所有漫画内容
  • 创建文件夹并保存到本地
  • 如果本地已经存在就执行下一话
后续改进
  • 添加多线程加快爬虫速度
  • 添加ip池防止爬取过快ip被封
  • 程序还可以修改得更好
  • 程序里面字典列表字符串绕来绕去
  • 功能的模块化应该可以分得更精确
写正则的时候在浏览器多点几下比啥都好,这次点了一下【只看楼主】,省了不少脑细胞。
Anyway, done is better than perfect.

github源码地址

爬虫爬取一击男吧漫画相关推荐

  1. Python爬虫---爬取腾讯动漫全站漫画

    Python爬虫---爬取腾讯动漫全站漫画 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源 ...

  2. Python爬虫-爬取快看漫画网图片并拼接成漫画长图

    Python爬虫-爬取快看漫画网图片并拼接成漫画长图 1.爬取图片 2.拼接图片 1.爬取图片 import os import requests from bs4 import BeautifulS ...

  3. java爬虫 爬取动漫之家10000部漫画信息

    Java大作业,爬取信息并写入Excel. 项目下载:https://pan.baidu.com/s/1Z1rMWSyaAeGvZCm5CMgexQ(请用eclipse 2018打开,我的jdk版本是 ...

  4. python爬虫爬取漫画(仅供学习)

    项目名: crawl_chuanwu 爬取链接:https://www.manhuadui.com/manhua/chuanwu/ 声明:本项目无任何盈利目的,仅供学习使用,也不会对网站运行造成负担. ...

  5. 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...

    [爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...

  6. python网络爬虫_Python网络爬虫——爬取视频网站源视频!

    原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...

  7. python java 爬数据_如何用java爬虫爬取网页上的数据

    当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...

  8. java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面

    使用Java爬虫爬取人民日报公众号页面图片 使用Java框架Jsoup和HttpClient实现,先看代码 爬取目标页面 1.使用Maven构建一个普通Java工程 加入依赖: org.jsoup j ...

  9. MATLAB爬虫爬取股票数据

    近年来,大数据盛行,有关爬虫的教程层次不穷.那么,爬虫到底是什么呢? 什么是爬虫? 百度百科是这样定义的: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种 ...

最新文章

  1. android 加壳 方案,android加壳思路
  2. 1,字符是否为空,2,比较两个字符大小。String.Compare(String, String)。string.IsNullOrEmpty(string)...
  3. php 快递查询,PHP查询快递信息
  4. SAP Spartacus简介
  5. Objective-C马路成魔【14-关键C语言功能】
  6. extjs中为什么使用“var me = this”?
  7. Spring基于注解的方式一
  8. unity贪吃蛇c 语言代码,unity实现简单贪吃蛇游戏
  9. 微服务链路追踪_.NET Core微服务:分布式链路追踪系统分享
  10. 疫情之下 SaaS 市场两极分化,SaaS 厂商如何突围严峻形势?
  11. linux 更改ssh端口_如何在Linux中更改SSH端口-简易指南
  12. 应用软件暗藏猫腻,信息安全咋保障
  13. 一文入门智能开关的3种功能形态
  14. 洛谷——P2342 叠积木
  15. COMS门电路的设计及其优化--以异或门为例
  16. 一起来云赏月把!three.js实现vr赏月!
  17. 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
  18. springboot整合redis、mybatis、@EnableScheduling定时任务,实现日访问量与日活量的统计与记录
  19. java什么是类型擦除_Java 泛型,你了解类型擦除吗?
  20. linux aux是什么命令,Linux查看所有进程ps -aux命令介绍

热门文章

  1. 索尼“踏足”汽车激光雷达
  2. Android Apk 瘦身大法
  3. YAHOO工具库(二)
  4. 二手房网签需要注意的事项
  5. tinymce-vue使用教程
  6. 挂载与卸载 Linux nfs 超级终端
  7. Qt FlowLayout布局
  8. 条条大路通CS!北大“一个人的毕业照”主人公,专业独苗,十年后搞起了AI
  9. microPython 的逗比报错的问题
  10. Android touch 事件的处理流程