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

涉及:

  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. Spark获取DataFrame中列的方式--col,$,column,apply

    Spark获取DataFrame中列的方式--col,$,column,apply 1.官方说明 2.使用时涉及到的的包 3.Demo 原文作者:大葱拌豆腐 原文地址:Spark获取DataFrame ...

  2. stop脚本

    PID=$(ps -ef | grep eladmin-system-2.0.jar | grep -v grep | awk '{ print $2 }')if [ -z "$PID&qu ...

  3. java实现hbase数据库的增删改查操作(新API)

    操作环境: java版本:    jdk 1.7以上 hbase 版本:1.2.x hadoop版本:2.6.0以上 实现功能: 1,创建指定表 2,删除指定表 3,根据表名,行键,列族,列描述符,值 ...

  4. C++基本之--静态成员函数和静态成员变量

    #include <iostream> using namespace std; class Internet { public: Internet(char *name,char *ad ...

  5. OpenStack (云计算与openstck简介)

    云计算 什么是云计算 云计算是一种按使用量付费的模式,这种模式提供可用的,便捷的,按需的网络访问,通过互联网进入可配置的计算资源共享池(资源包括,计算,存储,应用软件和服务) 云计算的特征 易于管理: ...

  6. 省市县sql

    create table SYS_AREA ( ID NUMBER(18) not null, AREA_CODE VARCHAR2(50) not null, AREA_NAME VARCHAR2( ...

  7. 华三交换机NTP配置

    clock protocol ntp ntp-service enable ntp-service unicast-server x.x.x.x clock timezone beijing add ...

  8. dedecms新建内容模型以及如何添加字段

    dedecms新建内容模型以及如何添加字段 内容模型就是我们所说的频道模型,利用频道模型可以实现其使用他的栏目具备一些功能,比如说,图片模型,在使用他的栏目中就可以发表多个图片,并且能够达到相册的功能 ...

  9. jvm系列二内存结构

    二.内存结构 整体架构 1.程序计数器 作用 用于保存JVM中下一条所要执行的指令的地址 特点 线程私有 CPU会为每个线程分配时间片,当当前线程的时间片使用完以后,CPU就会去执行另一个线程中的代码 ...

  10. idea2018 快捷键

    Alt+Enter将光标放到缺少包的错误提示处自动导入包Ctrl+Alt+Space光标处会有会出现界面提示需要补全的信息也可以在new完对象后使用.var后将会自动补 Ctrl+O可以选择父类的方法 ...