爬虫爬取一击男吧漫画
爬虫分析:
简单流程:
分析筛选目标标题
- 精品区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源码地址
爬虫爬取一击男吧漫画相关推荐
- Python爬虫---爬取腾讯动漫全站漫画
Python爬虫---爬取腾讯动漫全站漫画 操作环境 网页分析 明确目标 提取漫画地址 提取漫画章节地址 提取漫画图片 编写代码 导入需要的模块 获取漫画地址 提取漫画的内容页 提取章节名 获取漫画源 ...
- Python爬虫-爬取快看漫画网图片并拼接成漫画长图
Python爬虫-爬取快看漫画网图片并拼接成漫画长图 1.爬取图片 2.拼接图片 1.爬取图片 import os import requests from bs4 import BeautifulS ...
- java爬虫 爬取动漫之家10000部漫画信息
Java大作业,爬取信息并写入Excel. 项目下载:https://pan.baidu.com/s/1Z1rMWSyaAeGvZCm5CMgexQ(请用eclipse 2018打开,我的jdk版本是 ...
- python爬虫爬取漫画(仅供学习)
项目名: crawl_chuanwu 爬取链接:https://www.manhuadui.com/manhua/chuanwu/ 声明:本项目无任何盈利目的,仅供学习使用,也不会对网站运行造成负担. ...
- 【爬虫】利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2)...
[爬虫]利用Python爬虫爬取小麦苗itpub博客的所有文章的连接地址并写入Excel中(2) 第一篇( http://blog.itpub.net/26736162/viewspace-22865 ...
- python网络爬虫_Python网络爬虫——爬取视频网站源视频!
原标题:Python网络爬虫--爬取视频网站源视频! 学习前提 1.了解python基础语法 2.了解re.selenium.BeautifulSoup.os.requests等python第三方库 ...
- python java 爬数据_如何用java爬虫爬取网页上的数据
当我们使用浏览器处理网页的时候,有时候是不需要浏览的,例如使用PhantomJS适用于无头浏览器,进行爬取网页数据操作.最近在进行java爬虫学习的小伙伴们有没有想过如何爬取js生成的网络页面吗?别急 ...
- java用爬虫爬一个页面_使用Java写一个简单爬虫爬取单页面
使用Java爬虫爬取人民日报公众号页面图片 使用Java框架Jsoup和HttpClient实现,先看代码 爬取目标页面 1.使用Maven构建一个普通Java工程 加入依赖: org.jsoup j ...
- MATLAB爬虫爬取股票数据
近年来,大数据盛行,有关爬虫的教程层次不穷.那么,爬虫到底是什么呢? 什么是爬虫? 百度百科是这样定义的: 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种 ...
最新文章
- android 加壳 方案,android加壳思路
- 1,字符是否为空,2,比较两个字符大小。String.Compare(String, String)。string.IsNullOrEmpty(string)...
- php 快递查询,PHP查询快递信息
- SAP Spartacus简介
- Objective-C马路成魔【14-关键C语言功能】
- extjs中为什么使用“var me = this”?
- Spring基于注解的方式一
- unity贪吃蛇c 语言代码,unity实现简单贪吃蛇游戏
- 微服务链路追踪_.NET Core微服务:分布式链路追踪系统分享
- 疫情之下 SaaS 市场两极分化,SaaS 厂商如何突围严峻形势?
- linux 更改ssh端口_如何在Linux中更改SSH端口-简易指南
- 应用软件暗藏猫腻,信息安全咋保障
- 一文入门智能开关的3种功能形态
- 洛谷——P2342 叠积木
- COMS门电路的设计及其优化--以异或门为例
- 一起来云赏月把!three.js实现vr赏月!
- 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
- springboot整合redis、mybatis、@EnableScheduling定时任务,实现日访问量与日活量的统计与记录
- java什么是类型擦除_Java 泛型,你了解类型擦除吗?
- linux aux是什么命令,Linux查看所有进程ps -aux命令介绍