Ldfd 发表于 2020-7-18 11:27

[教程向]python爬取吾爱破解热门帖子题目地址,无正则

本帖最后由 Ldfd 于 2020-7-22 08:57 编辑

主要是小白实践实践,天天爬小说都烂大街了(本身都是一样的)
吾爱上恕我直言,没有正了八经的小白爬虫
(我认为不用正则也就requests+bs 或 selenium,利用selector好像不怎么灵活,xpath没用过)

# 准备

## 软件准备

1.python 3.x

2.pycharm——最强IDE?

## python库准备

1.requests 干啥啥必备,指名道姓urllib你个辣鸡

[官方文档](https://requests.readthedocs.io/zh_CN/latest/)

2.bs4 注:虽然库是Beautiful Soup ,但是鬼知道官方整个bs4还得from import干什么

[官方文档](https://beautifulsoup.readthedocs.io/zh_CN/latest/)

3.lxml 虽说python内置的解析器已经凑合能用了,但这是优良传统

注:这是一个神奇的库,只需安装,不需引用

~~4.用不到的selenium(js动态加载必备)~~

5.tqdm 用于显示进度条,美化用

```python
pip install requests
pip install bs4
pip install lxml
```

当然还可以用pycharm的库管理器安装,记得提前换个清华/阿里源

ps:官方文档会让你迷茫的时候,看不懂一帮憨憨讲什么的时候,恍然大悟

# 知识

感觉没什么说的
```
url——域名
      <xxx></xxx>——标签
      <xxx>看我</xxx>——看我是元素
                <example shuxing="shuxing"></example>——shuxing="shuxing"便是属性,用于爬虫确定标签位置,毕竟谁也不可能就那么一个标签
      ```
      
论坛的“ < ”“>显示好像不太好
      
某些网站会用些实体字符就是形如 &example这种

w3school提供手册[](https://www.w3school.com.cn/tags/html_ref_entities.html)

查查更健康

# 实践

## 下载网页

这个比较简单,只需要requests就可以实现

比如先爬一下https://www.52pojie.cn/的首页

网站还是比较友好的,没有对新手太过苛刻,但是呢,爬虫也是一样,没事别老整什么多发线程

你以为你cc攻击呐,鸡眼了,有你好果子吃

```python
import requests
html = requests.get('https://www.52pojie.cn')
print(html.text)
```

这里注意print时html后面需要加.text输出源码,不加会输出什么呢?可以试一试

(~~不加是状态码小声BB~~)

然后,你就得到了一大堆,有什么用呢,没什么用

这时一个舒服的筛选工具就很必要了

## 筛选

由于上面52pojie.cn的首页四块class都相同,不便于区分,不爬了快跑(不到啊)

https://www.52pojie.cn/forum.php?mod=guide&view=hot这看起来是个软柿子

F12看结构

![](https://i.loli.net/2020/07/18/sG7TqEU1P9LRkDt.png)

以下是我个人经验

1.必须找到你所要内容的上一级利用find

2.然后find_all你所找的标签

3.用 元素.string 得到元素

   用 元素.get('属性')得到属性

打个比方:

比如你想知道法外狂徒张三所住小区的所有门上的猫眼长什么样

你必须先找到小区

然后再筛选出小区中的单元门

然后再get到猫眼

(糟糕的比喻)

根据以上方法

0.网页下载
```python
import requests
from bs4 import BeautifulSoup
html = requests.get('https://www.52pojie.cn/forum.php?mod=guide&view=hot')
```
0.5使用bs解析
```python
soup = BeautifulSoup(html.text, 'lxml')
```
### 1.div标签 确定

属性 有 id 和 class 可以二选一,也可以都使用

注意:BeautifulSoup中class为class_ 说是为了避免重复,咱也不知道啊

```python
import requests
from bs4 import BeautifulSoup
html = requests.get('https://www.52pojie.cn/forum.php?mod=guide&view=hot')
sever = 'https://www.52pojie.cn/'
soup = BeautifulSoup(html.text, 'lxml')
get = soup.find('div', class_='tl bm bmw')
```

### 2.获取a标签

```
import requests
from bs4 import BeautifulSoup
html = requests.get('https://www.52pojie.cn/forum.php?mod=guide&view=hot')
sever = 'https://www.52pojie.cn/'
soup = BeautifulSoup(html.text, 'lxml')
get = soup.find('div', class_='tl bm bmw')
geta = get.find_all('a', class_='xst')
```
### 3.获取元素及href属性
这里明确一件事情
.find找到的默认是第一个,是一个整体,所以要做到唯一
.find_all找到的是所有匹配的,是一个list,所以我们应用for循环,逐个输出
```
for x in geta:
    print(x.string)
    print(sever+x.get('href'))
```
注:这里的sever就是https://www.52pojie.cn/
原因是因为站内href都是去头的,就是个本地访问,可是服务器又不在我们电脑,补全是必须的
这里便是输出结果
```
电视盒子tv版本ktv软件无需会员
https://www.52pojie.cn/thread-1220759-1-1.html
WPS Office v12.7.1直装高级版
https://www.52pojie.cn/thread-1220940-1-1.html
玩转Github各种插件和脚本【效率提升200%】
https://www.52pojie.cn/thread-1221353-1-1.html
某盒子破解,仅分析破解思路
https://www.52pojie.cn/thread-1218307-1-1.html
【CN911】编码手册 v1.0自定义手册
https://www.52pojie.cn/thread-1218755-1-1.html
【转】洛雪音乐助手 v1.0.0 beta 3 音乐下载神器Windows+Mac+Linux
https://www.52pojie.cn/thread-1219799-1-1.html
【steam价值¥280新游】《牧场物语:重聚矿石镇》中文免安装版
https://www.52pojie.cn/thread-1219718-1-1.html
发个某包买的会会(带素材教程和模板)
https://www.52pojie.cn/thread-1220974-1-1.html
【度盘】彩虹岛7月单机版,双刀技改、宝石之心、副本修复等
https://www.52pojie.cn/thread-1219292-1-1.html
【极限竞速:地平线4v1.42.799.2】【免安装绿色中文版】【整合700辆车存档】网盘
https://www.52pojie.cn/thread-1219604-1-1.html
万兴全能格式转换器 v12.0.1.2 免激活绿色版
https://www.52pojie.cn/thread-1220924-1-1.html
红色警戒:尤里的复仇 经典战争游戏PC移植版 【手机版】 推荐喜欢的朋友试试
https://www.52pojie.cn/thread-1218271-1-1.html
还记得诺顿吗?Norton Utilities Premium(诺顿系统优化软件)官方中文版V17.0.3.658
https://www.52pojie.cn/thread-1219632-1-1.html
国家计算机考试题库软件
https://www.52pojie.cn/thread-1215779-1-1.html
【小男孩证件照制作】支持500多个证件照免费制作,一键换背景色自动排版自动美颜
https://www.52pojie.cn/thread-1219295-1-1.html
虚拟机VM15最高版本+win7 vm文件 小白安装打开即可
https://www.52pojie.cn/thread-1218813-1-1.html
百度链接免登陆高速下载!
https://www.52pojie.cn/thread-1214687-1-1.html
微信PC版 v2.9.5.53 无限多开&消息防撤回绿色版(带撤回提示)(7.16更新)
https://www.52pojie.cn/thread-1220826-1-1.html
木马程序借助“游民星空”等下载站再次大肆传播可云控投放恶意模块
https://www.52pojie.cn/thread-1216391-1-1.html
蚂蚁远程 1.1.0.0
https://www.52pojie.cn/thread-1219781-1-1.html
usb3.0驱动及nvme补丁注入工具(6代及以上iu装win7的解决方式)
https://www.52pojie.cn/thread-1220690-1-1.html
Office Tab Enterprise v14.00.0
https://www.52pojie.cn/thread-1220396-1-1.html
M3U8批量下载器 V1.4.5【7月9日更新】
https://www.52pojie.cn/thread-1216473-1-1.html
桌面整理软件DeskGo_2_9_20254_127_lite独立提取版
https://www.52pojie.cn/thread-1216677-1-1.html
【IDM神操作】你要的无损Music资源这样搞定!【2020.7.13 更新】
https://www.52pojie.cn/thread-1217156-1-1.html
端口查看器
https://www.52pojie.cn/thread-1219565-1-1.html
深度一键软件安装器2020.07.10
https://www.52pojie.cn/thread-1217401-1-1.html
【开放注册公告】吾爱破解论坛2020年7月21日暑假开放注册公告
https://www.52pojie.cn/thread-1216734-1-1.html
百度链接IDM小工具V1.7(附带源码)
https://www.52pojie.cn/thread-1216514-1-1.html
WinRAR 5.91简体中文 德国官网版 新鲜出炉~
https://www.52pojie.cn/thread-1214424-1-1.html
鉴于篇幅,省略一大堆
```
是不是有点儿感觉了?

## 多页爬取+保存为txt

单页爬取已经会了,多页还会远吗?不过是整合代码罢了

https://www.52pojie.cn/forum.php?mod=guide&view=hot&page=2

网站还是很适合练手的

明晃晃的page=2

![](https://i.loli.net/2020/07/18/e54ij7ymOH9bUJn.png)

一共就四页,所以从一加到四就好啦

自己想就好啦



然后是保存了

python的文件读写特别唬人,叫什么IO编程???

名字劝退啊

我们只需要记住这一行就能糊弄过去

```python
with open('文件名.txt', 'a',encoding='UTF-8') as 随便瞎起个名:
```

详细地自行学习python的io吧

然后既然我们能print,我们就也能write

直接一键剪切就完事
```python
import requests
from bs4 import BeautifulSoup
i = 1
add = 'page=' + str(i)
while i <= 4:
    i = i +1
    html = requests.get('https://www.52pojie.cn/forum.php?mod=guide&view=hot'+add)
    sever = 'https://www.52pojie.cn/'
    soup = BeautifulSoup(html.text, 'lxml')
    get = soup.find('div', class_='tl bm bmw')
    geta = get.find_all('a', class_='xst')
    for x in geta:
      with open('热门.txt','a',encoding='UTF-8') as file:
            file.write(x.string)
            file.write('\n')
            file.write(sever+x.get('href'))
            file.write('\n')
```

'\n'这个是换行符吧~~~~,要不然会挤成一行



来自菜鸟教程的对open模式的解析

| 模式 | 描述                                                         |
| ---- | ------------------------------------------------------------ |
| t    | 文本模式 \(默认\)。                                          |
| x    | 写模式,新建一个文件,如果该文件已存在则会报错。             |
| b    | 二进制模式。                                                 |
| \+   | 打开一个文件进行更新\(可读可写\)。                           |
| U    | 通用换行模式(不推荐)。                                     |
| r    | 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。 |
| rb   | 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。 |
| r\+| 打开一个文件用于读写。文件指针将会放在文件的开头。         |
| rb\+ | 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。 |
| w    | 打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| wb   | 以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
| w\+| 打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。 |
| wb\+ | 以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。 |
| a    | 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| ab   | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。 |
| a\+| 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。 |
| ab\+ | 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。 |

| 模式       | r    | r\+| w    | w\+| a    | a\+|
| ---------- | ---- | ---- | ---- | ---- | ---- | ---- |
| 读         | \+   | \+   |      | \+   |      | \+   |
| 写         |      | \+   | \+   | \+   | \+   | \+   |
| 创建       |      |      | \+   | \+   | \+   | \+   |
| 覆盖       |      |      | \+   | \+   |      |      |
| 指针在开始 | \+   | \+   | \+   | \+   |      |      |
| 指针在结尾 |      |      |      |      | \+   | \+   |

## 加个进度条

看它在那儿运行鬼知道跑成什么样了

tqdm搞起来

```
from tqdm import tqdm
```

tqdm用于哪里呢?

好像用于for的迭代循环

所以前面的while好像就不香了,改吧改吧就能用了

```python
import requests
from bs4 import BeautifulSoup
from tqdm import tqdm
for i in tqdm(range(1,5)):
    add = '&page=' + str(i)
    html = requests.get('https://www.52pojie.cn/forum.php?mod=guide&view=hot'+add)
    sever = 'https://www.52pojie.cn/'
    soup = BeautifulSoup(html.text, 'lxml')
    get = soup.find('div', class_='tl bm bmw')
    geta = get.find_all('a', class_='xst')
    for x in geta:
      with open('热门.txt','a',encoding='UTF-8') as file:
            file.write(x.string)
            file.write('\n')
            file.write(sever+x.get('href'))
            file.write('\n')
```

在目录下生成 热门.txt 目的达到

全文终
MY原文

Ldfd 发表于 2020-7-18 16:39

P810mg 发表于 2020-7-18 16:37
爬一页就报错,
AttributeError: ResultSet object has no attribute 'text'. You're probably treating a ...

证明你没好好读,文中说明过find 和 find_all的区别,find_all爬的是list,当然没有.text

alittlebear 发表于 2020-7-18 12:29

Ldfd 发表于 2020-7-18 11:44
现学现卖,怕忘,感觉你这几天失踪了

咋看出来的。。{:1_896:}

我应该跟论坛很多人一样了,潜水,不过有人回复我我还是会很快答复的(这是个例外,刚才在吃西瓜哈哈,好久没吃了,太甜了)

alittlebear 发表于 2020-7-18 11:40

{:1_896:}大佬还会爬虫呀

Ldfd 发表于 2020-7-18 11:44

alittlebear 发表于 2020-7-18 11:40
大佬还会爬虫呀

现学现卖,怕忘,感觉你这几天失踪了

sandy_seah 发表于 2020-7-18 11:48

厉害厉害,学习了

osl 发表于 2020-7-18 12:19

大一学过

kingbackgo 发表于 2020-7-18 12:27

厉害啊
我也想学

Ldfd 发表于 2020-7-18 12:42

alittlebear 发表于 2020-7-18 12:29
咋看出来的。。

我应该跟论坛很多人一样了,潜水,不过有人回复我我还是会很快答复的(这是 ...

西瓜冻冻更好吃哈哈

Ldfd 发表于 2020-7-18 12:43

kingbackgo 发表于 2020-7-18 12:27
厉害啊
我也想学

照着写一遍就会呃

alittlebear 发表于 2020-7-18 12:53

Ldfd 发表于 2020-7-18 12:42
西瓜冻冻更好吃哈哈

当然哈哈:Dweeqw
页: [1] 2
查看完整版本: [教程向]python爬取吾爱破解热门帖子题目地址,无正则