Python爬虫_百度贴吧(title、url、image_url)
本爬虫以百度贴吧为例,爬取某个贴吧的【所有发言】以及对应发言详情中的【图片链接】
涉及:
- request 发送请求获取响应
- html 取消注释
- 通过xpath提取数据
- 数据保存
思路:
- 由于各贴吧发言的数量不一,因此通过观察url规律统一构造url列表进行遍历爬取,不具有可推广性,因此通过先找到【下一页】url,看某一页是否存在下一页url决定爬虫的停止与否
- 对初始url 进行while True,直到没有下一页url为止
- 发送请求获取响应
- 提取数据(标题列表、url列表、下一页url)
- 遍历url列表
- 对初始url 进行while True,直到没有下一页url为止
- 发送请求获取响应
- 提取数据(image_url_list、下一页url
- 保存数据
- 对初始url 进行while True,直到没有下一页url为止
- 遍历url列表
代码:
1 import requests
2 from lxml import etree
3 import json
4
5
6 class TieBaSpider:
7 def __init__(self):
8 self.proxies = {"http": "http://122.243.12.135:9000"} # 免费ip代理
9 self.start_url = "https://tieba.baidu.com/f?kw={}&ie=utf-8&pn=0"
10 self.headers = {
11 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.k36 (KHTML, like Gecko) "
12 "Chrome/86.0.4240.11"}
13
14 # 发送请求获取响应
15 def parse_url(self, url):
16 res = requests.get(url, headers=self.headers, proxies=self.proxies)
17 html_str = res.content.decode().replace(r"<!--", "''").replace(r"-->", "''") # 去除网页注释
18
19 return html_str
20
21 # 提取外层url内容列表
22 @staticmethod
23 def get_outer_content(html_str):
24 html = etree.HTML(html_str)
25 title_list = html.xpath("//a[@class='j_th_tit ']/text()")
26 url_list = html.xpath("//a[@class='j_th_tit ']/@href")
27 if len(html.xpath("//a[text()='下一页']/@href")) > 0:
28 next_url_outer = html.xpath("//a[text()='下一页'/@href")[0]
29 else:
30 next_url_outer = None
31
32 return title_list, url_list, next_url_outer
33
34 # 提取内层url内容列表
35 @staticmethod
36 def get_inner_content(html_str):
37 html = etree.HTML(html_str)
38 image_list = html.xpath("//img[@class='BDE_Image']/@src")
39
40 if len(html.xpath("//a[text()='下一页']/@href")) > 0:
41 next_url_inner = 'https://tieba.baidu.com' + html.xpath("//a[text()='下一页']/@href")[0]
42 else:
43 next_url_inner = None
44
45 return image_list, next_url_inner
46
47 # 保存数据
48 @staticmethod
49 def save(comment):
50 with open("tb.txt", "a", encoding="utf8") as f:
51 f.write(json.dumps(comment, ensure_ascii=False, indent=2)+"\n")
52
53 # 主函数
54 def run(self):
55 # 初始化保存数据的字典
56 comment = {}
57 # 构造 url
58 url = self.start_url.format("费德勒")
59 # 初始化外层循环条件
60 next_url_outer = url
61 while next_url_outer is not None: # 循环外层的每一页
62 html_str = self.parse_url(next_url_outer) # 发送请求,获取响应
63 title_list, url_list, next_url_outer = self.get_outer_content(html_str) # 提取数据(标题,下一页url)
64 i = 0
65 for url_inner in url_list: # 循环外层的某一页
66 image_list_all = [] # 初始化存放img_url的列表
67 url_inner = 'https://tieba.baidu.com' + url_inner # 构建url
68 image_list, next_url_inner = self.get_inner_content(self.parse_url(url_inner)) # 获取数据
69 image_list_all.extend(image_list)
70
71 while next_url_inner is not None: # 循环某一页上的某一个url
72 html_str = self.parse_url(next_url_inner)
73 image_list, next_url_inner = self.get_inner_content(html_str)
74 image_list_all.extend(image_list)
75
76 comment["title"] = title_list[i]
77 comment["url"] = url_inner
78 comment["img_url"] = image_list_all
79
80 self.save(comment)
81 i += 1
82 print("ok")
83
84
85 if __name__ == "__main__":
86 tb = TieBaSpider()
87 tb.run()

Python爬虫_百度贴吧(title、url、image_url)的更多相关文章
- Python爬虫_百度贴吧
# 本爬虫为爬取百度贴吧并存储HTMLimport requests class TiebaSpider: def __init__(self, tieba_name): self.tieba_nam ...
- 如何用Python爬虫实现百度图片自动下载?
Github:https://github.com/nnngu/LearningNotes 制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或 ...
- python爬虫获取百度图片(没有精华,只为娱乐)
python3.7,爬虫技术,获取百度图片资源,msg为查询内容,cnt为查询的页数,大家快点来爬起来.注:现在只能爬取到百度的小图片,以后有大图片的方法,我会陆续发贴. #!/usr/bin/env ...
- 【转】Python爬虫_示例2
爬虫项目:爬取并筛选拉钩网职位信息自动提交简历 一 目标站点分析 #一:实验前准备: 浏览器用Chrome 用Ctrl+Shift+Delete清除浏览器缓存的Cookie 打开network准备 ...
- python爬虫_简单使用百度OCR解析验证码
百度技术文档 首先要注册百度云账号: 在首页,找到图像识别,创建应用,选择相应的功能,创建 安装接口模块: pip install baidu-aip 简单识别一: 简单图形验证码: 图片: from ...
- 利用Python爬虫实现百度网盘自动化添加资源
事情的起因是这样的,由于我想找几部经典电影欣赏欣赏,于是便向某老司机寻求资源(我备注了需要正规视频,绝对不是他想的那种资源),然后他丢给了我一个视频资源网站,说是比较有名的视频资源网站.我信以为真,便 ...
- 零基础Python爬虫实现(百度贴吧)
提示:本学习来自Ehco前辈的文章, 经过实现得出的笔记. 目标 http://tieba.baidu.com/f?kw=linux&ie=utf-8 网站结构 学习目标 由于是第一个实验性质 ...
- python爬虫_入门_翻页
写出来的爬虫,肯定不能只在一个页面爬,只要要爬几个页面,甚至一个网站,这时候就需要用到翻页了 其实翻页很简单,还是这个页面http://bbs.fengniao.com/forum/10384633. ...
- python爬虫_入门
本来觉得没什么可写的,因为网上这玩意一搜一大把,不过爬虫毕竟是python的一个大亮点,不说说感觉对不起这玩意基础点来说,python2写爬虫重点需要两个模块,urllib和urllib2,其实还有r ...
随机推荐
- f5添加多个vlan的方法
1.方法一 方法二: F5不更改配置,核心添加路由 ip route 10.160.101.0 255.255.255.0 10.160.100.10
- linux(4)Linux 文件内容查看
查看文件内容总览 cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写! nl 显示的时候,顺道输出行号! more 一页一页的显示文件内容 less ...
- STM32通过rosserial接入ROS通讯开发
作者:良知犹存 转载授权以及围观:欢迎添加微信公众号:羽林君 前言 主题:串口是一种设备间常用的通讯接口,rosserial将串口字符数据转发到标准ROS网络,并输出到rosout和其日志文件.本文将 ...
- 力扣1423. 可获得的最大点数-C语言
题目 题目链接 几张卡牌 排成一行,每张卡牌都有一个对应的点数.点数由整数数组 cardPoints 给出. 每次行动,你可以从行的开头或者末尾拿一张卡牌,最终你必须正好拿 k 张卡牌. 你的点数就是 ...
- P2120 [ZJOI2007] 仓库建设(斜率优化DP)
题意:\(1\sim N\) 号工厂,第\(i\) 个工厂有\(P_i\)个成品,第\(i\)个工厂建立仓库需要\(C_i\)的费用,该工厂距离第一个工厂的距离为\(X_i\),编号小的工厂只能往编号 ...
- Codeforces Global Round 7 C. Permutation Partitions(组合数学)
题意: 给你 n 长全排列的一种情况,将其分为 k 份,取每份中的最大值相加,输出和的最大值和有多少种分法等于最大值. 思路: 取前 k 大值,储存下标,每两个 k 大值间有 vi+1 - vi 种分 ...
- HDU6661 Acesrc and String Theory【SA】
Acesrc and String Theory Problem Description Acesrc is a famous string theorist at Nanjing Universit ...
- P1714 切蛋糕 dp+单调队列
题意: 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精. 某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪露诺决定到 ...
- Codeforces Round #681 (Div. 1, based on VK Cup 2019-2020 - Final) B. Identify the Operations (模拟,双向链表)
题意:给你一组不重复的序列\(a\),每次可以选择一个数删除它左边或右边的一个数,并将选择的数append到数组\(b\)中,现在给你数组\(b\),问有多少种方案数得到\(b\). 题解:我们可以记 ...
- Educational DP Contest F - LCS (LCS输出路径)
题意:有两个字符串,求他们的最长公共子序列并输出. 题解:首先跑个LCS记录一下dp数组,然后根据dp数组来反着还原路径,只有当两个位置的字符相同时才输出. 代码: char s[N],t[N]; i ...