爬虫实战02--python爬虫百度贴吧标题与图片,遇上反爬(JS渲染后的页面无法抓取),附解决方案,完整代码

01、运行环境

# 操作系统:win10 专业版
pycharm professional 2019.1
python 3.8
lxml == 4.5.1
requests == 2.23.0
xpath == 2.0.2

02、开始爬虫

02-1、爬取的内容

百度贴吧的标题以及里面的图片
在爬取的过程中遇上了反爬(JS渲染后的页面无法抓取。),附上解决方案。
地址:

url = https://tieba.baidu.com/f?kw=lol&ie=utf-8&tab=main&pn=0&

02-2、开始抓取内容

02-2-1、首先

在浏览器里面打开检查模式,然后用Google的擦肩Xpath去获取内容,再也中显示的是正常的,获取到了我们需要的内容。
在这里插入图片描述

02-2-2、接下来

我们就在pycharm里面编写代码,解析页面,基于lxml和xpath获取内容。下面是代码:

# 代码
# 爬取百度贴吧标题和图片
import requests
from lxml import etree

url = 'https://tieba.baidu.com/f?kw=lol&ie=utf-8&tab=main'

headers = {
   
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36"
}

response = requests.get(url=url,headers=headers)
resstr = response.content.decode()

html = etree.HTML(resstr)
textlist = html.xpath("//ul/li//div[@class='threadlist_abs threadlist_abs_onlyline']/text()")

### C++队列的实现与使用 #### 的实现与使用 在 C++ 的标准模板库(STL)中,`std::stack` 是一种容器适配器,它提供了后进先出(LIFO, Last In First Out)的数据存储方式。其基本操作包括 `push`, `pop`, `top`。 以下是 `std::stack` 的一些常用功能及其说明: - **`push(element)`**: 将一个元素压入顶。 - **`pop()`**: 移除顶的元素。 - **`top()`**: 返回顶元素的引用。 - **`empty()`**: 判断是否为空。 - **`size()`**: 返回中元素的数量。 示例代码展示如何使用 `std::stack`: ```cpp #include <iostream> #include <stack> int main() { std::stack<int> s; // 压入元素到中 s.push(1); s.push(2); // 输出顶元素 std::cout << "Top element: " << s.top() << std::endl; // 删除顶元素 s.pop(); // 检查是否为空 if (!s.empty()) { std::cout << "Stack is not empty." << std::endl; } // 获取当前大小 std::cout << "Size of stack: " << s.size() << std::endl; return 0; } ``` 上述代码展示了如何创建并操作一个整型[^1]。 #### 队列的实现与使用 同样,在 STL 中,`std::queue` 提供了一种先进先出(FIFO, First In First Out)的数据结构。它的基础操作包括 `push`, `pop`, `front`, `back`。 具体的操作描述如下: - **`push(element)`**: 向队列尾部添加新元素。 - **`pop()`**: 移除队首元素。 - **`front()`**: 返回队首元素的引用。 - **`back()`**: 返回队尾元素的引用。 - **`empty()`**: 判断队列是否为空。 - **`size()`**: 返回队列中元素的数量。 下面是关于 `std::queue` 使用的一个简单实例: ```cpp #include <iostream> #include <queue> int main() { std::queue<int> q; // 添加元素至队列 q.push(1); q.push(2); // 访问队首元素 std::cout << "Front element: " << q.front() << std::endl; // 访问队尾元素 std::cout << "Back element: " << q.back() << std::endl; // 删除队首元素 q.pop(); // 检查队列是否为空 if (!q.empty()) { std::cout << "Queue is not empty." << std::endl; } // 查看当前队列大小 std::cout << "Size of queue: " << q.size() << std::endl; return 0; } ``` 这段代码演示了如何初始化、填充以及管理一个简单的整数队列[^5]。 #### 自定义实现队列 除了直接利用 STL 容器外,还可以通过数组或者链表手动模拟队列的行为。这有助于深入理解这些数据结构的工作机制。例如,可以自定义一个基于动态数组的类或队列类,并重载必要的成员函数来完成相应的逻辑处理[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值