本爬虫以百度贴吧为例,爬取某个贴吧的【所有发言】以及对应发言详情中的【图片链接】

涉及:

  1. request 发送请求获取响应
  2. html 取消注释
  3. 通过xpath提取数据
  4. 数据保存

思路:

  • 由于各贴吧发言的数量不一,因此通过观察url规律统一构造url列表进行遍历爬取,不具有可推广性,因此通过先找到【下一页】url,看某一页是否存在下一页url决定爬虫的停止与否
  • 对初始url 进行while True,直到没有下一页url为止
    • 发送请求获取响应
    • 提取数据(标题列表、url列表、下一页url)
      • 遍历url列表

        • 对初始url 进行while True,直到没有下一页url为止

          • 发送请求获取响应
          • 提取数据(image_url_list、下一页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)的更多相关文章

  1. Python爬虫_百度贴吧

    # 本爬虫为爬取百度贴吧并存储HTMLimport requests class TiebaSpider: def __init__(self, tieba_name): self.tieba_nam ...

  2. 如何用Python爬虫实现百度图片自动下载?

    Github:https://github.com/nnngu/LearningNotes 制作爬虫的步骤 制作一个爬虫一般分以下几个步骤: 分析需求 分析网页源代码,配合开发者工具 编写正则表达式或 ...

  3. python爬虫获取百度图片(没有精华,只为娱乐)

    python3.7,爬虫技术,获取百度图片资源,msg为查询内容,cnt为查询的页数,大家快点来爬起来.注:现在只能爬取到百度的小图片,以后有大图片的方法,我会陆续发贴. #!/usr/bin/env ...

  4. 【转】Python爬虫_示例2

    爬虫项目:爬取并筛选拉钩网职位信息自动提交简历   一 目标站点分析 #一:实验前准备: 浏览器用Chrome 用Ctrl+Shift+Delete清除浏览器缓存的Cookie 打开network准备 ...

  5. python爬虫_简单使用百度OCR解析验证码

    百度技术文档 首先要注册百度云账号: 在首页,找到图像识别,创建应用,选择相应的功能,创建 安装接口模块: pip install baidu-aip 简单识别一: 简单图形验证码: 图片: from ...

  6. 利用Python爬虫实现百度网盘自动化添加资源

    事情的起因是这样的,由于我想找几部经典电影欣赏欣赏,于是便向某老司机寻求资源(我备注了需要正规视频,绝对不是他想的那种资源),然后他丢给了我一个视频资源网站,说是比较有名的视频资源网站.我信以为真,便 ...

  7. 零基础Python爬虫实现(百度贴吧)

    提示:本学习来自Ehco前辈的文章, 经过实现得出的笔记. 目标 http://tieba.baidu.com/f?kw=linux&ie=utf-8 网站结构 学习目标 由于是第一个实验性质 ...

  8. python爬虫_入门_翻页

    写出来的爬虫,肯定不能只在一个页面爬,只要要爬几个页面,甚至一个网站,这时候就需要用到翻页了 其实翻页很简单,还是这个页面http://bbs.fengniao.com/forum/10384633. ...

  9. python爬虫_入门

    本来觉得没什么可写的,因为网上这玩意一搜一大把,不过爬虫毕竟是python的一个大亮点,不说说感觉对不起这玩意基础点来说,python2写爬虫重点需要两个模块,urllib和urllib2,其实还有r ...

随机推荐

  1. Spring Cloud与Docker——微服务架构概述

    Spring Cloud与Docker--微服务架构概述 单体应用架构概述 微服务概述 微服务的特性 微服务架构的优点 微服务面临的挑战 微服务的设计原则 单体应用架构概述 传统的服务发布都是采用单体 ...

  2. java获取post请求头部字符串

    尝试过很多方式,下面的方式最有效: 用获取数据流的方式,直接获取post过来的所有数据流 // 读取请求内容 BufferedReader br = new BufferedReader(new In ...

  3. 在.NetCore(C#)中使用ODP.NET Core+Dapper操作Oracle数据库

    前言 虽然一直在说"去IOE化",但是在国企和政府,Oracle的历史包袱实在太重了,甚至很多业务逻辑都是写在Oracle的各种存储过程里面实现的-- 我们的系统主要的技术栈是Dj ...

  4. 用Python修改本机适配器信息

    主要参考来自[用Python干实事(一)自动修改Windows的IP.网关和DNS设置]. 使用_winreg模块来操作注册表实现相关信息的修改,它是python的内置模块.也可以通过Win32 Ex ...

  5. hdu2852 KiKi's K-Number

    Problem Description For the k-th number, we all should be very familiar with it. Of course,to kiki i ...

  6. MySQL 事务日志

    重做日志(Redo log) 重做日志(Redo log),也叫做前滚日志,存放在如下位置,轮询使用,记录着内存中数据页的变化,在事务 ACID 过程中,主要实现的是 D(Durability)的作用 ...

  7. 8.rabbitmq RPC模拟微服务架构中的服务调用

    标题 : 8.rabbitmq RPC模拟微服务架构中的服务调用 目录 : RabbitMQ 序号 : 8 { var connectionFactory = new ConnectionFactor ...

  8. C++ part1

    C++内存分配 references: C++ 自由存储区是否等价于堆? c++ new 与malloc有什么区别 C++, Free-Store vs Heap 1. 栈:由编译器自动分配释放,存放 ...

  9. Java | 在 Java 中执行动态表达式语句: 前中后缀、Ognl、SpEL、Groovy、Jexl3

    在一些规则集或者工作流项目中,经常会遇到动态解析表达式并执行得出结果的功能. 规则引擎是一种嵌入在应用程序中的组件,它可以将业务规则从业务代码中剥离出来,使用预先定义好的语义规范来实现这些剥离出来的业 ...

  10. 力扣561. 数组拆分 I-C语言实现-简单题

    题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...