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
### 使用Python爬虫抓取Boss直聘网页的数据 为了实现这一目标,可以采用Selenium和BeautifulSoup相结合的方式来进行数据采集。整个过程分为几个部分处理,以便在出现问题时不必重头再来。 #### 获取岗位列表页面链接 首先通过Selenium模拟浏览器行为访问Boss直聘网站,并定位到具体的招聘板块。由于网站可能具有反爬机制,因此建议设置合理的请求间隔时间以降低被封禁的风险[^1]。 ```python from selenium import webdriver import time options = webdriver.ChromeOptions() driver = webdriver.Chrome(options=options) url = 'https://www.zhipin.com/job_detail/' driver.get(url) time.sleep(3) # 等待页面加载完成 ``` #### 提取单个岗位详情链接 接着解析当前页面HTML结构,提取出每条招聘信息中的`href`属性作为跳转至详细信息页的URL路径。这里需要注意的是,某些情况下这些链接可能是相对地址形式,需拼接成绝对URL才能正常打开。 ```python from bs4 import BeautifulSoup soup = BeautifulSoup(driver.page_source, 'html.parser') job_links = [] for item in soup.select('.info-primary a'): job_link = f"https:{item['href']}" job_links.append(job_link) ``` #### 遍历各岗位详情页获取更多信息 有了上述收集好的链接之后,就可以逐一进入每一个职位的具体介绍界面进一步挖掘所需资料了。这一步同样依赖于Selenium来动态加载内容,随后借助BeautifulSoup做DOM树解析工作,最终得到诸如公司名称、薪资待遇等重要参数。 ```python jobs_data = [] for link in job_links[:10]: # 只遍历前十个链接用于测试目的 driver.get(link) time.sleep(2) detail_soup = BeautifulSoup(driver.page_source, 'html.parser') title = detail_soup.find('h1').text.strip() or None salary_range = detail_soup.select_one('.salary') and \ detail_soup.select_one('.salary').text.strip() or None jobs_data.append({ 'title': title, 'salary_range': salary_range, # 更多字段... }) ``` #### 处理特殊格式的时间字符串 针对一些非标准格式的时间戳(如“发布于昨天”),可以通过简单的逻辑判断将其转换为更易于理解和比较的形式[^5]。 ```python from datetime import datetime, timedelta def parse_time(time_str): today = datetime.now().date() if '今天' in time_str: return str(today) elif '昨天' in time_str: yesterday = (today - timedelta(days=1)) return str(yesterday) else: try: date_obj = datetime.strptime(time_str.split(' ')[-1], '%H:%M') current_year_month_day = datetime.combine(today, date_obj.time()) return str(current_year_month_day.date()) except ValueError as e: print(f"无法解析时间 {time_str}: ", e) return '' ``` 以上就是基于Python编写的简单版Boss直聘爬虫程序的主要流程概述。当然,在实际开发过程中还需要考虑更多细节问题以及异常情况下的错误处理措施。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值