【日常点滴012】selenium结合chrom_headless无头浏览器爬取全历史网人物信息

selenium抓取全历史网人物信息

    • 效果预览
    • 代码预览

  • 爬取的是一个很方便的历史信息查询网站 https://www.allhistory.com
  • 本来想做做练习,用requests爬取后练习re正则表达式的,但是由于js动态加载的内容太多了,而且还有加密,精力有限,就用selenium搞了
  • 其实搜别的不是人物的字段也能匹配,只是模糊匹配而已。为了便于归类,对模糊匹配时生成的文件名做了差异处理。
  • 最后是以字典形式在txt文档保存的,以后用的话,将读取到的txt文档数据传入eval()方法可以直接转为字典类型使用就好了
  • 驱动需要下载适合自己谷歌浏览器的版本 下载地址如下各版本驱动镜像下载地 http://npm.taobao.org/mirrors/chromedriver/
  • 【日常点滴012】selenium结合chrom_headless无头浏览器爬取全历史网人物信息_第1张图片

效果预览

【日常点滴012】selenium结合chrom_headless无头浏览器爬取全历史网人物信息_第2张图片

代码预览

# 运行此文件需要先下载安装谷歌的浏览器驱动exe 然后把代码文件和驱动放在一起即可
from selenium import webdriver  # 导入 webdriver
# 要想调用键盘按键操作需要引入keys包 比如 回车和ctrl键
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.by import By
# WebDriverWait 库,负责循环等待
from selenium.webdriver.support.ui import WebDriverWait
# expected_conditions 类,负责条件出发
from selenium.webdriver.support import expected_conditions as EC
import re ,time ,json,os

chrome_options = Options()
chrome_options.add_argument("--headless")  # 设置为无头浏览器
chrome_options.add_argument("log-level=3") # 禁止掉浏览器调试的提示信息 这个网站console.log太多了
driver = webdriver.Chrome(chrome_options=chrome_options)

# 访问目标网址
driver.get("https://www.allhistory.com")

def message(name):
    global search_name  # 存储搜索到的人物名 声明为全局变量后 供函数外的程序使用
    # 等待程序目标网页中的搜索框出现 首次最长等待8秒
    element1 = WebDriverWait(driver, 8).until(
        EC.presence_of_element_located(
            (By.CSS_SELECTOR, '#header-search-box > input'))  # 通过css选择器(标签)查找
    )
    # 向搜索框发送要查询的信息
    element1.send_keys(name)
    # 之后按下回车进行查询
    element1.send_keys(Keys.RETURN)
    # 点击回车后,界面会刷新, 最长等待5秒等待我们要找的详情链接出现,如匹配不到则没有相应keyword-highlight
    try:
        element2 = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located(
                (By.CLASS_NAME, 'node-name-all'))  # 通过类名查找
        )
        if name == element2.text.split('(')[0].strip():
            search_name = name
            print('搜索到的名字为:', element2.text,'匹配一致')
        else:
            print('搜索到的名字为:', element2.text,'不完全匹配')
            search_name = '模糊匹配-&-'+name+'-&-'+element2.text
        element2.click()
    except Exception as e:
        print('没找到')
        raise e

    time.sleep(0.1) # 稍微给打开新窗口争取时间
    driver.close() # 然后关掉不用的窗口 节省资源
    # 点击详情链接后,页面会打开另一个新的窗口,此时我们切换到新窗口去
    s = driver.window_handles # 用来获取窗口信息
    time.sleep(0.2)
    driver.switch_to.window(s[-1])

    # 最长等5秒,待新的窗口内容加载完毕,并拿到搜索结果中的简介内容
    element3 = WebDriverWait(driver, 5).until(
        EC.presence_of_element_located(
            (By.ID, 'entry-comp-Summary'))
    )
    jianjie = element3.text
    # 有时候人物的基础信息会比较多,故意一次显示不全,需要点击查看更多内容
    # 而有时候内容少则不用点击 所以用先获取页面内容再解析的方式 以下代码只是不舍得删。。。
    # driver.find_element_by_class_name('more').click()
    # detail = driver.find_elements_by_class_name('key')
    # detail2 = driver.find_elements_by_class_name('value')
    # 打印数据内容 自己可以测试text方法用于打印所查元素包含的文字内容
    # print('-'*20)
    # print([i.text for i in detail])
    # print('-'*20)
    # print([i.text for i in detail2])

    # 用正则表达式提取关键信息 写这个程序的初衷就是想讲正则,结果网站反爬各种反爬虫
    base_info = re.findall(
        r'(.+?).*?', driver.page_source, re.DOTALL)
    # 以字典的形式把结果返回给调用者 
    return {'简介':jianjie, '基本信息':base_info}


name = '别管我'
while name:
    name = input('\n->直接回车可以退出\n>>请输入你要查询的历史人物名称:')  # 想爬取谁的内容 在这里写名字即可
    if len(name) == 0:
        print('\n>>>欢迎下次使用,再见')
        driver.quit()
        break
    jieguo = message(name)
    print(jieguo)
    # 做一个专门的文件夹存储下载的内容
    if not os.path.exists('personages'):
        os.mkdir('personages')
    with open(f'personages\{search_name}.txt', 'w', encoding='utf8') as file:
        # json.dump(str(jieguo), file)
        file.write(str(jieguo))
    print(f'----{search_name}.txt----保存成功-----')



你可能感兴趣的:(日常点滴心得篇,selenium,python)