开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 29199|回复: 0
收起左侧

[源码分享] Python实例记录----Selenium爬取实战

[复制链接]
结帖率:50% (3/6)
发表于 2022-3-13 16:22:22 | 显示全部楼层 |阅读模式   河北省邢台市
[Python] 纯文本查看 复制代码
import json

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
import logging
from urllib.parse import urljoin
from os import makedirs
from os.path import exists

logging.basicConfig(level=logging.INFO,
                    format='%(asctime)s - %(levelname)s: %(message)s')  # 日志配置

INDEX_URL = 'https://spa2.scrape.center/page/{page}'  # 电影列表页面
TIME_OUT = 10  # 等待时长
TOTAL_PAGE = 10  # 页数

browser = webdriver.Chrome()  # 初始化浏览器
wait = WebDriverWait(browser, TIME_OUT)  # 配置页面加载最长等待时间


def scrape_page(url, condition, locator):  # 定义通用爬取方法
    logging.info('scraping %s', url)
    try:
        browser.get(url)
        wait.until(condition(locator))  # 等待
    except TimeoutException:  # 报错处理
        logging.error('error occurred while scraping %s', url, exc_info=True)


def scrapge_index(page):
    url = INDEX_URL.format(page=page)  # 完善url
    scrape_page(url, condition=EC.visibility_of_all_elements_located,  # 元素可见方法
                locator=(By.CSS_SELECTOR, '#index .item'))  # CSS定位元素


def scrape_detail(url):
    scrape_page(url, condition=EC.presence_of_element_located,
                locator=(By.TAG_NAME, 'h2'))


def parse_detail():
    url = browser.current_url  # 获取当前链接
    name = browser.find_element_by_tag_name('h2').text
    categories = [element.text for element in browser.find_elements_by_css_selector('.categories button span')]
    cover = browser.find_element_by_css_selector('.cover').get_attribute('src')
    score = browser.find_element_by_class_name('score').text
    drama = browser.find_element_by_css_selector('.drama p').text
    return {
        'url': url,
        'name': name,
        'categories': categories,
        'cover': cover,
        'score': score,
        'drama': drama
    }


def parse_index():  # 获取电影详情链接
    elements = browser.find_elements_by_css_selector('#index .item .name')
    for element in elements:
        href = element.get_attribute('href')
        yield urljoin(INDEX_URL, href)


RESULTS_DIR = 'results'  # 定义目录

exists(RESULTS_DIR) or makedirs(RESULTS_DIR)  # 确定路径在不在,没有新建


def save_data(data):  # 储存
    name = data.get('name')
    data_path = f'{RESULTS_DIR}/{name}.json'
    json.dump(data, open(data_path, 'w', encoding='utf-8'), ensure_ascii=False, indent=2)


def main():
    try:
        for page in range(1, TOTAL_PAGE + 1):
            scrapge_index(page)
            detail_urls = parse_index()
            for detail_url in list(detail_urls):
                logging.info('get detail url %s', detail_url)
                scrape_detail(detail_url)
                detail_data = parse_detail()
                save_data(detail_data)
                logging.info('detail data %s', detail_data)
    finally:
        browser.close()


if __name__ == '__main__':
    main()

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表