爬虫

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的注释符号: < !-- 内容-- >
  1. 标签
    标签语法:
    <标签名>内容</标签名>
    <!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>
    
  2. 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("加载失败")
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值