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

涉及:

  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. Web漏洞扫描-AWVS

    Web漏洞扫描-AWVS 一.AWVS概述 二.功能以及特点 三.AWVS界面 四.AWVS使用 相关优质博文: CSDN:帽子不够白:WEB渗透测试之三大漏扫神器 一.AWVS概述 Acunetix ...

  2. Spark调优 | Spark Streaming 调优

    Spark调优 | Spark Streaming 调优 1.数据序列化 2.广播大变量 3.数据处理和接收时的并行度 4.设置合理的批处理间隔 5.内存优化 5.1 内存管理 5.2优化策略 5.3 ...

  3. Ajax原理,技术封装与完整示例代码

    在做项目和学习的时候,经常用到Ajax的相关技术,但是这方面的技术总是运用的不是十分好,就寻找相关博客来学习加深Ajax技术相关. 一.Ajax简介 二.同步.异步传输区别 2.1 异步传输 2.2 ...

  4. redis学习教程一《Redis的安装和配置》

    redis学习教程一<Redis的安装和配置> Redis的优点 以下是Redis的一些优点. 异常快 - Redis非常快,每秒可执行大约110000次的设置(SET)操作,每秒大约可执 ...

  5. docker(mysql-redmine)

    一.安装docker 首先查看自己的版本,我的是centos 版本为 [root@localhost redmine]# uname -r 3.10.0-862.el7.x86_64 移除旧版本 yu ...

  6. sublime text 2应用

    http://www.sublimetext.com/2 可以下一个 a portable version  我自己的是win版和linux版都有 1.添加注释 先选择要注释的内容,然后按 ctrl ...

  7. java类里的成员变量是自身的对象问题

    今晚看单例模式饿汉时想到一个问题:假如java类里的成员变量是自身的对象,则新建该类对象时内存中怎么分配空间,我感觉似乎死循环了.于是上网搜索了下,哈哈,果然有人早就思考过这个问题了,站在巨人的肩膀上 ...

  8. markdown编辑器typora本地图片上传到自己的服务器

    typora是windows平台下最受欢迎的markdown书写工具和查看工具,本篇文章将会介绍如何在typora平台使用java脚本程序自动上传本地图片到自己的服务器,从而让markdown文章中的 ...

  9. 【xml】Button背景色无法修改

    由于新版本的主题问题,导致Android Studio的Button背景无法修改,一直呈现亮紫色. 解决方法:将app/res/values目录下的themes代码加上.Bridge即可 修改前: & ...

  10. hdu 4352 XHXJ's LIS(数位dp+状压)

    Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefull ...