手刃一个善意的小爬虫(二),使用bs4解析

bs4简介

bs4是Python的一个第三方库,主要用于从HTML或者是XML文档中快速提取数据。bs4是BeautifuiSoup库的简称,最后的4是版本号。

bs4安装命令为:pip install bs4

安装完毕后,在 Python程序中导入时,可添加代码:from bs4 import BeautifulSoup

函数:

1、find(标签,属性=值):只查找一个

2、find_all(标签,属性=值):查找所有

案例1

需求: 爬取北京新发地市场网站的菜价

网页如下:

页面源代码如下:

操作思路:

1、拿到网页源代码;

2、使用bs4进行解析,拿到数据;

代码如下:

ini 复制代码
from bs4 import BeautifulSoup
import requests

url = "http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml"
resp = requests.get(url)
# print(resp.text)

# 解析数据
# 1.把页面源代码交给BeautifulSoup进行处理,生成bs对象
page = BeautifulSoup(resp.text, "html.parser")  # 指定html解析器:html.parser
# 2.从bs对象中查找数据
# find(标签,属性=值)
# find_all(标签,属性=值)
# table = page.find("table", class_="hq_table")  # class是python的关键字,class_为了区分关键字,否则报错
table = page.find("table", attrs={"class": "hq_table"})  # 意思同上
# 拿到所有的数据行,做切片,做切片的目的是去掉表头
trs = table.find_all("tr")[1:]
for tr in trs:  # 每一行
    tds = tr.find_all("td")  # 拿到每行中的所有列
    name = tds[0].text  # .text表示拿到被标签标记的内容
    low_price = tds[1].text
    avg = tds[2].text
    high_price = tds[3].text
    norms = tds[4].text
    unit = tds[5].text
    date = tds[6].text
    print(name, low_price, avg, high_price, norms, unit, date)

运行结果:

出现以上结果就成功了,我们现在可以把爬取到的数据写入到文件中

增加写入文件后的代码如下:

ini 复制代码
from bs4 import BeautifulSoup
import requests
import csv

url = "http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml"
resp = requests.get(url)
# print(resp.text)
f = open("菜价.csv", mode="w", encoding="utf-8")
csvwriter = csv.writer(f)

# 解析数据
# 1.把页面源代码交给BeautifulSoup进行处理,生成bs对象
page = BeautifulSoup(resp.text, "html.parser")  # 指定html解析器:html.parser
# 2.从bs对象中查找数据
# find(标签,属性=值)
# find_all(标签,属性=值)
# table = page.find("table", class_="hq_table")  # class是python的关键字,class_为了区分关键字,否则报错
table = page.find("table", attrs={"class": "hq_table"})  # 意思同上
# 拿到所有的数据行,做切片,做切片的目的是去掉表头
trs = table.find_all("tr")[1:]
for tr in trs:  # 每一行
    tds = tr.find_all("td")  # 拿到每行中的所有列
    name = tds[0].text  # .text表示拿到被标签标记的内容
    low_price = tds[1].text
    avg = tds[2].text
    high_price = tds[3].text
    norms = tds[4].text
    unit = tds[5].text
    date = tds[6].text
    # print(name, low_price, avg, high_price, norms, unit, date)
    csvwriter.writerow([name, low_price, avg, high_price, norms, unit, date])
print("over!")

运行结果:

案例2

需求:

爬取www.qqtn.com/tp/wmtp_3.h... 这个唯美图片网站上的图片并得到下载地址

主页面网页如下:

主页面的页面源代码如下

子页面网页如下:

子页面的页面源代码如下:

操作思路:

1、拿到主页面的页面源代码,然后提取子页面的链接地址,href;

2、通过href拿到子页面的内容,从子页面中找到图片的下载地址img → src;

3、下载图片;

代码如下:

ini 复制代码
# 1、拿到主页面的页面源代码,然后提取子页面的链接地址,href;
# 2、通过href拿到子页面的内容,从子页面中找到图片的下载地址img → src;
# 3、下载图片;

import requests
from bs4 import BeautifulSoup
import time

url = "https://www.qqtn.com/tp/wmtp_3.html"
header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36"}
resp = requests.get(url=url, headers=header)  # 添加headers处理反爬虫
resp.encoding = "gb2312"  # 处理乱码问题
# print(resp.text)
# 把源代码交给bs
main_page = BeautifulSoup(resp.text, "html.parser")
# 找到包含href的所有a标签
alist = main_page.find("ul", class_="g-gxlist-imgbox").find_all("a")
# print(alist)
for a in alist:
    # print(a.get("href"))  # 直接通过get就可以拿到属性值,打印到控制台可以查看
    href = "https://www.qqtn.com" + a.get("href")  # 直接取到的href是没有域名的,我们需要拼接上域名
    # 拿到子页面的源代码
    child_page_resp = requests.get(url=href, headers=header)
    child_page_resp.encoding = "gb2312"  # 处理乱码问题
    child_page_text = child_page_resp.text
    # 从子页面中拿到图片的下载路径
    chlid_page = BeautifulSoup(child_page_text, "html.parser")
    imglist = chlid_page.find("div", id="zoom").find_all("img")
    for i in imglist:
        # 获取到子页面的所有图片下载地址
        src = i.get("src")
        # 下载图片
        img_resp = requests.get(src)
        img_name = src.split("/")[-1]  # 拿到下载地址中最后一个"/"后面的内容作为图片的名称
        with open("img/" + img_name, mode="wb") as f:
            f.write(img_resp.content)  # img_resp.content 这里拿到的是字节,将图片内容写入到文件
        print("over!", img_name)
        time.sleep(3)  # 因为在循环里面,为了不给服务器造成负担,每完成一次循环延时3秒钟
    print("ALL OVER!!!")

代码运行结果:

备注: 在下载每一个图片的时候,pycharm会默认对每一个文件做索引,图片下载的越多,pycharm就会越慢,针对当前下载的图片,我们没有必要做索引,可以按照下图关闭此文件夹的默认索引。

结语

关于使用bs4解析的爬虫操作就简单说到这里,希望大家加油哦!

如果觉得文章对你有用的话,请留下你的小心心,如果有其他任何问题,请评论区留言哦!

心灵鸡汤:

因为选择,才会错过;因为错过,才会失去;因为失去,才会珍惜;因为珍惜,才会得到......万事万物,循环如戏,不去刻意强求,终是会有因有果。因为心中有爱,你才能被人爱!

相关推荐
kida_yuan2 天前
【从零开始】6. RAG 应用性能压测工具(番外篇)
后端·llm·测试
孤蓬&听雨7 天前
Kafka自动生产消息软件(自动化测试Kafka)
分布式·kafka·自动化·测试·生产者
帅得不敢出门10 天前
Python+Appium+Pytest+Allure自动化测试框架-安装篇
python·appium·自动化·pytest·测试·allure
陈明勇11 天前
自动化测试在 Go 开源库中的应用与实践
后端·go·测试
帅得不敢出门12 天前
Python+Appium+Pytest+Allure自动化测试框架-代码篇
python·appium·自动化·pytest·测试·allure
Dylanioucn12 天前
《解锁 TDD 魔法:高效软件开发的利器》
后端·功能测试·测试·测试驱动开发·tdd
北京_宏哥13 天前
《最新出炉》系列入门篇-Python+Playwright自动化测试-41-录制视频
前端·python·测试
努力的小雨14 天前
新手入门Java自动化测试的利器:Selenium WebDriver
后端·测试
画江湖Test19 天前
pytest 单元框架里,前置条件
python·自动化·pytest·测试·1024程序员节
城下秋草24 天前
AI测试之 TestGPT
测试工具·单元测试·ai编程·测试