python爬虫学习笔记
一直没时间学习,终于抽时间学习学习,坑还是很多的
准备
软件准备
1.python 3.x
2.pycharm——最强IDE?
python库准备
1.requests 干啥啥必备,指名道姓urllib你个辣鸡
2.bs4 注:虽然库是Beautiful Soup ,但是鬼知道官方整个bs4还得from import干什么
3.lxml 虽说python内置的解析器已经凑合能用了,但这是优良传统
注:这是一个神奇的库,只需安装,不需引用
4.用不到的selenium(js动态加载必备)
5.tqdm 用于显示进度条,美化用
pip install requests
pip install bs4
pip install lxml
当然还可以用pycharm的库管理器安装,记得提前换个清华/阿里源
ps:官方文档会让你迷茫的时候,看不懂一帮憨憨讲什么的时候,恍然大悟
知识
感觉没什么说的
url——域名
<xxx></xxx>——标签
<xxx>看我</xxx>——看我是元素
<example shuxing="shuxing"></example>——shuxing="shuxing"便是属性,用于爬虫确定标签位置,毕竟谁也不可能就那么一个标签
某些网站会用些实体字符就是形如 &example这种
w3school提供手册
查查更健康
实践
下载网页
这个比较简单,只需要requests就可以实现
比如先爬一下https://www.52pojie.cn/的首页
网站还是比较友好的,没有对新手太过苛刻,但是呢,爬虫也是一样,没事别老整什么多发线程
你以为你cc攻击呐,鸡眼了,有你好果子吃[doge]
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看结构
以下是我个人经验
1.必须找到你所要内容的上一级利用find
2.然后find_all你所找的标签
3.用 元素.string 得到元素
用 元素.get(‘属性’)得到属性
打个比方:
比如你想知道法外狂徒张三所住小区的所有门上的猫眼长什么样
你必须先找到小区
然后再筛选出小区中的单元门
然后再get到猫眼
(糟糕的比喻)
根据以上方法
0.网页下载
import requests from bs4 import BeautifulSoup html = requests.get('https://www.52pojie.cn/forum.php?mod=guide&view=hot') |
0.5使用bs解析
soup = BeautifulSoup(html.text, 'lxml')
|
1.div标签 确定
属性 有 id 和 class 可以二选一,也可以都使用
注意:BeautifulSoup中class为class_ 说是为了避免重复,咱也不知道啊
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 【极限竞速:地平线4 v1.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
一共就四页,所以从一加到四就好啦
自己想就好啦
然后是保存了
python的文件读写特别唬人,叫什么IO编程???
名字劝退啊
我们只需要记住这一行就能糊弄过去
with open('文件名.txt', 'a',encoding='UTF-8') as 随便瞎起个名:
|
详细地自行学习python的io吧
然后既然我们能print,我们就也能write
直接一键剪切就完事
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好像就不香了,改吧改吧就能用了
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 目的达到
全文终
赞赏微信赞赏支付宝赞赏