Web of Science爬虫[模拟浏览器]

学习了另一位写爬虫的博主
Web of Science爬虫实战(模拟浏览器)
以前只会写静态页面分析,简单构造 url 那种爬虫
从这个实战里接触到了以下知识:

  1. xpath
  2. selenium WebDriver
  3. etree

这里只介绍本文用到的地方

xpath

元素查找方式,使用这种方法几乎可以定位到页面上的任意元素。XPath是XML Path的简称,由于 HTML 文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
关于xpath的参考资料

titleList = tree.xpath("//a[@class='smallV110']/value/text()")  # 文献标题
'''
// 表示绝对路径,全文查找这个标签 通过@定位
'''

webdriver

属于 selenium 体系中设计出来操作浏览器的一套 APIwebdriverpython 的一个用于实现 web 自动化的第三方库。自动化要做的就是模拟鼠标和键盘来操作来操作这些元素,点击、输入、鼠标悬停等等。

    driver = webdriver.Chrome()
    url = 'http://apps.webofknowledge.com/UA_ClearGeneralSearch.do?action=clear&product=UA&search_mode=GeneralSearch&SID=5DWLAqTxJHRNqCCxms5'
    driver.get(url)
    driver.find_element_by_id("clearIcon1").click()  # 点击清除输入框内原有缓存地址
    driver.find_element_by_id("value(input1)").send_keys(keyword)  # 模拟在输入框输入keyword
    driver.find_element_by_xpath("//span[@class='searchButton']/button").click()  # 模拟点击检索按钮
    newurl = driver.current_url  # 新页面
    driver.close()

etree

相当于一个储存节点的树形结构,第一次接触的时候和 BeautifulSoup 库分不清,想当然都是树形结构,其实是有不同侧重点. etree 可以简单理解为一个单纯的数据结构, BeautifulSoup 是一个完整的体系,用来分析页面

先贴代码:

import requests
from lxml import etree
from selenium import webdriver

def geturl(keyword):
    driver = webdriver.Chrome()
    url = 'http://apps.webofknowledge.com/UA_ClearGeneralSearch.do?action=clear&product=UA&search_mode=GeneralSearch&SID=5DWLAqTxJHRNqCCxms5'
    driver.get(url)
    driver.find_element_by_id("clearIcon1").click()  # 点击清除输入框内原有缓存地址
    driver.find_element_by_id("value(input1)").send_keys(keyword)  # 模拟在输入框输入keyword
    driver.find_element_by_xpath("//span[@class='searchButton']/button").click()  # 模拟点击检索按钮
    newurl = driver.current_url  # 新页面
    driver.close()
    return newurl  # 返回新页面

def getHTMLText(url):
    try:
        kv = {'user-agent': 'Mozilla/5.0'}
        r = requests.get(url, headers=kv, timeout=30)
        r.raise_for_status()
        r.encoding = r.apparent_encoding
        return r.text
    except:
        return ""


def parsePage(html):
    try:
        tree = etree.HTML(html)
        titleList = tree.xpath("//a[@class='smallV110']/value/text()")  # 文献标题
        print(titleList)
    except:
        return ""


def main():
    keyword = "big data" #要输入的关键字
    url = geturl(keyword) #获取url
    print(url)
    html=getHTMLText(url)
    parsePage(html)

main()

几个坑点:

  1. 要先下载相应 chrome 版本的 chromedriver.exe,要 ,配置环境变量 ,也可以直接把 chromedriver.exe 放在项目目录下
  2. WOS 貌似维护了一次,改了蛮多代码,那个博主的代码有些不能用了
  3. driver.find_elements_by_id() 和 driver.find_element_by_id() 是两个函数,不能混用
  4. 几个 selenium webdriver 的常见报错,考虑整理一下,要区分 找不到节点 还是 节点出错(已找到)
  5. className不允许使用复合类名做参数 ,比较坑,简单的来说,class里面不能有空格 原文

上面只是爬了一个 titleList 的数据,其他也可以同理想办法得到,但是这种方法实在太慢了,试试 post 的方法

selenium自动化脚本错误总结
Selenium错误提示

猜你喜欢

转载自blog.csdn.net/Joovo/article/details/80042324