利用python实现查看溧阳的摄影圈

 更新时间:2022年05月17日 11:56:05   作者:​ 梦想橡皮擦   ​  
这篇文章主要介绍了利用python实现查看溧阳的摄影圈,文章基于BeautifulSoup的相关资料展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

前言:

本篇博客继续学习BeautifulSoup,目标站点选取“溧阳摄影圈”,这一地方论坛。

目标站点分析

本次要采集的目标站点分页规则如下:

http://www.jsly001.com/thread-htm-fid-45-page-{页码}.html

代码采用多线程 threading 模块+requests 模块+BeautifulSoup 模块编写。

采取规则依据列表页 → 详情页:

溧阳摄影圈图片采集代码

本案例属于实操案例,先展示完整代码,然后基于注释与重点函数进行说明。

主要实现步骤如下所示:

  • 设置日志输出级别
  • 声明一个 LiYang 类,其继承自 threading.Thread
  • 实例化多线程对象
  • 每个线程都去获取全局资源
  • 调用html解析函数
  • 获取板块主题分割区域,主要为防止获取置顶的主题
  • 使用 lxml 进行解析
  • 解析出标题与数据
  • 解析图片地址
  • 保存图片
import random
import threading
import logging
from bs4 import BeautifulSoup
import requests
import lxml
logging.basicConfig(level=logging.NOTSET) # 设置日志输出级别
# 声明一个 LiYang 类,其继承自 threading.Thread
class LiYangThread(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self) # 实例化多线程对象
        self._headers = self._get_headers() # 随机获取 ua
        self._timeout = 5 # 设置超时时间

    # 每个线程都去获取全局资源
    def run(self):
        # while True: # 此处为多线程开启位置
        try:
            res = requests.get(url="http://www.jsly001.com/thread-htm-fid-45-page-1.html", headers=self._headers,
                               timeout=self._timeout) # 测试获取第一页数据
        except Exception as e:
            logging.error(e)
        if res is not None:
            html_text = res.text
            self._format_html(html_text) # 调用html解析函数

    def _format_html(self, html):
        # 使用 lxml 进行解析
        soup = BeautifulSoup(html, 'lxml')

        # 获取板块主题分割区域,主要为防止获取置顶的主题
        part_tr = soup.find(attrs={'class': 'bbs_tr4'})

        if part_tr is not None:
            items = part_tr.find_all_next(attrs={"name": "readlink"}) # 获取详情页地址
        else:
            items = soup.find_all(attrs={"name": "readlink"})
        # 解析出标题与数据
        data = [(item.text, f'http://www.jsly001.com/{item["href"]}') for item in items]
        # 进入标题内页
        for name, url in data:
            self._get_imgs(name, url)

    def _get_imgs(self, name, url):
        """解析图片地址"""
        try:
            res = requests.get(url=url, headers=self._headers, timeout=self._timeout)
        except Exception as e:
            logging.error(e)
		# 图片提取逻辑
        if res is not None:
            soup = BeautifulSoup(res.text, 'lxml')
            origin_div1 = soup.find(attrs={'class': 'tpc_content'})
            origin_div2 = soup.find(attrs={'class': 'imgList'})
            content = origin_div2 if origin_div2 else origin_div1

            if content is not None:
                imgs = content.find_all('img')

                # print([img.get("src") for img in imgs])
                self._save_img(name, imgs) # 保存图片
    def _save_img(self, name, imgs):
        """保存图片"""
        for img in imgs:
            url = img.get("src")
            if url.find('http') < 0:
                continue
            # 寻找父标签中的 id 属性
            id_ = img.find_parent('span').get("id")

            try:
                res = requests.get(url=url, headers=self._headers, timeout=self._timeout)
            except Exception as e:
                logging.error(e)

            if res is not None:
                name = name.replace("/", "_")
                with open(f'./imgs/{name}_{id_}.jpg', "wb+") as f: # 注意在 python 运行时目录提前创建 imgs 文件夹
                    f.write(res.content)
    def _get_headers(self):
        uas = [
            "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
        ]
        ua = random.choice(uas)
        headers = {
            "user-agent": ua
        }
        return headers
if __name__ == '__main__':
    my_thread = LiYangThread()
    my_thread.run()

本次案例采用中,BeautifulSoup 模块采用 lxml 解析器 对 HTML 数据进行解析,后续多采用此解析器,在使用前注意先导入 lxml 模块。

数据提取部分采用 soup.find() 与 soup.find_all() 两个函数进行,代码中还使用了 find_parent() 函数,用于采集父级标签中的 id 属性。

# 寻找父标签中的 id 属性
id_ = img.find_parent('span').get("id")

代码运行过程出现 DEBUG 信息,控制 logging 日志输出级别即可。![用python看溧阳摄影圈,里面照片非常真

到此这篇关于利用python实现查看溧阳的摄影圈的文章就介绍到这了,更多相关python查看摄影圈内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python字典操作详细介绍及字典内建方法分享

    Python字典操作详细介绍及字典内建方法分享

    这篇文章主要介绍了Python字典操作详细介绍及字典内建方法分享,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • 深入理解Python的jieba模块

    深入理解Python的jieba模块

    这篇文章主要介绍了深入理解Python的jieba模块,英语单词之间是通过空格分隔的,但是中文却不存在空格的概念,因此需要一个模块来解决中文的分词问题,jieba模块是一个python第三方中文分词模块,可以用于将语句中的中文词语分离出来,需要的朋友可以参考下
    2023-11-11
  • Pytorch损失函数torch.nn.NLLLoss()的使用

    Pytorch损失函数torch.nn.NLLLoss()的使用

    这篇文章主要介绍了Pytorch损失函数torch.nn.NLLLoss()的使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 探索Python Slice函数灵活而强大的序列切片技术

    探索Python Slice函数灵活而强大的序列切片技术

    Python中的Slice函数是一种强大且灵活的序列切片技术,用于从字符串、列表、元组等序列类型中提取子集,本文将深入研究Slice函数的功能和用法,提供详细的示例代码和解释,帮助读者更全面地了解和应用这一功能
    2024-01-01
  • python中pytest收集用例规则与运行指定用例详解

    python中pytest收集用例规则与运行指定用例详解

    这篇文章主要介绍了python中pytest收集用例规则与运行指定用例详解,天会讲解一下pytest是如何收集我们写好的用例?我们又有哪些方式来运行单个用例或者批量运行用例呢,需要的朋友可以参考下
    2019-06-06
  • python继承threading.Thread实现有返回值的子类实例

    python继承threading.Thread实现有返回值的子类实例

    这篇文章主要介绍了python继承threading.Thread实现有返回值的子类实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • 高考要来啦!用Python爬取历年高考数据并分析

    高考要来啦!用Python爬取历年高考数据并分析

    转眼间,高考的日子又要来临了,不知道高考学子们准备的怎么样了,今天这篇文章简单且随意地分析一下高考的一些数据,需要的朋友可以参考下
    2021-06-06
  • 探索Python元类与class语句协议掌握类的控制权

    探索Python元类与class语句协议掌握类的控制权

    这篇文章主要介绍了通过Python元类与class语句协议掌握类的控制权探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • python 获取图片分辨率的方法

    python 获取图片分辨率的方法

    今天小编就为大家分享一篇python 获取图片分辨率的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • Python枚举类定义和使用方法

    Python枚举类定义和使用方法

    这篇文章主要介绍了Python枚举类定义和使用方法,文章围绕主题的相关资料展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-05-05

最新评论