【数据采集】Python爬虫「序」

Python网络爬虫简介



爬取方式

Xpath


Selenium库

  • Selenium是一个用于Web应用程序测试的工具。
  • Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。
  • 支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。
  • 这个工具的主要功能包括:
    • 测试与浏览器的兼容性——测试你的应用程序看是否能够很好得工作在不同浏览器和操作系统之上。
    • 测试系统功能——创建回归测试检验软件功能和用户需求。
    • 支持自动录制动作和自动生成 .Net、Java、Perl等不同语言的测试脚本。

Selenium库 使用方法

  • Selenium库安装:pip install Selenium
  • 浏览器驱动:Selenium打开浏览器需要安装对应的浏览器驱动,不同版本的浏览器驱动版本也不一样,谷歌浏览器使用谷歌驱动,下载驱动时,驱动版本要跟浏览器本身的版本一样或者接近
  • Selenium基本操作(旧):selenium的11种基础操作(元素的定位、操作,浏览器的打开、管理、处理、代理、加载,键盘操作)
  • Selenium基本操作(2024.1):
    • 定位操作
      • 定位一个元素:driver.find_element(By.ID, "cheese")(可以在上一步结果的基础上进一步缩小范围)
      • 定位多个元素:mucho_cheese = driver.find_elements_by_css_selector("#cheese li")
      • 八个内置的元素选择方法(class name、css selector、id、name、link text、partial link text、tag name、xpath)
      • 其他定位法:定位到相邻元素(above()、below()、toLeftOf()、tpRightOf()、near() )
    • 动作操作
      • 定位并输入文本:driver.find_element(By.NAME, "name").send_keys(name)
      • 拖放功能:ActionChains(driver).drag_and_drop(source, target).perform()
      • 点击元素:driver.find_element(By.CSS_SELECTOR, "input[type='submit']").click()
    • 实例化WebDriver:driver = Chrome()
    • 浏览器操作:
      • 打开网页:driver.get("https://selenium.dev")
      • 获取当前网址:driver.current_url
      • 按下浏览器的后退按钮:driver.back()
      • 按下浏览器的前进按钮:driver.forward()
      • 刷新网页:driver.refresh()
      • 读取当前页面标题:driver.title
      • 当打开一个新窗口时,获取该窗口的处理权:driver.current_window_handle
      • 当点击一个链接跳转到新窗口时,需要switch到新窗口
      • 创建新窗口并switch
      • 关闭一个窗口或tab
      • Frames和Iframes,点击iframes中的按钮
      • 退出浏览器:driver.quit()
    • 窗口管理
    • 等待响应
    • JavaScript警报、提示、确认
    • Http代理
    • 网页加载策略
    • Web元素
    • 键盘操作

Chrome Driver

ChromeDriver是配合Selenium库使用的,因为只有安装ChromDriver,才能驱动Chrome浏览器完成响应的操作。

  • 谷歌浏览器驱动下载:
    • Windows版下载地址:https://chromedriver.storage.googleapis.com/index.html
    • Mac版下载地址:https://googlechromelabs.github.io/chrome-for-testing/
  • Windows版下载的ChromeDriver.exe直接丢到python环境Scripts目录中,也可以将chromedriver.exe复制到你的项目中,然后使用相对路径在程序中引用
  • Mac版将下载好的可执行文件移动到/usr/local/bin目录中, 并添加信任授权
# 拷贝
cp chromedriver-mac-arm64/chromedriver /usr/local/bin
 
# 授权
cd /usr/local/bin
xattr -d com.apple.quarantine chromedriver
  • 测试代码
from selenium import webdriver
driver=webdriver.Chrome() #启动谷歌浏览器
driver.get("http://www.zhihu.com") #访问一个网页
driver.quit() #退出浏览器

Selenium爬虫程序

  • selenium模拟用户请求豆瓣电影
from selenium import webdriver

url = "https://movie.douban.com/top250"

