网络爬虫的详细知识点
基本介绍
什么是网络爬虫
网络爬虫(Web Crawler)是一种自动化程序,用于从互联网上抓取、解析和存储网页数据。其核心功能是模拟人类浏览行为,通过HTTP/HTTPS协议访问目标网站,提取文本、链接、图片或其他结构化信息,常用于搜索引擎索引、数据分析或商业情报收集。
robots.txt
robots.txt 文件的作用
robots.txt 是网站根目录下的一个文本文件,用于告知网络爬虫哪些页面或目录可以被抓取,哪些应被禁止。它遵循 Robots 排除协议(REP),属于行业标准而非法律约束。
robots.txt 的基本语法
User-agent
: 指定适用的爬虫名称(如*
表示所有爬虫)。Disallow
: 禁止访问的路径。Allow
: 允许访问的路径。
示例:
User-agent: *
Disallow: /private/
Allow: /public/
常见规则示例
禁止所有爬虫访问整个网站:
User-agent: *
Disallow: /
允许所有爬虫访问全部内容:
User-agent: *
Disallow:
禁止特定爬虫(如 Googlebot):
User-agent: Googlebot
Disallow: /images/
安装requests库的方法
使用pip安装(推荐)
在命令行或终端中运行以下命令,适用于大多数Python环境:
pip install requests
验证安装
安装完成后,在Python交互环境中运行以下代码确认是否成功:
import requests
print(requests.__version__)
注意事项
- 确保Python环境已配置PATH变量。
- 网络问题可能导致安装失败,可尝试使用国内镜像源(如清华源):
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple
网络爬虫中的
get()
函数get()
是网络爬虫中常用的 HTTP 请求方法,主要用于向服务器请求数据,GET请求是爬虫中最常见和最简单的请求方法,可以直接将URL输入,不需要其他转换,即所有需要请求的信息都包含在URL中。以下是其核心知识点和用法:
基本语法(Python requests 库)
import requestsresponse = requests.get(url, params=None, headers=None, timeout=5)
url
: 目标网页地址params
: 查询参数字典(如{'key1': 'value1', 'key2': 'value2'}
)headers
: 请求头信息(如模拟浏览器访问)timeout
: 超时时间(秒)
get()搜索信息
import requests
r = requests.get('https://www.ptpress.com.cn/search?keyword=word')
print(r.text)
get()添加信息
get()函数中第2个参数params会以字典的形式在url后自动添加信息,需要提前将params定义为字典。
示例代码:
import requests
info = {'keyword':'Excel' }
r = requests.get('https://www.ptpress.com.cn/search',params=info)
print(r.url)
print(r.text)
第2行代码建立字典info,包含一个键值对。
第3行代码使用get()函数获取网页,由于get()中包含参数params,因此系统会自动在url后添加字典信息,形式为https://www.ptpress.com.cn/search?keyword=excel,该使用形式便于灵活设定需要搜索的信息,可以添加或删除字典信息。
第4行代码输出返回的Response对象中的url,即获取网页的url。
response
response对象的基本概念
在爬虫开发中,response
对象通常是HTTP请求后服务器返回的响应封装,包含状态码、响应头、响应体等关键信息。不同库的response
对象结构可能略有差异,但核心功能相似。
response 的属性
response
对象通常用于 HTTP 请求的响应处理,其属性会根据使用的库或框架有所不同。以下是常见场景下的属性说明:
通用 HTTP 响应属性
-
status_code
表示 HTTP 状态码(如 200、404),用于判断请求是否成功。 -
headers
包含响应头的字典,例如Content-Type
或Server
信息。 -
content
以字节形式返回原始响应内容,适用于非文本数据(如图片)。 -
text
将响应内容解码为字符串(自动处理编码),适用于文本数据(如 HTML/JSON)。
设置编码
当访问一个网页时,如果获取的内容是乱码,可以通过设置requests.get(url)返回的Response对象的encoding='utf - 8'来修改“Response对象.text”文本内容的编码方式。同时Response对象中提供了apparent_encoding()方法来自动识别网页的编码方式,不过由于此方法是由机器自动识别,因此可能会存在识别错误的情况(大部分情况下是可用的)。
如果要设置自动识别网页的编码方式,可以使用以下形式:
Response对象.encoding = Response对象.apparent_encoding
示例代码:
import requests
r = requests.get('此处填入\'百度官网地址\'.com')
r.encoding = r.apparent_encoding
print(r.text)
第3行代码设置自动识别网页的编码方式,执行代码后的输出结果中将包含可识别的文字 。
返回网页内容
Response对象中返回网页内容有两种方法,分别是text()方法和content()方法,其中text()方法在前面的内容中有介绍,它是以字符串的形式返回网页内容。而content()方法是以二进制的形式返回网页内容,常用于直接保存网页中的媒体文件。
import requests
r = requests.get('https://cdn.ptpress.cn/uploadimg/Material/978-7-115-41359-8/72jpg/41359.jpg')
f2 = open('b.jpg','wb')
f2.write(r.content)
f2.close()
第2行代码使用get()方法访问了图片url。
第3行代码使用open()函数创建了一个‘b.jpg’文件,并且设置以二进制写入的模式。
第4行代码将获取的url内容以二进制形式写入文件。
执行代码后将在相应文件夹中存储一张图片
代理服务器
代理服务器在爬虫中的作用
代理服务器在爬虫中主要用于隐藏真实IP地址,避免被目标网站封禁或限制访问。通过代理IP发送请求,可以模拟不同地区的用户访问,提高爬虫的稳定性和成功率。
代理服务器的获取方式
- 免费代理:公开的代理IP池,但稳定性差,可用率低。
- 付费代理:提供高可用性和低延迟的代理服务。
如何在爬虫中使用代理
Python的requests
库可以通过proxies
参数设置代理:
import requestsproxies = {"http": "http://10.10.1.10:3128","https": "http://10.10.1.10:1080",
}response = requests.get("http://example.com", proxies=proxies)
print(response.text)
代理服务器的管理
- IP轮换:随机或按策略切换代理IP,避免单一IP被封。
- 速率控制:控制请求频率,减小被封禁的概率。
selenium库驱动浏览器
安装Selenium库
通过pip命令安装Selenium库:
pip install selenium
pip install selenium -i https://pypi.mirrors.ustc.edu.cn/simple/
下载浏览器驱动
根据使用的浏览器下载对应的驱动(以Chrome为例):
- ChromeDriver:从ChromeDriver官网下载与浏览器版本匹配的驱动。
- 其他浏览器:
- Firefox:下载GeckoDriver。
- Edge:下载EdgeDriver。
将驱动文件解压后放入系统路径(如/usr/local/bin
或项目目录)。
基本使用方法
初始化WebDriver并打开浏览器:
from selenium import webdriver# Chrome浏览器示例
driver = webdriver.Chrome(executable_path='path/to/chromedriver')
driver.get("https://www.example.com")
注意事项
- 确保浏览器驱动版本与浏览器版本兼容。
- 使用完毕后调用
driver.quit()
释放资源。 - 显式等待比隐式等待更高效,推荐优先使用。
通过以上方法,可以灵活控制浏览器行为,适用于自动化测试、数据抓取等场景。
驱动浏览器
selenium库支持的浏览器包括Chrome、IE 7~11、Firefox、Opera Edge、HtmlUnit、PhantomJS等,几乎覆盖了当前计算机端和手机端的所有类型的浏览器。在selenium库源代码文件下的webdriver中可查看所有支持的浏览器类型
webdriver的使用形式如下:
webdriver.浏览器类型名()
例如驱动Chrome浏览器的使用方法为webdriver.Chrome(),驱动Opera浏览器的使用方法为webdriver.opera()。每个文件夹中都存在一个webdriver.py文件,当调用webdriver.Chrome()时,会默认调用chrome\webdriver.py文件中的类WebDriver。
webdriver.Chrome()的使用形式如下:
webdriver.Chrome(executable_path = "chromedriver", port = 0, options = None)
功能:创建一个新的Chrome浏览器驱动程序。
参数executable_path:表示浏览器的驱动路径,默认为环境变量中的path,通常计算机中可能存在多个浏览器软件,当没有在环境变量中设置浏览器path时,可以使用参数options。
参数port:表明希望服务运行的端口,如果保留为0,驱动程序将会找到一个空闲端口。
参数options:表示由类Options(位于selenium\webdriver\chrome\options.py)创建的对象,用于实现浏览器的绑定。
示例代码(驱动Chrome浏览器):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
第3、4行代码使用类Options创建了一个对象 chrome_options ,使用 binary_location() 方法绑定了浏览器。
第5行代码使用 webdriver.Chrome() 设置 options 参数值为绑定Chrome浏览器的对象 chrome_options 。
执行代码后将会自动打开Chrome浏览器,实现驱动浏览器的第一步。
注意
该代码中的浏览器安装地址为计算机上Chrome浏览器的安装地址,读者在实践操作时需要使用自己计算机中浏览器的安装地址。可以通过鼠标右键单击浏览器图标,选择快捷菜单中的“属性”选项即可
加载网页
接下来介绍两种常用的加载浏览器网页的方法。
第1种,get()方法。
get()方法用于打开指定的网页
示例代码(加载人民邮电出版社官网中的期刊页):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn//periodical')
第6行代码使用get()方法加载人民邮电出版社官网的期刊页,执行代码后将会自动启动Chrome浏览器并加载出相应网页,结果如图15-33所示。
第2种,execute_script()方法。execute_script()方法用于打开多个标签页,即在同一浏览器中打开多个网页。
功能:打开标签页,同步执行当前页面中的JavaScript脚本。JavaScript是网页中的一种编程语言。
参数script:表示将要执行的脚本内容,数据类型为字符串类型。使用JavaScript语言实现打开一个新标签页的使用形式为 "window.open('网站url','_blank');" 。
示例代码(打开多个标签页):
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn/')
driver.execute_script("window.open('https://www.ptpress.com.cn/login','_blank');")
driver.execute_script("window.open('https://www.shuyishe.com/','_blank');")
driver.execute_script("window.open('https://www.shuyishe.com/course','_blank');")
获取渲染后的网页代码
通过get()方法获取浏览器中的网页资源后,浏览器将自动渲染网页源代码内容,并生成渲染后的内容,这时使用page_source()方法即可获取渲染后的网页代码。
示例代码:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
chrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn/')
print(driver.page_source)
第7行代码使用driver对象中的page_source()方法获取被get()方法获取到的渲染后的网页源代码。
案例
提取关键字为python的图书封面图片:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import requests
import rechrome_options = Options()
chrome_options.binary_location = r"C:\Program Files\Google\Chrome\Application\chrome.exe"
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.ptpress.com.cn/search?keyword=python')
a = re.findall('< img src="(.+?jpg)"></div>', driver.page_source)
i = 1
for url in a:r = requests.get(url)f2 = open('.\\Python图书\\' + str(i) + '.jpg', 'wb')i += 1f2.write(r.content)f2.close()