一个用selenium方法的爬虫案例


'''
## 爬取崔庆才老师的网站,获取电影详情页的地址、片名、类别、封面、评分、剧情
## 最后保存成一个个json文件
'''
from urllib.parse import urljoin
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
import json
from os import makedirs
from os.path import exists

# 设置无头模式
options = webdriver.ChromeOptions()
options.add_argument('--headless')

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
RESULTS_DIR = 'results'

# 定义一个模拟浏览器的webdriver对象browser,再设置等待的时间
# browser = webdriver.Chrome()
browser = webdriver.Chrome(options=options)
wait = WebDriverWait(browser, TIME_OUT)
 
''' 
1、定义一个通用的爬取网址的方法, 包含三个参数: 
   网页地址、页面加载是否成功的条件condition、以及定位器 (元组,定位节点) 
'''
def scrape_page(url, condition, locator):
    logging.info('爬取的网页地址为%s', url)
    try:
        browser.get(url)
        wait.until(condition(locator))
    except TimeoutException:
        logging.error('爬取时发生的错误信息为 %s', url, exc_info=True)

''' 
2、带入参数, 进一步爬取网址列表页的方法, 调用上面的scrape_page方法 
'''
def scrape_index(page):
    # 一个url列表页
    url = INDEX_URL.format(page=page)
    scrape_page(url, condition=EC.visibility_of_all_elements_located,
                locator=(By.CSS_SELECTOR, '#index .item'))

''' 
3、具体解析列表页内容的方法, 解析并生成详情页的URL并以完整地址返回 
'''
def parse_index():
    elements = browser.find_elements(By.CSS_SELECTOR, '#index .item .name')
    for element in elements:
        href = element.get_attribute('href')
        # 用urljoin拼接生成一个详情页地址
        yield urljoin(INDEX_URL, href)

''' 
4、定义一个通用的爬取详情页网页的方法,包含: 
   详情页地址、页面是否加载成功的condition、以及定位
   h2是页面是否加载的标志,成功就出现h2
'''
def scrape_detail(url):
    scrape_page(url, condition=EC.visibility_of_element_located,
                locator=(By.TAG_NAME, 'h2'))

''' 
5、具体解析详情页的方法,包括详情页里面各字段的节点并返回
   然后定制地址, 再用了一系列的CSS选择器,  解析各节点内容并返回
'''
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
    }


''' 
6、保存方法, 保存详情页解析后的信息为json 
'''
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)
def save_data(data):
    # data是字典类型,以键取值
    name = data.get('name')
    # 保存路径
    data_path = f'{RESULTS_DIR}/{name}.json'
    # 把字典类型数据,转换为json数据
    json.dump(data, open(data_path, 'w', encoding='utf-8'),
              ensure_ascii=False, indent=2)

''' 7、主运行程序,     
      把上面方法逐个调用, 从获取列表页到详情页, 
      再把详情页解析出来, 得到的字段保存'''
if __name__ == '__main__':
    try:
        for page in range(1, TOTAL_PAGE + 1):
            # 爬取一页的电影列表, 共十个
            scrape_index(page)
            # 解析出每页的详情页地址
            detail_urls = parse_index()
            # 把详情页汇总为地址列表,再遍历
            for detail_url in list(detail_urls):
                logging.info('得到详情页地址 %s', detail_url)
                scrape_detail(detail_url)
                detail_data = parse_detail()
                logging.info('详情页地址内容 %s', detail_data)
                save_data(detail_data)
    finally:
        browser.close()

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
除了Selenium之外,还有其他一些常用的爬虫框架和工具可以用来实现爬虫案例。其中一些包括: 1. BeautifulSoup:BeautifulSoup是一个Python库,用于从HTML或XML文档中提取数据。它提供了简单而直观的方式来遍历、搜索和修改文档树。与Selenium不同,BeautifulSoup主要用于解析和提取静态网页的数据。 2. Scrapy:Scrapy是一个高级的Python爬虫框架,用于快速、高效地抓取和处理网页数据。它提供了强大的功能,如分布式爬虫、自动限速、数据存储和处理等。相比于Selenium,Scrapy更适合用于大规模和高效率的网页爬取。 3. Requests:Requests是一个简洁而方便的Python库,用于发送HTTP请求。它提供了简单易用的API,可以轻松地进行网页的获取和数据的提取。与Selenium和Scrapy不同,Requests适用于简单的网页抓取和数据提取任务。 4. PyQuery:PyQuery是一个基于jQuery语法的Python库,用于解析和处理HTML文档。它提供了与jQuery类似的API,可以方便地进行网页的解析和数据的提取。与Selenium和Scrapy相比,PyQuery主要用于对静态网页进行解析和提取。 这些都是常用的爬虫框架和工具,根据不同的需求和任务,可以选择合适的工具来实现爬虫案例。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Selenium爬虫实战丨Python爬虫实战系列(8)](https://blog.csdn.net/m0_68103523/article/details/124912564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朝兮暮兮

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值