学习了另一位写爬虫的博主
Web of Science爬虫实战(模拟浏览器)
以前只会写静态页面分析,简单构造 url 那种爬虫
从这个实战里接触到了以下知识:
- xpath
- selenium WebDriver
- etree
这里只介绍本文用到的地方
xpath
元素查找方式,使用这种方法几乎可以定位到页面上的任意元素。XPath是XML Path的简称,由于 HTML 文档本身就是一个标准的XML页面,所以我们可以使用XPath的语法来定位页面元素。
关于xpath的参考资料
titleList = tree.xpath("//a[@class='smallV110']/value/text()") # 文献标题
'''
// 表示绝对路径,全文查找这个标签 通过@定位
'''
webdriver
属于 selenium 体系中设计出来操作浏览器的一套 API,webdriver 是 python 的一个用于实现 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()
几个坑点:
- 要先下载相应 chrome 版本的 chromedriver.exe,要 ,配置环境变量 ,也可以直接把 chromedriver.exe 放在项目目录下
- WOS 貌似维护了一次,改了蛮多代码,那个博主的代码有些不能用了
- driver.find_elements_by_id() 和 driver.find_element_by_id() 是两个函数,不能混用
- 几个 selenium webdriver 的常见报错,考虑整理一下,要区分 找不到节点 还是 节点出错(已找到)
- className不允许使用复合类名做参数 ,比较坑,简单的来说,class里面不能有空格 原文
上面只是爬了一个 titleList 的数据,其他也可以同理想办法得到,但是这种方法实在太慢了,试试 post 的方法