锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

day10学习 Python爬虫 bs4页面解析

时间:2022-12-15 05:30:00 edg连接器

爬虫

爬虫

(网络数据采集)

程序员应根据程序员的想法编写程序批爬行数据(图片)。音频、视频、数据等)

爬虫的流程

  1. 解析HTML页面
  2. 根据前端语法或正则表达式提取数据
  3. 保存数据

requestsurllibplaywariter

  • requests: 通过网站向服务器发送请求,等待服务器响应结果

    安装 pip install requests

requests的使用

import requests  # URL = 'https://www.bilibili.com/' URL = 'https://https://pvp.qq.com/web201706/index.shtml' # 向B站发送请求,获取B站服务器响应结果 # resp = response(响应) resp = requests.get(url=URL) print(resp)     #  # status_code: 状态码 --> 判断服务器和网页的状态 # 200: 表示程序和服务器正常通信 # 403: 服务器理解客户端的请求,但拒绝了客户端的请求 # 404: 网页丢失 # 500: 服务器崩溃 # print(resp.status_code) # 200  #   

如果网页发生乱码,只需按照页面指定的编码方法解码即可

request默认使用ISO-8869,ASCII

其也能使用服务器所指定的编码方法

resp.p.encoging= 'gbk'  # test: 页面源代码(字符串类型) # print(resp.text, type(resp.text)) #   # UTF-8(万国码、gbk(国标码) # content: 页面源代码(二进制(字节) # b'...' --> 图片、音频、视频 

图片下载

import requests  # URL = 'https://game.gtimg.cn/images/yxzj/cp/a20220530bbztz/cn4_ren.png' # (图片连接地址) URL = 'https://video.pearvideo.com/mp4/adshort/20220614/cont-1765337-15895934_adpkg-ad_hd.mp4'  # (图片连接地址)  response = requests.get(url=URL) if response.status_code == 200:     print(response.content)     # 将图片写入本地文件     # photo = open('1.jpg', 'wb')     video = open('1.mp4', 'wb')     # photo.write(response.content)     video.write(response.content)     # photo.close()     video.close() else:     print(f'状态码:{ 
          response.status_code}')

BeautifulSoup4解析页面

爬虫的伪装

  • headers是给爬虫提供伪装的

  • headers = {} --> headers是一个字典:{key:value}

  • User-Agent --> 将爬虫伪装成浏览器

import requests

URL = 'https://movie.douban.com'
# URL = 'https://101.qq.com/#/hero'
 
# Headers = { 
        
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44'
# }
response = requests.get(url=URL)
print(response)

BeautifulSoup4

BeautifulSoup4 - 根据响应结果解析页面,提取数据

bs4 -> BeautifulSoup4

bs4模块能够从html或者xml中提取数据

网页分为静态网页动态网页

  • 静态页面:内容的写死的,除非人为的进行内容修改,否则这个页面的内容是一成不变的。
  • 动态页面:内容不是写死的,使用某种特殊的技术(JavaScript)使页面中的数据通过某种方式显示在页面中

requests得到的结果是静态页面的结果。(网页源代码
网页的开发者工具elements得到的结果可能是伪代码,是网页完全加载完后的代码,和requests得到的结果可能不一致

BeautifulSoup(网页源码, 解析器) --> 将字符串类型的源代码转换为bs4类型

bs模块提供了一系列提取数据的方法,这些方法的操作对象的**bs4类型的数据**

# requests - 请求页面,得到响应结果
# 写入文件、数据库

import requests
from bs4 import BeautifulSoup

for page in range(1, 11):
    print(f'第{ 
          page}页')
    URL = f'https://www.chinanews.com.cn/scroll-news/news{ 
          page}.html'
    # URL = 'https://101.qq.com/#/hero'
    # headers = {} --> headers是一个字典:{key:value}
    # headers是给爬虫提供伪装的
    # User-Agent --> 将爬虫伪装成浏览器
    Headers = { 
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Safari/537.36 Edg/103.0.1264.44'
    }
    response = requests.get(url=URL, headers=Headers)
    # 如果状态码=200,爬虫可用
    if response.status_code == 200:
        response.encoding = 'utf-8'
        # response.encoding = 'gbk'
        # 打印网页源代码(字符串)
        print(response.text)
        # 为什么要对比打印结果和网页中的内容是否一致?
        """ 网页:分为静态页面和动态页面 """
        soup = BeautifulSoup(response.text, 'html.parser')
        print(soup, type(soup))     # 

select: 根据CSS选择器(标签、class、id等)定位数据,得到的是符合这个选择器的所有结果(整体是列表,列表中每个元素是一个==bs4类型==的数据

select_one: 根据CSS选择器(标签、class、id等)定位数据,得到的是符合这个选择器的一个结果
text: 从bs4类型数据中提取标签内的内容,结果为str

attrs: 从bs4类型数据中提取标签内容属性值,结果为str

	# 接上面的if缩进
	li_list = soup.select('body > div.w1280.mt20 > div.content-left > div.content_list > ul > li')
        # print(li_list)
        for i in li_list:
            # print(i)
            if i.select_one('li > div.dd_lm > a') != None:
                news_type = i.select_one('li > div.dd_lm > a').text  # 调用标签中的内容.text,调用出来是str类型
                # i.select_one('li > div.dd_lm > a') 有内容的提取出来是bs4类型, None为None类型
                # print(news_type)
                news_title = i.select_one('li > div.dd_bt > a').text
                # print(news_title)
                news_href = 'http://www.chinanews.com.cn' + i.select_one('li > div.dd_bt > a').attrs['href']
                # print(news_href)
                new_time = i.select_one('li > div.dd_time').text
                # print(new_time)
                print(news_type, news_title, news_href, new_time
锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章