上一篇文章中我们介绍了如何使用ChromeDriverManager 来管理ChromeDriver
如何使用ChromeDriverManager 来管理ChromeDriver_friklogff的博客-CSDN博客
本篇文章着重记录爬虫解析与学习过程,测试数据收集与结果处理下一篇我们再说。
请注意,本文中的部分内容来自网络搜集和个人实践,如有任何错误,请随时向我们提出批评和指正。本文仅供学习和交流使用,不涉及任何商业目的。如果因本文内容引发版权或侵权问题,请通过私信告知我们,我们将立即予以删除。
使用ChromeDriverManager可以自动下载匹配Chrome版本的chromedriver,非常方便。
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
def get_answer(question):
# 搜索题目
search_input.send_keys(question)
search_btn.click()
# 等待页面加载完成
WebDriverWait(driver, 10).until()
# 解析页面
soup = BeautifulSoup(driver.page_source, 'html.parser')
# 使用CSS选择器提取题目、答案
question = soup.select('.question')
answer = soup.select('.answer')
# 返回结果
return question, answer
这里使用CSS选择器提取信息,并使用WebDriverWait来等待页面元素加载。
使用openpyxl库读取Excel文件。
wb = openpyxl.load_workbook('questions.xlsx')
sheet = wb['Sheet1']
questions = [cell.value for cell in sheet['A']]
使用xlsxwriter库创建新的Excel文件,并逐行写入结果。
workbook = xlsxwriter.Workbook('results.xlsx')
worksheet = workbook.add_worksheet()
for idx, qa in enumerate(question_answers):
worksheet.write(idx, 0, qa[0])
worksheet.write(idx, 1, qa[1])
workbook.close()
# 初始化
driver = init_driver()
# 读取题目
questions = read_excel()
# 遍历爬取
results = []
for q in questions:
result = get_answer(q)
results.append(result)
# 保存结果
save_to_excel(results)
# -*- coding = utf-8 -*-
"""
# @Time : 2023/7/23 17:26
# @Author : FriK_log_ff 374591069
# @File : pc.py
# @Software: PyCharm
# @Function: 请输入项目功能
"""
import os
import time
import openpyxl
import xlsxwriter
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from collections import namedtuple
class AnswerScraper:
def __init__(self):
# 添加无头模式选项
# options = Options()
# options.add_argument("--headless")
# 获取当前文件所在目录的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 设置驱动下载目录为当前目录下的drivers文件夹
driver_path = os.path.join(current_dir, 'drivers')
# 创建目录 如果存在则跳过创建
os.makedirs(driver_path, exist_ok=True)
# 初始化driver,使用ChromeDriverManager下载匹配Chrome版本的驱动
self.driver = webdriver.Chrome(service=Service(ChromeDriverManager(path=driver_path).install()))
# 简单的测试用例
self.driver.get("https://tiku.baidu.com/buguakewap/browse/index?qid=undefined&limitSwitch=1&limitTimes=3")
# 初始化WebDriverWait对象,用于等待页面元素加载,等待10秒,等页面加载元素
self.wait = WebDriverWait(self.driver, 10)
def get_answer(self, search_question):
# 搜索问题
search_input = self.driver.find_element(By.CSS_SELECTOR,
"body > div.container-index > div.header > div > div.search > input[type=text]")
# 定位搜索框
search_input.click()
search_input.clear()
search_input.send_keys(search_question)
# 在搜索框输入搜索词
search_btn = self.driver.find_element(By.CSS_SELECTOR,
"body > div.container-index > div.header > div > div.search > div")
# 定位搜索按钮
search_btn.click()
# 等待页面加载
self.wait = WebDriverWait(self.driver, 10)
self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,
"body > div.container-index > div.main > div.content > div.quest > div.stem > div > p:nth-child(1) > span")))
# 解析答案
# htmls = self.driver.page_source
quests = self.driver.find_elements(By.CSS_SELECTOR, ".quest")
htmls = ''
questions = ''
answers = ''
img_urls = ''
for quest in quests:
html = quest.get_attribute('outerHTML')
htmls += html
soup = BeautifulSoup(htmls, 'html.parser')
# 提取问题
question = soup.find('div', class_='stem__content').text
questions += question
# 提取答案
answer = soup.find('div', class_='answer__content').text
answers += answer
# 提取图片
try:
img_url = soup.find('img').get('src')
img_urls += img_url
# img_urls.append(img_url)
except:
pass
time.sleep(4)
return [questions, answers, img_urls]
question_file = 'questions.xlsx'
result_file = 'results.xlsx'
# 读取题目
wb = openpyxl.load_workbook(question_file)
sheet = wb['Sheet1']
s_questions = [cell.value for cell in sheet['A'][1:]]
print(s_questions)
# 创建结果文件对象
workbook = xlsxwriter.Workbook(result_file)
worksheet = workbook.add_worksheet()
# 写入题目和答案
i = 0
for que in s_questions:
i += 1
scraper = AnswerScraper()
print(f'正在获取题目"{que}\n"')
result = scraper.get_answer(que)
print(f'正在写入题目"{result[0]}"的答案"{result[1]}{result[2]}\n"')
worksheet.write(i, 0, result[0])
worksheet.write(i, 1, result[1])
worksheet.write(i, 2, result[2])
workbook.close()
通过这个爬虫项目,掌握了如下技能: