1. 定义
爬虫:使用python程序模拟浏览器向服务器发送请求,接受服务器响应
爬虫与反爬虫:想要获取大量数据,需要频繁的向服务器发请求,当服务器检测到短时间
请求次数过多,会评定为恶意请求,直接封禁IP。
为了解决封禁IP的问题,使用IP代理池,可以频繁更换IP,但IP代理池并不稳定,而且需要付费
爬虫时应尽量规避特大型网站,以一二线网络公司为主
2. 爬虫库安装:
python的爬虫、数据分析、机器学习都需要安装对应的库
pip 是安装爬虫库的工具,,python安装库的管道
爬虫的请求库requests的安装:使用pip安装
方式一、cmd进入命令行界面,输入:pip install requests
方式二、切换到pycharm的终端界面,输入:pip install requests因为是从外网下载的,所以直接输入指令安装可能会失败,多输入几次。
或者使用国内镜像配置:pip install -i https://pypi.tuna.tsinghua.edu.cn/simple requests
3. 示例
import requests #导入爬虫的请求库
# 1.获取请求的url(路径)
url = "https://editor.csdn.net/md/?articleId=107760022"
# 2.使用requests库根据url发请求
response = requests.get(url)
print(response) # <Response [200]> 200:http状态码OK
# 3.response的属性
print(response.status_code) # status_code:获取响应状态码,200表示请求成功
print(response.text) # text:获取响应页面内容,直接获取可能乱码
print(response.content) # content :获取网页的二进制内容
# 网页编码格式查看 :右键—>检查,查看<head>标签内的内容
print(response.content.decode("utf-8")) # 将二进制内容解码为utf-8
# 4. 将网页内容下载到本地,生成html文件
# with open("picture.html", "w", encoding="utf-8") as fileWreit:
# fileWreit.write(response.text)
# 为防止乱码,使用二进制的写方式
with open("picture.html", "wb") as fileWrite:
fileWrite.write(response.content)
# 编写图片匹配的正则表达式
import re #要使用正则表达式,应该先导入正则表达式的库
img = '<img src2="http://pic.sc.chinaz.com/Files/pic/pic9/202009/apic27828_s.jpg" alt="憨憨的狗狗图片">' #当字符串中含有引号,为防止出现错误,应用单引号和双引号做出区别
imgPath = r'<img src2="(.*?)" alt=".*">'
result = re.findall(imgPath,img)
print(result)
with open("picture.html","r",encoding="utf-8") as fileRead:
html_text = fileRead.read() # html的所有内容
result = re.findall(imgPath, html_text) # 根据正则表达式找出图片链接
print(result)
4. 使用正则表达式抓取图片
import re # 正则表达式的库
import requests # 爬虫的请求库
import os # 对文件、文件路径等操作的库
url = "http://sc.chinaz.com/tupian/" # 打算抓取的网页
download = "picture" # 定义本地存放图片的路径
if(not os.path.exists(download)): # python中取反用关键词not 判断路径是否存在
os.mkdir(download) #创建文件夹
response = requests.get(url) # 向目标网页发出一个链接请求,并返回页面内容
imgPattern = r'<img src2="(.*?)" alt=".*">' #通过分析网页html语句,找出所有图片共有的部分,写成正则表达式
imgUrls = re.findall(imgPattern, response.text) # findall找出所有符合正则表达式的文本内容 text 输出html的文本内容
i = 0
for img in imgUrls:
# 下载图片
with open("{}/{}.jpg".format(download, i), "wb") as fileWrite:
# 将图片的二进制内容写到本地文件,生成图片
fileWrite.write(requests.get(img).content)
print("{}张图片下载成功".format(i+1))
i += 1
5.简单的html知识
- HTML称为超文本标记语言,是一种标识性的语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本是由HTML命令组成的描述性文本,HTML命令可以说明文字,图形、动画、声音、表格、链接等
- html的注释符号: < !-- 内容-- >
- 标签
标签语法: <标签名>内容</标签名> <!DOCTYPE html> <!--标识当前文件文档类型--> <html><!--网页根标签--> <head><!--头部标签--> 可以设置网页的编码格式 <meta charset="UTF-8"> 标题标签 <title>标题名</title> css样式 <body><!--内容主体标签(躯干标签)--> 存放所有在网页上显示的内容,例如:文字,图片,音频,视频等等 标题标签: <h1>标题名</h1> h1到h6 分别标识一级标题到六级标题 超链接标签 <a href="链接">链接名称</a> a表示超链接标签 图片标签 <img src="图片路径" alt="" title=""/> img表示图片标签 src:被显示图片路径 alt:图片加载失败时显示的文字 title:鼠标放在图片上时的提示文字 段落标签 <p>内容</p> 可以自动换行,可以设置宽高 换行标签 内容 </br> 网页布局 <div>内容</div> 列表标签 :有序列表(ol)、无序列表(ul)、ol和ul都是多个li组成的 例: <ol> <li>内容</li> <li></li> <li></li> </ol>
- css样式和选择器
CSS样式:层叠样式表:网页美容,字体颜色、大小、宽高 在标签上添加样式 样式分为; 内联样式:直接在标签上写style,在style内写各种样式,style="样式 ",可读性较差 < div style = "color:red;width:200px;height:200px;background-color:black" > 内容 < / div > color width height background - color 内部样式:将样式写入head标签,标签使用时通过选择器绑定添加生效 选择器:id选择器、类(class)选择器、标签选择器 <head> <style type="text/css"> #content{ id选择器以#开头,后跟id名 color:red; width:200px; height:200px; background-color:black } .content2{ 类选择器以点开头,后跟类名 color: red; width: 200 px; height: 200 px; background - color: black } ppp{ 标签选择器,根据标签名添加,页面中所有a标签内容都会生效 color: red; width: 200 px; height: 200 px; background - color: black } </style> </head> 内部样式的使用: <div id = "content" > id选择器内容 < / div > <div class = "content2" > class选择器内容 < / div > <ppp>标签选择器内容<ppp/> 外部样式(不做介绍)
5. 靓汤(beautifulsoup4)库
靓汤是对爬虫库的补充:在cmd界面输入命令下载
Beautiful Soup库是解析、遍历、维护“标签树”的功能库,对应一个HTML/XML文档的全部内容。虽然用Beautiful Soup库解析html简单,但是其匹配效率不高。
主要作用是代替正则表达式,更加方便的检索网页内容
# pip install beautifulsoup4 靓汤库
# pip install html5lib html5解析格式
6. 使用靓汤抓取音频
import requests # 爬虫的请求库
import os # 对文件、文件路径等操作的库
from bs4 import BeautifulSoup # 导入靓汤类
url = "https://www.i4.cn/ring_1_0_1.html"
download = "mp3/"
if(not os.path.exists(download)):
os.mkdir(download)
response = requests.get(url)
if(response.status_code==200): # 检验一下是否能请求成功
# 使用靓汤结合 html5lib 结合解析获取到的网页内容
bs = BeautifulSoup(response.content, "html5lib") # 参数:要解析的网页内容 解析的方式
# 使用bs查找所有音频标签div 1.div标签 2. class=“kbox”
kbox = bs.find("div", attrs={"class": "kbox"}) # 参数: 查找的标签 attrs属性(字典格式)
# 在kbox基础上获取所有存放音频的标签 <div class="list ring_list"> 标识类选择器是 list和ring_list
ring_list = kbox.find_all("div", attrs={"class": "ring_list"})
# find :只返回第一个满足条件的标签
# find_all::查询所有满足条件的标签
for ring in ring_list:
# 在ring中查找歌曲名的标签 div标签 title类标签
titleDiv = ring.find("div", attrs={"class": "title"})
# 获取歌曲名称
# 方法一:获取标签title属性中的歌曲名
title1 = titleDiv.get("title")
print(title1)
# 方法二:获取标签的文本内容
title2 = titleDiv.text
# 获取音频标签,提取音频路径
mp3Url = ring.find("div", attrs={"class": "audio_play"}).get("data-mp3")
# 下载音频,
with open(download+title1+".mp3","wb") as fileWrite:
fileWrite.write(requests.get(mp3Url).content)
print(title1+"下载完成")
else:
print("加载失败")