Python爬虫selenium的使用实例爬取知乎首页数据!

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()

得到的数据结果

此文仅供参考学习的简单代码没有其他博主的深入,小白即可入手,如有错误请指出。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值