day10学习 Python爬虫 bs4页面解析

爬虫

爬虫

(网络数据采集)

按照程序员的想法,由程序员自定义规则编写程序批量的爬取数据(图片。音频、视频、数据等)

爬虫的流程

  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)     # <Response [200]>
# 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))       # </html> <class 'str'>
# 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))     # <class 'bs4.BeautifulSoup'>

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

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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python爬虫可以很方便地爬取天气数据。以下是一个简单的示例,可以获取北京市最近7天的天气数据: ```python import requests from bs4 import BeautifulSoup url = 'http://www.weather.com.cn/weather/101010100.shtml' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'} response = requests.get(url, headers=headers) soup = BeautifulSoup(response.content, 'html.parser') weather_list = soup.select('.t .clearfix') for weather in weather_list: date = weather.select('.day')[0].text.strip() condition = weather.select('.wea')[0].text.strip() high_temp = weather.select('.tem .high')[0].text.strip() low_temp = weather.select('.tem .low')[0].text.strip() print(date, condition, high_temp, low_temp) ``` 解释一下代码: 1. 首先,我们需要找到天气数据的来源网站。这里我选择了中国天气网(http://www.weather.com.cn/)。 2. 我们使用 requests 库来向该网站发送 HTTP 请求,并使用 BeautifulSoup 库对返回的 HTML 页面进行解析。 3. 通过分析 HTML 页面,我们可以找到所需的天气数据在 class 为 “t clearfix” 的 div 元素下。我们使用 select 方法选择该元素,并遍历所有天气信息。 4. 对于每一个天气信息,我们可以从 HTML 中找到日期、天气状况、最高温度和最低温度等信息,并进行提取和打印。 以上代码只是一个简单的示例,实际爬取天气数据可能会涉及到更多的数据处理和异常处理。 ### 回答2: Python爬虫可以用来爬取天气数据,通过抓取天气网站上的信息,获取实时或历史天气数据,并进行进一步的分析和处理。 首先,我们需要了解要爬取的天气网站的结构和数据的位置。通常,天气网站会提供API接口或者发布天气数据的HTML页面。我们可以通过分析网页结构,确定需要爬取的数据在源代码中的位置。 接下来,我们可以使用Python中的第三方库,例如requests和BeautifulSoup来实现爬虫功能。使用requests库可以发送HTTP请求,获取网页源代码,而使用BeautifulSoup库可以方便地解析HTML页面,提取需要的数据。 如果网站提供API接口,我们可以直接使用requests库发送GET请求,获取到JSON格式的数据。然后,我们可以使用Python的json库对数据进行解析,并提取出所需的天气信息。 如果网站提供天气数据的HTML页面,我们可以使用requests库获取到页面的源代码,然后使用BeautifulSoup库解析HTML,提取出对应的天气数据。我们可以通过标签名称、CSS选择器或XPath来定位需要的数据。 在获取到天气数据之后,我们可以进一步处理和分析这些数据。例如,我们可以提取温度、湿度、风力等关键信息,并进行数据可视化、统计分析或者机器学习预测。Python中的matplotlib、pandas和scikit-learn等库可以帮助我们进行这些进一步的处理和分析。 总而言之,使用Python爬虫爬取天气数据可以帮助我们获取到所需的天气信息,并进行进一步的分析和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值