本篇文章小编给大家分享一下利用python实现查看溧阳的摄影圈代码示例,文章代码介绍的很详细,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看。
目标站点分析
本次要采集的目标站点分页规则如下:
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日志输出级别即可。
太极熊猫2百度版 安卓版v1.7.1
下载黎明觉醒应用宝版 安卓版v1.111.1
下载暗影格斗3国际版 (Shadow Fight 3)最新版v1.40.3
下载王者战魂华为版 安卓版v3.6.1
下载放置魔法学院免广告版 v2.9.5
放置魔法学院内置Mod菜单是游戏的破解版本,在该版本中为玩家
万乘之国qq版本 安卓版v1.0.5
万乘之国qq版本是一款极具魅力的策略游戏,玩家们可以通过不同
动物餐厅国际服无限内购版 v12.9
动物餐厅国际服免广告版是游戏的破解版本,在该版本中为玩家去除
欧洲卡车司机 安卓版v3.2
欧洲卡车司机是款模拟经营游戏,这款游戏的画面还是蛮逼真的,给
疯狂大酒店 (Grand Hotel Mania)最新中文版v4.10.0.20
疯狂大酒店(Grand Hotel Mania)是一款好玩的