介绍使用
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]。 -
在使用网络爬虫的过程中需要对自己的行为进行约束:过快的请求速度会对服务器产生巨大的压力,对正常生产业务产生影响,可能导致法律问题。
-
流程
- 获取网页
- 解析网页
- 存储需要的数据(并分析)
# 环境
- 安装易于使用的网络请求库:
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会帮你节省数小时甚至数天的工作时间.
# 爬虫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 - 网络元素
- 安装Selenium:
WebElement表示DOM元素. 可以通过使用WebDriver实例从文档根节点进行搜索, 或者在另一个WebElement下进行搜索来找到WebElement.
WebDriver API提供了内置方法来查找基于不同属性的WebElement (例如ID, Name, Class, XPath, CSS选择器, 链接文本等).
- Demo:
- 以全屏模式打开http://baidu.com
- 在百度首页输入
Selenium WebDriver自动输入
并进行搜索 - 进入搜索结果页的第一条
- 将第一个搜索结果的网站截图并保存
- 退出浏览器
- 代码
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
网友评论