Python学习之爬虫基础

发布时间:2023年12月17日


文章声明???

  1. 该文章为我(有编程语言基础,非编程小白)的 Python爬虫自学笔记
  2. 知识来源为 B站UP主(GenJi是真想教会你)的Python爬虫课程视频,归纳为自己的语言与理解记录于此并加以实践,爬取的网站为豆瓣电影一个专门用于联系爬虫的书籍网站,但只用于笔记用途,合法又正规嗷家人们
  3. 关于爬虫,知识基础、概念我都不会记录于此,更多的是记录实践,即以具体实操代码的形式展现给大家
  4. 不出意外的话,我大抵会 持续更新
  5. 想要了解前端开发(技术栈大致有:Vue2/3、微信小程序、uniapp、HarmonyOS、NodeJS、Typescript)与Python的小伙伴,可以关注我!谢谢大家!

让我们开始今天的学习吧!

requests库的基本使用

小尝试

# 导入requests,当然你得确保pip安装了这个库
import requests
# 发送get请求
response = requests.get("http://books.toscrape.com/")
# 输出一下试试
print(response)
# 输出状态码
print(response.status_code)-------------------------------------
<Response [200]>
200

加以判断来完善

# 导入requests
import requests
# 发送get请求
response = requests.get("http://books.toscrape.com/")
# 加以判断完善一下
if response.status_code >= 200 and response.status_code < 400:
    print("可以获取内容")
    print(response)
elif response.status_code >= 400 and response.status_code < 500:
    print("请求失败,客户端错误")
elif response.status_code >= 500:
    print("请求失败,服务器错误")
else:
    print("未知错误")
-------------------------------------
可以获取内容
<Response [200]>

使用response的ok属性来简化上一个例子

# 导入requests,当然你得确保pip安装了这个库
import requests
# 发送get请求
response = requests.get("http://books.toscrape.com/")
# 使用response的ok属性来简化上一个例子
if response.ok:
    print("可以获取内容")
    print(response)
else:
    print("请求失败")
-------------------------------------
可以获取内容
<Response [200]>

使用response的text属性来获取响应体的内容

# 导入requests,当然你得确保pip安装了这个库
import requests
# 发送get请求
response = requests.get("http://books.toscrape.com/")
# 使用response的ok属性来判断
if response.ok:
    print("可以获取内容")
    print(response.text)
else:
    print("请求失败")
-------------------------------------
可以获取内容
<!DOCTYPE html>
<!--[if lt IE 7]>      <html lang="en-us" class="no-js lt-ie9 lt-ie8 lt-ie7"> <![endif]-->
<!--[if IE 7]>         <html lang="en-us" class="no-js lt-ie9 lt-ie8"> <![endif]-->
<!--[if IE 8]>         <html lang="en-us" class="no-js lt-ie9"> <![endif]-->
<!--[if gt IE 8]><!--> <html lang="en-us" class="no-js"> <!--<![endif]-->
    <head>
        <title>
    All products | Books to Scrape - Sandbox
........................(响应体内容太多了,这里就不加以展示了)

requests库的函数帮我们自动生成了请求头的内容,当然我们也可以自己书写请求头,一般自行书写请求头用来把我们的爬虫程序伪装成正常浏览器,pycharm中代码如下:

# 导入requests,当然你得确保pip安装了这个库
import requests
# 自行书写header请求头,对象格式为字典
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
response = requests.get("http://books.toscrape.com/", headers=header)
# 使用response的ok属性来判断
if response.ok:
    print("可以获取内容")
    print(response.text)
else:
    print("请求失败")

BeautifulSoup解析HTML

首先安装bs4这个库,再导入其中的BeautifulSoup这个类,我们先使用它的对象的p属性,来获取第一个p标签以及其子标签的全部内容,pycharm中代码如下:

# 导入requests
import requests
# 从bs4这个库中导入BeautifulSoup这个类
from bs4 import BeautifulSoup
# 自行书写header请求头,对象格式为字典
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
# 获取响应体内容
content = requests.get("https://movie.douban.com/top250", headers=header).text
# BeautifulSoup是个构造函数,我们来创建BeautifulSoup的对象
soup = BeautifulSoup(content,"html.parser")
# 获取第一个p标签以及其子标签的全部内容
print(soup.p)
-------------------------------------
<p class="appintro-title">豆瓣</p>

类似p属性,还有img、h1、div、span等等属性,都是获取HTML中的其第一个标签以及其子标签的全部内容,学过HTML的同学应该大致能明白,这些所谓的属性其实就是HTML中的一个个标签名

使用findAll方法来精准查询,string属性用于只获取标签中的内容,首先我们先尝试着获取一下当前页面每个电影的评分,图片和代码如下:
网页图片

# 导入requests
import requests
# 从bs4这个库中导入BeautifulSoup这个类
from bs4 import BeautifulSoup
# 自行书写header请求头,对象格式为字典
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
# 获取响应体内容
content = requests.get("https://movie.douban.com/top250", headers=header).text
# BeautifulSoup是个构造函数,我们来创建BeautifulSoup的对象
soup = BeautifulSoup(content,"html.parser")
# 获取所有电影的评分,下面findAll方法是用来精准查询符合条件的标签,第一个参数为需要查询的标签名,第二个参数为拿来匹配的属性,是一个字典对象,findAll方法返回的是一个数组
movie_rating = soup.findAll("span",attrs={"class": "rating_num"})
# 遍历
print(movie_rating)
for rating in movie_rating:
    print(rating.string)
