【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 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

包括:Python激活码+安装包、Python web开发,Python爬虫,Python数据分析,Python自动化测试学习等教程。带你从零基础系统性的学好Python!

一、Python学习大纲

Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

二、Python必备开发工具

在这里插入图片描述

三、入门学习视频

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。在这里插入图片描述

五、python副业兼职与全职路线

在这里插入图片描述

上述这份完整版的Python全套学习资料已经上传CSDN官方,如果需要可以微信扫描下方CSDN官方认证二维码 即可领取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值