*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径。
目录
准备工具:
思路:
具体操作:
调用需要的库:
启动浏览器驱动:
代码主体:
完整代码(解析注释):
准备工具:
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二进制数据);文章来源:https://www.toymoban.com/news/detail-423402.html
write将数据写入文件,encode将数据进行编码文章来源地址https://www.toymoban.com/news/detail-423402.html
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()
到了这里,关于Python爬虫入门:使用selenium库,webdriver库模拟浏览器爬虫,模拟用户爬虫,爬取网站内文章数据,循环爬取网站全部数据。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!