# Todo: 获取浏览器对象
browser = webdriver.Chrome()
browser.maximize_window()
browser.get(url)
# print(browser.page_source)

# Todo:搜索(输入+点击+重新输入)
# 查找并输入搜索查询
search_input = browser.find_element("css selector", "#inp-query")
search_input.send_keys("周星驰")

# 点击搜索按钮
search_button = browser.find_element("css selector", "#db-nav-movie > div.nav-wrap > div > div.nav-search > form > fieldset > div.inp-btn")
search_button.click()

# 在页面更改后重新查找搜索输入框
search_input = browser.find_element("css selector", "#inp-query")

# todo: 清除搜索输入框
search_input.clear()

# # 方法一:双击
# ActionChains(browser).double_click(search_input).perform()

# # 方法二:全选
# search_input.send_keys(Keys.CONTROL, "a")
# search_input.send_keys(Keys.DELETE)

# 方法三:js
# browser.execute_script("arguments[0].value = '';", search_input)

# 输入新的搜索查询
search_input.send_keys("刘德华")

# 再次点击搜索按钮
search_button = browser.find_element("css selector", "#db-nav-movie > div.nav-wrap > div > div.nav-search > form > fieldset > div.inp-btn")
search_button.click()

# 关闭浏览器窗口
browser.quit()
  • Selenium模拟用户京东搜索爬取数据存储在 csv文件中
from selenium import webdriver
import csv
import time

url="https://www.jd.com/"
# 1.获取浏览器对象
browser=webdriver.Chrome()
# 2.窗口 最大化
browser.maximize_window()
# 3.请求url
browser.get(url)
# 4.获取文本框并赋值
browser.find_element("css selector","#key").send_keys("男士衣服")
# 5.找到搜索按钮
browser.find_element("css selector","#search > div > div.form > button").click()
# 6.查找所有的li
#J_goodsList > ul > li
#J_goodsList > ul > li:nth-child(2)
#J_goodsList > ul > li:nth-child(3)
# 原因:数据加载时异步加载,所以要等待数据加载完之后再获取
# 单位秒,秒的具体取值跟网速有关系,
time.sleep(2)
li_List=browser.find_element("css selector","#J_goodsList > ul > li")
# 7.循环
i=1
for li in li_List:
    # 8.获取价格
    # selenium提取标签 文本的方法:标签.text
    price=li.find_element_by_css_selector("div > div.p-price > strong > i").text
    # 9.获取标题
    title=li.find_element_by_css_selector("div > div.p-name.p-name-type-2 > a > em") .text
    # 10.获取店铺
    # selenium提取标签属性的方法:标签.get_attribute("属性名")
    store=li.find_element_by_css_selector("div > div.p-shop > span > a").get_attribute("title")
    # 11.将内容写入到csv文件中
    with open("男士衣服.cvs","a",encoding="utf-8",newline="") as file:
        csv.writer(file).writerow([price,title,store])
    print("第{}条下载成功".format(i))
    i+=1

Selenium处理验证码

  • 使用ddddocr库识别验证码
import ddddocr
ocr = ddddocr.DdddOcr()
pngData = browser.find_element(By.CLASS_NAME,"SecurityCode_codeImg__390LE").screenshot_as_png

res = ocr.classification(pngData)
print(res)

yzm_input = browser.find_element(By.CLASS_NAME,"SecurityCode_inputBox__mD9hI")
yzm_input.send_keys(res)

yzm_button = browser.find_element(By.CSS_SELECTOR,"#indexLayout > div.IndexLayout_bodyContainer__mAURt > div > div:nth-child(6) > div > div.adm-mask-content > div > div.SecurityCode_footBox__5_k_V > div.SecurityCode_btnItem__uroav.SecurityCode_mainBtn__Kja7V")
yzm_button.click()


你可能感兴趣的:(【大数据开发】,python,爬虫,开发语言)