-------------------------------------
[<span class="rating_num" property="v:average">9.7</span>, <span class="rating_num" property="v:average">9.6</span>, <span class="rating_num" property="v:average">9.5</span>, <span class="rating_num" property="v:average">9.5</span>, <span class="rating_num" property="v:average">9.4</span>, <span class="rating_num" property="v:average">9.4</span>, <span class="rating_num" property="v:average">9.5</span>, <span class="rating_num" property="v:average">9.4</span>, <span class="rating_num" property="v:average">9.4</span>, <span class="rating_num" property="v:average">9.5</span>, <span class="rating_num" property="v:average">9.4</span>, <span class="rating_num" property="v:average">9.4</span>, <span class="rating_num" property="v:average">9.3</span>, <span class="rating_num" property="v:average">9.2</span>, <span class="rating_num" property="v:average">9.3</span>, <span class="rating_num" property="v:average">9.3</span>, <span class="rating_num" property="v:average">9.2</span>, <span class="rating_num" property="v:average">9.3</span>, <span class="rating_num" property="v:average">9.6</span>, <span class="rating_num" property="v:average">9.2</span>, <span class="rating_num" property="v:average">9.4</span>, <span class="rating_num" property="v:average">9.3</span>, <span class="rating_num" property="v:average">9.3</span>, <span class="rating_num" property="v:average">9.2</span>, <span class="rating_num" property="v:average">9.1</span>]
9.7
9.6
9.5
9.5
9.4
9.4
9.5
9.4
9.4
9.5
9.4
9.4
9.3
9.2
9.3
9.3
9.2
9.3
9.6
9.2
9.4
9.3
9.3
9.2
9.1

其次,find方法可以获取第一个符合条件的标签,我们尝试着获取一下当前页面每个电影的名字,这比评分稍微难一点,图片和代码如下:
网页图片

# 导入requests
import requests
# 从bs4这个库中导入BeautifulSoup这个类
from bs4 import BeautifulSoup
# 自行书写header请求头,对象格式为字典
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
# 获取响应体内容
content = requests.get("https://movie.douban.com/top250", headers=header).text
# BeautifulSoup是个构造函数,我们来创建BeautifulSoup的对象
soup = BeautifulSoup(content,"html.parser")
# 获取所有电影的名字
movie_div_list = soup.findAll("div", attrs={"class": "hd"})
for div in movie_div_list:
    name = div.find("a").find("span").string
    print(name)
-------------------------------------
肖申克的救赎
霸王别姬
阿甘正传
泰坦尼克号
这个杀手不太冷
千与千寻
美丽人生
星际穿越
盗梦空间
辛德勒的名单
楚门的世界
忠犬八公的故事
海上钢琴师
三傻大闹宝莱坞
放牛班的春天
机器人总动员
疯狂动物城
无间道
控方证人
大话西游之大圣娶亲
熔炉
教父
触不可及
当幸福来敲门
寻梦环游记

接下来,我们尝试着获取全部的Top250电影名,pycharm中代码如下:

# 导入requests
import requests
# 从bs4这个库中导入BeautifulSoup这个类
from bs4 import BeautifulSoup
# 自行书写header请求头,对象格式为字典
header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
# 了解到豆瓣电影Top250网址的规律为:
# https://movie.douban.com/top250?start=0&filter=
# https://movie.douban.com/top250?start=25&filter=
# https://movie.douban.com/top250?start=50&filter=
# 创建一个装有25倍数的排行数字的数组
num_list = range(0, 250, 25)
# 循环每一个网页做爬虫
for num in num_list:
    # 获取响应体内容
    content = requests.get(f"https://movie.douban.com/top250?start={num}&filter=", headers=header).text
    # BeautifulSoup是个构造函数,我们来创建BeautifulSoup的对象
    soup = BeautifulSoup(content, "html.parser")
    # 获取所有电影的名字
    movie_name_list = soup.findAll("span", attrs={"class": "title"})
    for span in movie_name_list:
        name = span.string
        if "/" not in name:
            print(name)
-------------------------------------
肖申克的救赎
霸王别姬
阿甘正传
泰坦尼克号
这个杀手不太冷
千与千寻
美丽人生
星际穿越
盗梦空间
辛德勒的名单
楚门的世界
忠犬八公的故事
海上钢琴师
三傻大闹宝莱坞
放牛班的春天
机器人总动员
疯狂动物城
无间道
......(太多了不展示全部了)

我们还需要学习什么呢?

  • 正则表达式:可以根据自己自定义的规则去爬取信息
  • 多线程:让不同线程同时爬取多个页面,增加爬虫的效率
  • 数据库:爬取的数据存储在数据库中
  • 数据分析:爬取的数据拿来分析
文章来源:https://blog.csdn.net/Richieeea/article/details/134950689
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。