本人编程小白,自学了python,在这里分享一下自学爬虫的一些心得,帮助跟我一样的小白少踩坑,同时也是总结一下自己所学。

  1. 爬虫其实就是发送网络请求来获取别人网页的源码,然后在经过数据提取,获取到自己想要的内容。那么首先自然就是发送请求了,python常用的两种库urllib和requests。这里我先讲urllib,urllib是python自带的库,以下是一个基础的爬虫
from urllib.request import urlopen

# 请求的地址
url = 'http://www.baidu.com/'
# 发送请求
resp = urlopen(url)
# 打印响应结果
print(resp.read()) #read()方法用来读取响应的结果

#这样会显示一大堆看不懂类似乱码的东西 因为resp.read()的类型是<class 'bytes'>

#那么需要做一个编码的操作

print(resp.read().decode()[:100]) #decode()默认UTF-8 并且用切片操作截取前100个字符

# 打印结果 <!DOCTYPE html><!--STATUS OK--><html><head><meta http-equiv="Content-Type" content="text/html;charse

可以看到 其实就是获取了百度网页的html代码

  1. urllib其实有多种响应对象
from urllib.request import urlopen

# 定义发送的位置
url = 'http://www.baidu.com/'
# 发送请求
resp = urlopen(url)
# 打印响应数据
print(resp.read()[:100])
# 获取响应码
print(resp.getcode())  # 200
# 获取访问的url
print(resp.geturl())   # http://www.baidu.com/
# 获取响应头信息
print(resp.info())  # 响应头信息包括 Content-Type Cookie等
  1.  当使用urllib.request.urlopen发送请求时,并不能设置请求参数,那么可以将参数封装到一个Request对象中。比如请求头信息User-Agent 这个是能识别你通过什么发送请求的一个东西,为了防止反爬是需要隐藏的比如
from urllib.request import Request,urlopen
url = 'http://httpbin.org/get' #这是HTTP响应测试网站

# 创建Request
req = Request(url)
# 发送请求
resp = urlopen(req)
# 打印结果
print(resp.read().decode())

# {
  "args": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Host": "httpbin.org",
    "User-Agent": "Python-urllib/3.10",
    "X-Amzn-Trace-Id": "Root=1-637cbca6-2bb6514c285f49751a84ce8c"
  }
可以看到 "User-Agent": "Python-urllib/3.10"  这条信息明显就是一条爬虫,那么在爬各大网站的时候别人会直接把你封掉

#那么就需要隐藏User-Agent
from urllib.request import Request,urlopen

# url = 'http://www.baidu.com/'
url = 'http://httpbin.org/get'

# 定义headers信息 user_agent隐藏请求头
headers = {'User-Agent':'Mozilla/5.0 Python666666666'}  #User-Agent可以自定义,当然自定义的肯定不行,这里只是做演示
# 创建Request
req = Request(url)
# 发送请求
resp = urlopen(req)
# 打印结果
print(resp.read().decode())
#{
  "args": {},
  "headers": {
    "Accept-Encoding": "identity",
    "Host": "httpbin.org",
    "User-Agent": "Mozilla/5.0 Python666666666",
    "X-Amzn-Trace-Id": "Root=1-637cbdab-20bad7777fbe830048086836"
  } 可以看到User-Agent已经改变了

User-Agent的设置方式有两种,一种就是使用自己浏览器的开发者工具获取(如有不会的小伙伴可以百度或者私信我),第二种是python有一个三方库可以随机生成不同浏览器的User-Agent这个后面说

  1. 在目前网络获取数据的方式有多种方式:GET方式
    大部分被传输到浏览器的html,images,js,css, ... 都是通过GET
    方法发出请求的。它是获取数据的主要方法
    例如:www.baidu.com 搜索
    Get请求的参数都是在Url中体现的(就是在你的网址中会存在中文),如果有中文,需要转码,这时我们可使用
    urllib.parse.urlencode() 转换键值对
    urllib.parse. quote() 转换一个值
     wd= 后面跟的就是中文爬虫两字 进行了转码
from urllib.request import urlopen,Request
from urllib.parse import quote,urlencode


# UnicodeEncodeError: 'ascii' codec can't encode characters in position 16-17: ordinal not in range(128) 
# 报错提示 url里的参数,不能有中文

#查询参数
args = 'python爬虫'

#采用字符串拼接 quote()方法把中文转码
url = f'https://www.baidu.com/s?wd={quote(args)}'

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

req = Request(url,headers=headers)

resp = urlopen(req)
print(resp.read().decode()[:1500])

#urlencode方法
args ={'wd':'python爬虫'}

#urlencode方法是转换字典形式的数据
url = f'https://www.baidu.com/s?{urlencode(args)}'

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'}
req = Request(url,headers=headers)
resp = urlopen(req)
print(resp.read().decode()[:1500])
  1. 接下来做一个简单网页的爬取  url:https:///yinyue
from urllib.request import Request,urlopen
from time import sleep

def spider_music(_type,page):
    # 构造URL地址
    for num in range(1,page+1):
        if num == 1:
            url = f'https:///yinyue/{_type}'
        else:
            url = f'https:///yinyue/{_type}/p{num}/'
        headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.5005.63 Safari/537.36'}
        # 构造请求对象
        req = Request(url,headers=headers)
        # 发送请求
        resp = urlopen(req)
        # 获取响应
        print(resp.getcode())
        print(resp.geturl())
        # print(resp.read().decode()[:2000])
        # 休眠 防止爬取速度过快对别人服务器造成影响
        sleep(1)
    

if __name__ == '__main__':
    spider_music('minyao',3)

这里需要分析url的构成,如何动态的获取到多页url和想要的音乐属性

暂时总结这么多会持续更新,手敲不易希望多多支持,有问题的可以私信我,大家一起学习