Python爬虫

介绍使用 Beautiful Soup抓取静态网页,使用Selenium-WebDriver抓取动态网页

  • Robots协议: robots.txt(统一小写)是一种存放于网站根目录下的ASCII编码的文本文件,它通常告诉网络搜索引擎的漫游器(又称网络蜘蛛),此网站中的哪些内容是不应被搜索引擎的漫游器获取的,哪些是可以被漫游器获取的。因为一些系统中的URL是大小写敏感的,所以robots.txt的文件名应统一为小写。robots.txt应放置于网站的根目录下。如果想单独定义搜索引擎的漫游器访问子目录时的行为,那么可以将自定的设置合并到根目录下的robots.txt,或者使用robots元数据(Metadata,又稱元資料)。
    robots.txt协议并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私。注意robots.txt是用字符串比较来确定是否获取URL,所以目录末尾有与没有斜杠“/”表示的是不同的URL。robots.txt允许使用类似"Disallow: *.gif"这样的通配符[1][2]

  • 在使用网络爬虫的过程中需要对自己的行为进行约束:过快的请求速度会对服务器产生巨大的压力,对正常生产业务产生影响,可能导致法律问题。

  • 流程

    1. 获取网页
    2. 解析网页
    3. 存储需要的数据(并分析)

# 环境

  • 安装易于使用的网络请求库:
    • pip install requests
    • Document: https://requests.readthedocs.io/en/master/user/quickstart/
    • 使用示例
import requests

# post body
body = {
    "ck": '',
    "area_code": "+86",
    "number": "18797811992",
    "analytics": "analytics_log"
}
# 请求头
headers = {
    "Host": "accounts.douban.com",
    "Origin": "https://accounts.douban.com",
    "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36",
    "X-Requested-With": "XMLHttpRequest",
    "Content-Type": "application/x-www-form-urlencoded",
    "Referer": "https://accounts.douban.com/passport/login_popup?login_source=anony",
    "Accept-Language": "zh,en-US;q=0.9,en;q=0.8,zh-CN;q=0.7",
    "Cache-Control": "no-cache",
    "Connection": "keep-alive"
}
# URL参数
params = {
    "k": "v",
    "k2": "v2"
}
# 发送POST请求,设置请求方式,请求地址,请求体,请求头,请求参数,超时时间(单位为秒)
response = requests.post("https://accounts.douban.com/j/mobile/login/request_phone_code", data=body, headers=headers,
                         params=params, timeout=1)
# 相应的编码
print(response.encoding)
# 响应的状态
print(response.status_code)
# 响应的内容,根据头部字符编码进行解码
print(response.text)
# 响应的二进制形式,如读取文件
print(response.content)
# 将响应解析为json
print(response.json())
  • 安装bs4
    • pip install bs4

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.

  • 文档 https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

# 爬虫Demo

# 静态网页爬虫demo:
  • 抓取网站http://www.santostang.com/的文章标题

  • 使用chrom检查模式找到需要抓取的元素的DOM信息,并分析DOM结构

  • 要抓取的网站和元素


    image.png
  • 爬虫代码

import requests
from bs4 import BeautifulSoup

# 请求URL
response = requests.get("http://www.santostang.com")
# 将响应传给bs4
bs = BeautifulSoup(response.text, "html.parser")
# 查找所有class为`article-list-1 clearfix`的article元素
article_list = bs.find_all("article", class_="article-list-1 clearfix")
# 将文本写入到csv文件中
with open("article_title.csv", "a") as article_file:
    for article in article_list:
        # 打印获取到的文本
        title = article.header.h1.a.text
        print(title)
        # 写入
        article_file.write(title + ",")
    article_file.write("\n")
  • 结果


    image.png

    image.png
# 抓取动态网页

和静态网页相比,动态网页的内容并不会出现在HTML源代码中。所以需要使用动态网页抓取技术: 使用Selenium-webDriver模拟浏览器的行为

  • Selenium文档地址: https://www.selenium.dev/documentation/zh-cn/
  • Selenium支持的语言:


    image.png

Selenium 有很多功能, 但其核心是 web 浏览器自动化的一个工具集, 它使用最好的技术来远程控制浏览器实例, 并模拟用户与浏览器的交互。

  • 安装Selenium运行环境
    • 安装Selenium: pip install selenium
    • 安装 WebDriver 二进制文件。要执行项目并控制浏览器,需要安装特定于浏览器的 WebDriver 二进制文件。
      • Selenium 通过使用 WebDriver 支持市场上所有主流浏览器的自动化。 Webdriver 是一个 API 和协议,它定义了一个语言中立的接口,用于控制 web 浏览器的行为。 每个浏览器都有一个特定的 WebDriver 实现,称为驱动程序。 驱动程序是负责委派给浏览器的组件,并处理与 Selenium 和浏览器之间的通信。
    • 根据浏览器和OS下载对应的驱动并进行配置:https://www.selenium.dev/documentation/zh-cn/webdriver/driver_requirements/
      image.png
    • 网络元素

WebElement表示DOM元素. 可以通过使用WebDriver实例从文档根节点进行搜索, 或者在另一个WebElement下进行搜索来找到WebElement.
WebDriver API提供了内置方法来查找基于不同属性的WebElement (例如ID, Name, Class, XPath, CSS选择器, 链接文本等).

  • Demo:
    1. 以全屏模式打开http://baidu.com
    2. 在百度首页输入Selenium WebDriver自动输入并进行搜索
    3. 进入搜索结果页的第一条
    4. 将第一个搜索结果的网站截图并保存
    5. 退出浏览器
  • 代码
from selenium.webdriver import Chrome
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# 实例化驱动程序,并指定驱动程序地址(默认也会取PATH中配的值)
chrome_driver = Chrome(executable_path="/opt/WebDriver/bin/chromedriver")
try:
    url = "http://www.baidu.com"
    # 最大化窗口
    chrome_driver.maximize_window()
    # 打开网站
    chrome_driver.get(url)
    print("当前的URL为:" + chrome_driver.current_url)
    # 等待DOM渲染完成
    # WebDriverWait(chrome_driver).until()
    # 获取input输入框元素
    input_el = chrome_driver.find_element_by_id("kw")
    # 在输入框输入文本
    input_el.send_keys("Selenium WebDriver自动输入")
    # 获取`百度一下`按钮
    search_btn = chrome_driver.find_element_by_id("su")
    # 模拟点击事件
    search_btn.click()
    # 这时候已经到另外一个页面了===========
    # 搜索结果页的输入框
    search_result = chrome_driver.find_element_by_id("kw")
    # 清除数据
    search_result.clear()
    # 等待网页渲染完成,不然可能导致无法查询到想要获取的元素的异常
    WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.TAG_NAME, "a")))
    WebDriverWait(chrome_driver, 5, 0.2).until(EC.presence_of_all_elements_located((By.ID, "1")))
    # 第一条搜索结果
    result_item_1 = chrome_driver.find_element_by_id("1")
    a_link = result_item_1.find_element_by_tag_name("h3").find_element_by_tag_name("a")
    # 根据a标签的href跳转到新的网页
    a_link_href = a_link.get_property("href")
    print("即将跳转的链接地址为:" + a_link_href)
    chrome_driver.get(a_link_href)
    # 刷新
    chrome_driver.refresh()
    # 屏幕截图
    chrome_driver.save_screenshot("./屏幕截图.png")
finally:
    # 退出浏览器
    chrome_driver.quit()
  • 结果:


    g1.gif

你可能感兴趣的:(Python爬虫)