1.Selenium简介
Selenium是一个用于测试网站的自动化测试工具,支持各种浏览器包括Chrome、Firefox、Safari等主流界面浏览器,同时也支持phantomJS无界面浏览器。我这里使用的是爬取知乎首页文章列表,因查看源码并不是能爬取的html.且查看数据接口,爬取到的数据不是最新的数据,故而使用该框架进行爬取学习。
PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取
python免费学习资料以及群交流解答点击即可加入
2.安装Selenium&chromdriver.exe
安装Selenium
pip install selenium
下载 chromdriver.exe
我是把下载的文件放置当前python当前目录下建立个目录,因很多人写的是放python安装目录等等,但是如果你吧代码迁移到其他电脑或者服务器上,又得从新下载放置对的目录。我这里在py程序下建立文件夹把三个系统的全部下载好了,使用爬虫只需调用当前函数即可。
下载地址:国内镜像网站地址 官网
如果调用有问题,假如使用谷歌那也许下载谷歌的chromdriver版本对应不上谷歌内核版本,此坑已踩
import sys
def get_driver():
platform = sys.platform
if (platform.startswith('win32')):
return r'./drives/chromedriver.exe'
elif (platform.startswith('darwin')):
return r'./drives/chromedriver_mac64'
else:
return r'./drives/chromedriver_linux64'
browser =webdriver.Chrome(executable_path=get_driver()) #调用Chrome 驱动,生成浏览器对象
测试安装成功与否(此处使用的是谷歌)
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('http://www.7z72.com/')
3.元素定位
根据Id定位
driver.find_element_by_id('box')
返回第一个id属性匹配的元素,如果没有元素匹配,会抛出 NoSuchElementException 异常
根据Name定位
driver.find_element_by_name("username")
返回第一个name属性匹配的元素, 如果没有元素匹配,会抛出 NoSuchElementException 异常
XPath定位 Xpath学习
#id是box的div元素
driver.find_element_by_xpath("//div[@id=box]")
# from下的所有input元素中name是username的子元素
driver.find_element_by_xpath("//from[input/@name='username']")
# id是loginForm的from元素下的第一个input
driver.find_element_by_xpath("//form[@id='loginForm']/input[1]")
# name是username的input元素
driver.find_element_by_xpath("//input[@name='username']")
# type是button并且name是btn的input元素
driver.find_element_by_xpath("//input[@name='btn'][@type='button']")
# id是box的from元素下的第4个input
driver.find_element_by_xpath("//form[@id='box']/input[4]")
使用Xpath可以对页面元素进行觉得定位和相对定位。
链接文本定位超链接
driver.find_element_by_link_text("测试") # 通过完整超链接定位
driver.find_element_by_link_text("www.7Z72.com")
driver.find_element_by_partial_link_text("hao") # 通过部分链接定位
driver.find_element_by_partial_link_text("7z72")
返回第一个文本属性匹配的链接, 如果没有元素匹配,会抛出 NoSuchElementException 异常
根据标签名定位
driver.find_element_by_tag_name('span')
class定位
driver.find_element_by_class_name('text_list')
只返回匹配的第一个,无元素匹配,会抛出 NoSuchElementException 异常
css选择器定位
driver.find_element_by_css_selector('div>span.text')
寻找多个元素(下列方法会返回一个list)
find_elements_by_name
find_elements_by_xpath
find_elements_by_link_text
find_elements_by_partial_link_text
find_elements_by_tag_name
find_elements_by_class_name
find_elements_by_css_selector
私有方法: find_element 和 find_elements
from selenium.webdriver.common.by import By
driver.find_element(By.XPATH,'//button[text()="Some Text"]')
driver.find_elements(By.XPATH,'//button')
Bu类属性:
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag_name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
4.爬取知乎首页文章列表实例
因为查看不了源码(所以实例没有使用解析源码来获取数据),以及爬取json不是最新数据并且只有几条,只能学到此方法
爬取,如果有更多好办法爬取看不到源码的以及数据源有限制的可以交流学习。
该网址数据是页面下拉就会加载数据只需要修改模拟下拉前后时间既可拉取更多数据。如果不设置也就只能拉取固定的几条。
from selenium import webdriver #驱动浏览器
import sys
import time
from selenium.common.exceptions import NoSuchElementException # 定位不到元素错误处理
import json
from fake_useragent import UserAgent
# 随机获取User_Agent
def get_fake_User_Agent ():
ua = UserAgent()
user_anget = ua.random
return user_anget
headers = {
'User-Agent': get_fake_User_Agent()
}
# 识别系统调出chromedriver所在路径
def get_driver():
platform = sys.platform
if ( platform.startswith('win32') ):
return r'./drives/chromedriver.exe'
elif ( platform.startswith('darwin') ):
return r'./drives/chromedriver_mac64'
else:
return r'./drives/chromedriver_linux64'
browser = webdriver.Chrome(executable_path=get_driver()) # 调用Chrome 驱动,生成浏览器对象
try:
browser.get('https://juejin.im/',headers=headers)
time.sleep(5)
browser.execute_script('window.scrollTo(0,document.body.scrollHeight)') # 模拟下拉
time.sleep(2)
items_list = browser.find_elements_by_xpath('//*[@id="juejin"]/div[2]/main/div/div/div/div/div/div/ul/div/li')
result = []
for t in items_list:
data_list = t.text
try:
if t.find_element_by_css_selector(".action-list").text :
data_name = t.find_element_by_css_selector(".user-popover-box").text
data_title = t.find_element_by_css_selector(".title").text
if t.find_element_by_css_selector(".item.like.clickable").text == "":
data_like = 0
else:
data_like = t.find_element_by_css_selector(".item.like.clickable").text
if t.find_element_by_css_selector(".item.comment.clickable").text == "":
data_dislike = 0
else:
data_dislike = t.find_element_by_css_selector(".item.comment.clickable").text
data_link = t.find_element_by_css_selector(".info-row.title-row a").get_attribute("href")
one = {}
one["data_name"] = data_name
one["data_title"] = data_title
one["data_like"] = data_like
one["data_dislike"] = data_dislike
one["data_link"] = data_link
result.append(one)
except NoSuchElementException:
print("没有找到元素!")
print('数据下载完毕')
with open('666666.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(result, indent=2, ensure_ascii=False))
finally:
browser.close()
得到的数据结果
此文仅供参考学习的简单代码没有其他博主的深入,小白即可入手,如有错误请指出。