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

涉及:

  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. 渗透测试流程&mdash;&mdash;渗透测试的9个步骤(转)

    目录 明确目标 分析风险,获得授权 信息收集 漏洞探测(手动&自动) 漏洞验证 信息分析 利用漏洞,获取数据 信息整理 形成报告 1.明确目标 1)确定范围:测试的范围,如:IP.域名.内外网 ...

  2. 设计模式c++(5)——工厂模式

    工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个.工厂方法让类把实例化推迟到子类. 总的来说,就是工厂方法模式封装了对象的创建,通过让子类决定该创建的对象是什么,来达到将对象创建 ...

  3. 免费开源的代码审计工具 Gosec 入门使用

    声明: 本教程是在自己的电脑上本地测试Gosec的效果,所以不涉及其他运行模式,如果想要了解其他模式可以关注后期文档,如果想要自定义交流自定义代码扫描规则,可以跟我交流沟通. 背景: Gosec是一个 ...

  4. 织梦(DedeCms)的安全问题解决办法

    网上大家也看到DEDECMS这套程序,虽然便捷草根站长的快速建站,但安全问题也是非常多的.DEDE官方也在很久之前就已经不再对这套系统进行什么版本升级了,最多就是一些补丁修复: 好,废话不多说,下面整 ...

  5. Java泛型学习---第二篇

    泛型学习第一篇 1.泛型之擦拭法 泛型是一种类似"模板代码"的技术,不同语言的泛型实现方式不一定相同. Java语言的泛型实现方式是擦拭法(Type Erasure). 所谓擦拭法 ...

  6. HDOJ 2955

    这道背包题和我们常见的背包题有所不同.如果根据以前做背包的惯性思维和题中数据的迷惑,会把概率乘以100来当作容量.但是经测试是不行的. 我们不妨换种思路,看做DAG上的DP思想.将所有有可能达到的钱的 ...

  7. 在eclipse完成对Java_web项目里面资源文件的读取

    Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...

  8. cf1291c-Mind Control

    题意:n个数n个人依次取数,每个人只能取第一个数或最后一个数,你可以从一开始控制k个人取最前边或是最后边的数,你排在第m位,能取到的最大的数是多少.所有人取数都是最优策略(不是每次取最大数). 题解: ...

  9. P2062 分队问题(DP)

    题目描述 给定n个选手,将他们分成若干只队伍.其中第i个选手要求自己所属的队伍的人数大等于a[i]人. 在满足所有选手的要求的前提下,最大化队伍的总数. 注:每个选手属于且仅属于一支队伍. 输入输出格 ...

  10. DQL 数据查询语言

    查询数据(SELECT) # 查询所有数据 - 很危险,数据量过大,容易导致内存溢出而宕机 mysql> select * from student; # 先查询数据总量,然后决定是否可以查询所 ...