Python爬虫入门教程,轻松学习网络爬虫技术

目录

(一)概述

(二)获得HTML

requests模块

获取headers

(三)爬取数据

正则表达式

 re模块

正则提取

(四)保存数据

(五)实践-爬取B站top100


(一)概述

        网页中的信息,大部分会出现在网页的源代码中,而爬虫的本质,就是从网页的源代码中爬取所需要的信息。

        具体步骤可以概括为:伪装成User-Agent向网页服务器发送请求,获得响应,将响应解析成HTML源代码,再通过正则表达式等匹配手段提取出位于源代码中的特定信息,再将所提取的信息保存到Excel或数据库中,供数据可视化和数据分析使用。

        欲实现以上步骤,我们需要导入re、bs4、requests(或者urllib.request)、xlwt和sqlite3模块,它们的功能如下:

# 向服务器发送请求并解析响应(following2选1)
import urllib.request  
import requests

# 定位信息,匹配信息 
from bs4 import BeautifulSoup  # 定位标签
import re  # 进行正则匹配

# 保存数据
import xlwt  # 保存到Excel
import sqlite3  # 保存到数据库

(二)获得HTML

requests模块

        我们以requests模块举例,urllib模块中也有同样功能的方法。在requests模块中,我们可以使用get方法来向服务器发送请求并返回响应,再通过text方法将响应解析成HTML。在get方法中,我们主要需要的参数是URL(网址)和headers(用于伪装成浏览器)。我们以爬取b站top100举例:

import requests


url = 'b站排行榜网址'
head = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/104.0.5112.81 '
                  'Mobile Safari/537.36 '
                  'Edg/104.0.1293.54'
} # 获取方法看下文

response = requests.get(url, headers=head)
print(response.text)

输出为网页的HTML代码:

 (在终端中HTML代码会堆在一起,很难看,可以单独创建一个HTML文件拷贝进去)

获取headers

        打开任意浏览器,进入开发者页面,找到Netwrok,在其中找到headers,再找到User-Agent,复制其中信息(粘贴到代码中时注意删去多出来的空格)。

 headers的作用在于使用我们浏览器的信息,将请求伪装成是浏览器发出的。

(三)爬取数据

我们所能爬取的信息,就在网页的源代码中,网址,标题,up主,播放量,评论数等:

我们可以用正则表达式来提取其中的数据,下面简单介绍正则表达式和re模块。

正则表达式

        正则表达式即使用.*?等字符来匹配字符串,我们可以使用开源中国中的“在线正则表达式测试”来学习正则表达式。

在线正则表达式测试 (oschina.net)

 上图为在“我的学号是10086,她的学号是10010”中搜索“100”,我们可以看到它返回了两个结果,就是10086和10010开头的那两个100。

我们将正则表达式改成“\w”,其表示英文字母a到z,A到Z,数字0到9和下横线:

 我们可以看到,它匹配出了10个数字。

\w”其实就是我们在账号注册时经常提示的只能输入大写字母、小写字母、数字和下横线的由来。

常见正则表达式如下图:

在爬虫中,我们主要需要知道.*?组合的意义:

.*?表示惰性匹配,即匹配从.*?左边到.*?右边符合的最短的字符串:

 我们可以看到,“她是”后面出现了两个“朋友”,而.*?表示匹配出的是其中最短的字符串。

相反,去掉问号则为贪婪匹配,匹配最长的字符串:

 re模块

        re模块的功能是用正则表达式来匹配字符串,其中常用的方法有findall、finditer、compile和sub:

flag = re.findall('aaa', 'waaafwaefaaa')
print(flag)

flag = re.finditer('aaa', 'waaafwaefaaa')
print(flag)

findall返回所有匹配的字符串构成的列表,而finditer返回迭代类型。

pattern = re.compile(r'aaa')
flag = pattern.finall('waaafwaefaaa')

使用compile可以提前设置正则表达式,其在正则表达式很长的时候适用。

正则提取

        在re中,把.*?用括号括起来表示只提取括号里的内容,故可限制其左右字符从而达到定向提取的效果。我们拿一段HTML举例:

import re

html = 'target="_blank" class="title">【原神剧场】少年意气,如清风,如明月</a> ' \
       '<div class="detail"><a target="_blank" href="' \
       '11742550"><span class="data-box up-name"><img src="//s1.hdslb.com/bfs' \
       '/static/jinkela/popular/assets/icon_up.png" alt="up">哈米伦的弄笛者</span>' \
       '</a> <div'

pattern = re.compile(r'class="title">(.*?)</a>')  # 将需要提取的地方换成(.*?)
message = pattern.findall(html) 
print(message)

 只要找准需提取内容的前后字符串,就可以使用(.*?)将其提取,无论HTML多长。

补充:字符串前加r表示忽略转义字符。

(四)保存数据

     提取出数据后,我们可以将其保存到Excel或者数据库,我们以保存到Excel举例,需要使用到xlwt模块:

import xlwt


# 创建一个workbook对象
workbook = xlwt.Workbook(encoding='utf-8')
# 创建工作表
worksheet = workbook.add_sheet('BilBil-Top100') # 参数为工作表名字
# 写入数据
worksheet.write(a, b, c) # a为行,b为列,c为写入的内容
# 保存工作表
workbook.save(savepath) # savepath为保存地址

(五)实践-爬取B站top100

        只要分析找到需提取内容在HTML代码中的规则,就可以使用正则表达式将其提取,我们可以单独创建一个HTML文件用于存放网页的源代码,便于观察规则。使用(?P<group>.*?)可以将提取的内容直接分组,可使用group方法直接调用提取的内容。下面我们以爬取b站排行榜举例:

import re
import requests
import xlwt


url = "b站排行榜网址"
head = {
    'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) '
                  'AppleWebKit/537.36 (KHTML, like Gecko) '
                  'Chrome/104.0.5112.81 '
                  'Mobile Safari/537.36 '
                  'Edg/104.0.1293.54'
}

pattern = re.compile(r'<div class="info"><a href="//(?P<link>.*?)".*?target="_blank" class="title">'
                     r'(?P<title>.*?)</a>.*?alt="up">(?P<up_name>.*?)</span></a>.*?alt="play">'
                     r'(?P<play_nums>.*?)</span>.*?alt="like">(?P<commend_nums>.*?)</span>', re.S)


# 初始化用于储存的列表
data = []
data_list = []

response = requests.get(url, headers=head)
html = response.text

message = pattern.finditer(html)
for item in message:
    data.append(item.group("title").strip())
    data.append(item.group("up_name").strip())
    data.append(item.group("play_nums").strip())
    data.append(item.group("commend_nums").strip())
    data.append(item.group("link").strip())
    data_list.append(data)
    data = []

# 创建一个workbook对象
workbook = xlwt.Workbook(encoding='utf-8')

# 创建一个工作表
worksheet = workbook.add_sheet('BilBil TOP')

col = ('标题', 'up主', '播放量', '评论数', '链接')

for i in range(5):
    worksheet.write(0, i, col[i])

for i in range(100):
    for j in range(5):
        worksheet.write(i+1, j, data_list[i][j])

workbook.save('C:/Users/29564/BilBil-Top100.xls')

参考视频:

Python课程天花板,Python入门+Python爬虫+Python数据分析5天项目实操/Python基础.Python教程_哔哩哔哩_bilibili2021年最新Python爬虫教程+实战项目案例(最新录制)_哔哩哔哩_bilibili 

物联沃分享整理
物联沃-IOTWORD物联网 » Python爬虫入门教程,轻松学习网络爬虫技术

发表评论