入门爬虫二三记(一):爬取酷狗音乐榜单Top500

http的执行过程

一个HTTP操作称为一个事物,其执行过程分为4个步骤:

  1. 客户端与服务器需要建立连接,如:单机某个超链接,HTTP工作开始。
  2. 建立连接后,客户端发送一个请求给服务器,请求方的格式为:同一资源标识符(URL)、协议版本号,后边是MIME信息,包括请求修饰符、客户机信息和可能的内容。
  3. 服务器接到请求后,给予相应的相应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息,包括服务器信息、实体信息和可能的内容。
  4. 客户端接收服务器所返回的信息,通过浏览器将信息显示在用户的显示屏上,然后客户端和服务器断开连接。

爬虫基本原理

网页请求和响应的过程

  1. Request(请求)。每一个用户打开的网页都必须在最开始由用户向服务器发送访问的请求。
  2. Response(响应)。服务器在接收到用户的请求后,会验证请求的有效性,然后向用户发送相应的内容。

网页请求的方式

  1. GET。最常见的请求方式,一般用于获取或者查询资源信息。
  2. POST。与GET相比,多了以表单形式上传参数的功能,因此除了查询信息之外还可以修改信息。

爬虫工作的基本流程

  1. 发送请求。
  2. 获取相应内容。
  3. 解析内容。
  4. 保存数据。

urllib模块

urllib是URL和lib(library)单词组成。实际上是一个包,里面共有4个模块。

URL的一般格式为(带方括号[]的为可选项):protocol://hostname[port]/path/[; parameters] [?query]#fragment。

URL由以下三部分组成:

  1. 协议。
  2. 存放资源的服务器的域名系统(DNS)主机名或IP地址。
  3. 主机资源的具体地址,如目录和文件名等。

在urllib模块中使用urllib.request.urlopen()函数访问网页,参数为:

urllib.request.urlopen(url,data = None,[timeout,]*,cafile = None,capath = None,cadefault = False,context = None)

例:使用urllib访问目标网页。

import urllib.request
response = urllib.request.urlopen("http://www.jd.com")
html = response.read()
html = html.decode("utf-8") #还原为带中文的HTML代码,对UTF-8编码的bytes对象解码
print(html)

例:使用urllib获取响应信息。

import urllib.request
url = "http://www.baidu.com/"
response = urllib.request.urlopen(url)
print(response.getcode())      #获取当前网页的状态码:200表示网页正常、403表示不正常、404表示失败等。
print(response.geturl())       #获取当前网页的网址
print(response.getheaders())   #返回一个包含服务器响应HTTP所发送的标头

Requests库

Requests是一个基于urllib,采用Apache2 Licensed开源协议的HTTP库。比url方便。

提供的功能包括:keep-alive、连接池、cookie持久化、内容自动解压、HTTP代理、SSL认证、连接超时、Session等很多特性。

例:使用GET方式抓取网页数据。

import requests
url = "http://www.baidu.com"
strhtml = requests.get(url)  #将获取的数据保存到strhtml变量中
print(strhtml.text)          #打印网页源码

例:使用GET方式读取网页数据,并设置超时反应。

import requests
r = requests.get("https://www.163.com/",timeout = 1) 
#timeout并不是整个下载响应的时间限制,而是如果服务器在timeout秒内没有应答,将会引发一个异常。
print(r.status_code)

例:使用Requests库抓取网页图片。

import requests
r3 = requests.get("https://image11.m1905.cn/uploadfile/2021/0323/20210323100410246713.jpg")
with open('C:/Users/14553/Documents/python-spyder/xuanyazhishang.png','wb') as f:
    f.write(r3.content)

基础爬虫框架

G
URL管理器
HTML解析器
HTML下载器
爬虫调度器
数据存储器
  1. 爬虫调度器主要负责统筹其他4个模块的协调工作。
  2. URL管理器负责管理URL链接,维护已经爬取的URL计划外和未爬取的URL集合,提供获取新URL链接的接口。
  3. HTML下载器用于从URL管理器中获取为爬取的URL链接并下载HTML管理器。
  4. HTML解析器用于从HTML下载器中获取已经下载的HTML网页,并从中解析出新的URL链接交给URL管理器,解析出有效数据交给数据存储器。
  5. 数据存储器用于将HTML解析器解析出的数据通过文件或者数据库的形式存储起来。

利用爬虫抓取网页内容

爬取酷狗音乐榜单的TOP500

import requests
from bs4 import BeautifulSoup #解析网页数据
import time #sleep方法可以让程序暂停
import json

headers = {
    'User-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36 Edg/90.0.818.51'
    }   #开发者工具中的user-agent

def get_info(url):
    wb_data = requests.get(url,headers = headers)
    soup = BeautifulSoup(wb_data.text,'lxml')
    ranks = soup.select('span.pc_temp_num')
    titles = soup.select('div.pc_temp_songlist>ul>li>a')
    times = soup.select('span.pc_temp_tips_r>span')
    for rank,title,time in zip(ranks,titles,times):
        with open('C:/Users/14553/Documents/python-spyder/rank-singer.txt','wb') as f:
            data = {
                'rank':rank.get_text().strip(),
                'singer':title.get_text().split('-')[0],
                'song':title.get_text().split('-')[1],  #通过split获取歌手和歌曲的信息
                'time':time.get_text().strip()
                }
            print(data) #获取内容按字典格式打印
            f.write(json.dumps(data).encode())
        
if __name__ == '__main__':
    urls = ['https://www.kugou.com/yy/rank/home/{}-8888.html'.format(str(i)) for i in range(1,24)]
    for url in urls:
        get_info(url)
        time.sleep(1) #睡眠1s

你可能感兴趣的:(爬虫,python,大数据)