Python爬虫入门:使用selenium库,webdriver库模拟浏览器爬虫,模拟用户爬虫,爬取网站内文章数据,循环爬取网站全部数据。

*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。

目录

准备工具:

思路:

具体操作:

调用需要的库:

启动浏览器驱动:

代码主体:

 完整代码(解析注释):


准备工具:

Python环境;

安装selenium库;

Python编辑器;

待爬取的网站;

安装好的浏览器;

与浏览器版本相对应的浏览器驱动

思路:

使用Python打开浏览器~~>>进入待爬取的网站~~>>模拟用户点击文章~~>>跳转至文章界面~~>>将文章界面数据保存下来~~>>关闭文章界面~~>>回到原网页~~>>模拟用户点击下一个文章~~>>将第一页全部爬取完毕~~>>模拟用户点击下一页~~>>将所有爬取完毕关闭浏览器.

具体操作:

调用需要的库:

from selenium import webdriver
import time
from selenium.webdriver.common.by import By
# 调用selenium库通过驱动浏览器,完全模拟浏览器的操作,像真正的用户在操作一样。
# webdriver调用驱动
# By是selenium中内置的一个class,在这个class中定位元素

启动浏览器驱动:

下载浏览器驱动:

chrome驱动下载chromedriver.storage.googleapis.com/index.html

浏览器驱动需要放在Python环境变量中

查看Python存放路径

在命令行中输入Python,进入Python中

>>> import sys
>>> sys.path

或者命令行输入where python

driver = webdriver.Chrome()  # 选择自己需要的浏览器驱动进行调用,这里使用的是Chrome驱动
url = ''  # 定义自己需要爬取的网站url
# headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"}
driver.get(url)  # 使用Python打开的浏览器访问网站

代码主体:

range(1,5)设置循环次数为四次

使用selenium隐式等待:

当查找元素或元素并没有立即出现的时候,隐式等待将等待一段时间再查找

find_elements属于selenium中复数的定位元素内容。find_elements主要定位定位页面上多个相同的元素坐标。

By.CSS_SELECTOR  可以通过多个属性(比如有多个class的)进行定位

'.listContent'  包括所有需要爬取的文章

for page in range(1,5):
    time.sleep(1)
    driver.implicitly_wait(8)
    lis = driver.find_elements(By.CSS_SELECTOR,'.listContent')

try做异常处理

try:
    ****
except Exception as e:
    print(e)

find_element定位方法和find_elements其实一样的,只不过多了一个s相当于定位多组

c = li.find_element(By.CLASS_NAME,'article_title')
driver.execute_script('arguments[0].click();',c)
# 模拟用户进行点击,具体查找
# 如果直接使用
# li.find_element(By.CLASS_NAME,'article_title').click()
# 可能会出现查找不到点击对象

由于每次点击都会打开新的标签页,所以需要定义一个初始页

original_window = driver.current_window_handle

切换到新打开的标签页

driver.switch_to.window(driver.window_handles[-1])

保存完毕后切换到初始页

driver.switch_to.window(original_window)

打开文件文件路径;

打开文件,并设置读写权限(w覆盖并写入,b二进制数据);

write将数据写入文件,encode将数据进行编码

get_html = "D:\Python文件\html\{}.html".format(b)
f = open(get_html,'w+b')
f.write(driver.page_source.encode())
    for li in lis:
        try:
            b = li.find_element(By.CLASS_NAME,'article_title span').text
            c = li.find_element(By.CLASS_NAME,'article_title')
            driver.execute_script('arguments[0].click();',c)
            original_window = driver.current_window_handle
            driver.switch_to.window(driver.window_handles[-1])
            time.sleep(1)
            
            get_html = "D:\Python文件\html\{}.html".format(b)
            f = open(get_html,'w+b')
            f.write(driver.page_source.encode())
            f.close()
            driver.close()
            driver.switch_to.window(original_window)
            time.sleep(1)
            
        except Exception as e:
            print(e)

 完整代码(解析注释):

# 调用selenium库通过驱动浏览器,完全模拟浏览器的操作,像真正的用户在操作一样。
# webdriver调用驱动
from selenium import webdriver
import time
# By是selenium中内置的一个class,在这个class中有各种方法来定位元素
from selenium.webdriver.common.by import By

# 将Chrome驱动调用,也可以换成其他浏览器驱动
driver = webdriver.Chrome()

# 将要爬取的网站url
url = ''

# 有些需要headers,有些则不用
# headers = {"User-Agent":" Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"}

# 使用Chrome驱动访问URL
driver.get(url)

# 这里进入循环,因为网站只有五页,所以循环五次;range()中填写想要循环的次数,从一次到n次
for page in range(1,5):
    
    # 刚进入浏览器页面需要睡一秒,网络不稳定可以多等几秒
    time.sleep(1)
    # 进入浏览器缓冲
    driver.implicitly_wait(8)
    # 定义一个函数,查找全部需要爬取的内容
    lis = driver.find_elements(By.CSS_SELECTOR,'.listContent')
    
    # 进入循环,循环爬取lis中的数据
    for li in lis:
        # 有时候会报错,这里做了一个异常处理
        try:
            # 要将文件保存,定义name为爬取文章的名字,.text获取文章链接中的文字
            name = li.find_element(By.CLASS_NAME,'article_title span').text
            # 模拟用户点击进入文章
            c = li.find_element(By.CLASS_NAME,'article_title')
            # 有时候直接.click()会出现找不到数据的情况,这里具体指定一下
            driver.execute_script('arguments[0].click();',c)
            # 因为每次点击都会打开新的标签页,这里定义首页为原标签页
            original_window = driver.current_window_handle
            # 爬取文章数据需要切换进入新标签页
            driver.switch_to.window(driver.window_handles[-1])
            # 等待一秒
            time.sleep(1)
            
            # 定义.html文件路径,文件名为函数name
            get_html = "D:\Python文件\html\{}.html".format(name)
            # 打开文件
            f = open(get_html,'w+b')
            # 将切换后的标签页的数据写入文件
            f.write(driver.page_source.encode())
            # 关闭文件
            f.close()
            # 关闭切换的新标签页
            driver.close()
            # 切换至原标签页
            driver.switch_to.window(original_window)
            time.sleep(1)
        # 异常处理
        except Exception as e:
            print(e)
    # 模拟用户点击下一页,与上一个点击事件原理一样
    r = driver.find_element(By.CLASS_NAME,'btn-next')
    driver.execute_script('arguments[0].click();',r)
# 关闭浏览器
driver.quit()
    

  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠.筱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值