爬虫(Web Crawler)是指一种可能主动从互联网上获取数据的程序。它能够主动拜访并抓取互联网上的网页,并从中提取数据。爬虫技术被广泛应用于搜索引擎、数据挖掘、信息处理等畛域。
在 Python 中,咱们能够应用第三方库 requests 和 BeautifulSoup 来编写爬虫程序。上面,咱们将一步步学习如何应用这两个库来编写爬虫程序。
一、入门
1. 装置 requests 和 BeautifulSoup 库
咱们首先须要装置 requests 和 BeautifulSoup 库。能够应用以下命令进行装置:
pip install requests
pip install beautifulsoup4
2. 应用 requests 库发送申请
咱们能够应用 requests 库中的 get() 办法来发送 HTTP GET 申请,并取得响应。例如,以下代码能够获取百度首页的 HTML 内容:
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print(response.text)
3. 解析 HTML 内容
咱们能够应用 BeautifulSoup 库来解析 HTML 内容。例如,以下代码能够获取百度首页的题目:
import requests
from bs4 import BeautifulSoup
url = 'https://www.baidu.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
title = soup.title.string
print(title)
4. 获取链接
咱们能够应用 BeautifulSoup 库来获取 HTML 内容中的链接。例如,以下代码能够获取百度首页的所有链接:
import requests
from bs4 import BeautifulSoup
url = 'https://www.baidu.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
links = []
for link in soup.find_all('a'):
links.append(link.get('href'))
print(links)
5. 存储数据
咱们能够应用 Python 中的文件操作来存储数据。例如,以下代码能够将获取到的链接存储到一个文本文件中:
import requests
from bs4 import BeautifulSoup
url = 'https://www.baidu.com'
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
links = []
for link in soup.find_all('a'):
links.append(link.get('href'))
with open('links.txt', 'w') as f:
for link in links:
f.write(link + '\n')
到这里,咱们曾经学会了应用 Python 编写爬虫的根本步骤。当然,理论的爬虫程序可能会更加简单,须要思考一些非凡状况和解决形式。然而,把握了上述根本步骤,咱们就能够编写一些简略的爬虫程序了。
二、进阶
上面我将具体介绍
1. 如何应用 requests 和 BeautifulSoup 库来解析动静页面;
2. 如何应用正则表达式来解析 HTML 内容;
3. 如何应用 Selenium 库模仿浏览器操作来爬取动静网站的数据;
4. 如何解决 JavaScript 加载的数据;
1. 如何应用 requests 和 BeautifulSoup 库来解析动静页面;
1.1 网页动静加载
有些网页是通过 JavaScript 动静加载数据的,也就是说,当咱们拜访网页时,网页会通过 AJAX 技术向后端服务器申请数据,并将数据插入到网页中。这种网页无奈间接应用 requests 库来获取残缺的 HTML 内容。
1.2 解析动静页面
为了解析动静页面,咱们须要应用模仿浏览器的形式来获取残缺的 HTML 内容。这里,咱们能够应用第三方库 selenium 和 BeautifulSoup 来模仿浏览器,获取残缺的 HTML 内容并进行解析。
首先,咱们须要装置 selenium 和 BeautifulSoup 库。能够应用以下命令进行装置:
pip install selenium
pip install beautifulsoup4
1.3 应用 selenium 模仿浏览器
咱们能够应用 selenium 库中的 webdriver 对象来模仿浏览器,例如 Chrome 或 Firefox。须要留神的是,咱们须要下载对应的浏览器驱动程序,并将驱动程序的门路增加到环境变量中。
以下代码演示了如何应用 selenium 模仿 Chrome 浏览器,并拜访百度搜寻页面:
from selenium import webdriver
url = 'https://www.baidu.com'
driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
print(html)
1.4 应用 BeautifulSoup 解析 HTML 内容
咱们能够应用 BeautifulSoup 库来解析获取到的 HTML 内容。例如,以下代码能够获取百度搜寻后果中的所有题目和链接:
from selenium import webdriver
from bs4 import BeautifulSoup
url = 'https://www.baidu.com/s?wd=python'
driver = webdriver.Chrome()
driver.get(url)
html = driver.page_source
soup = BeautifulSoup(html, 'html.parser')
results = []
for result in soup.find_all('div', class_='result'):
title = result.h3.text
link = result.a.get('href')
results.append((title, link))
print(results)
1.5 敞开浏览器
在应用完 selenium 后,咱们须要手动敞开浏览器以开释资源。以下代码演示了如何敞开 Chrome 浏览器:
from selenium import webdriver
url = 'https://www.baidu.com'
driver = webdriver.Chrome()
driver.get(url)
# do something...
driver.quit()
2. 如何应用正则表达式来解析 HTML 内容
2.1 正则表达式
正则表达式是一种用于匹配字符串的模式,能够用于解析 HTML 内容。Python 中提供了 re 模块来反对正则表达式。
2.2 正则表达式的语法
正则表达式的语法比较复杂,这里仅介绍一些罕用的语法:
一般字符:一般字符在正则表达式中间接匹配本身。例如,字符 a 在正则表达式中匹配字符 a。
元字符:元字符是一些非凡的字符,能够用于匹配一类字符。例如,元字符 . 在正则表达式中能够匹配任意字符。
字符类:字符类用于匹配一组字符中的任意一个字符。例如,[abc] 匹配字符 a、b 或 c 中的任意一个字符。
反复匹配:反复匹配用于匹配一个字符或一组字符的反复呈现。例如,a* 匹配 0 个或多个字符 a。
锚点:锚点用于匹配字符串的结尾或结尾。例如,^ 示意字符串的结尾,$ 示意字符串的结尾。
2.3 应用正则表达式解析 HTML 内容
在应用正则表达式解析 HTML 内容时,咱们须要先应用 requests 库获取 HTML 内容,而后应用 re 模块来解析 HTML 内容。
以下代码演示了如何应用正则表达式解析百度搜寻后果中的所有题目和链接:
import re
import requests
url = 'https://www.baidu.com/s?wd=python'
response = requests.get(url)
html = response.content.decode()
results = []
pattern = '<div class="result c-container ".*?<h3 class="t">.*?<a.*?href="(.*?)".*?>(.*?)</a>.*?</h3>'
for match in re.finditer(pattern, html, re.S):
link = match.group(1)
title = match.group(2)
results.append((title, link))
print(results)
在下面的代码中,咱们首先应用 requests 库获取 HTML 内容,而后应用 re 模块解析 HTML 内容。正则表达式 pattern 匹配百度搜寻后果中每个搜寻后果的 HTML 内容,其中链接和题目别离应用了分组,不便后续的获取。
3. 如何应用 Selenium 库模仿浏览器操作来爬取动静网站的数据
3.1 Selenium 简介
Selenium 是一个自动化测试工具,能够用来模仿用户在浏览器中的操作,例如点击、输出等。咱们能够应用 Selenium 来模仿浏览器操作,从而爬取动静网站的数据。
3.2 装置 Selenium
在应用 Selenium 之前,须要先装置相应的库。能够应用 pip 命令来装置 Selenium:
pip install selenium
3.3 应用 Selenium 爬取动静网站
应用 Selenium 爬取动静网站的流程个别如下:
创立浏览器对象;
应用浏览器对象关上网页;
模仿用户操作,例如点击、输出等;
获取网页内容;
敞开浏览器对象。
以下代码演示了如何应用 Selenium 模仿浏览器操作,爬取猫眼电影 TOP100 的数据:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless') # 应用无头模式,不显示浏览器窗口
browser = webdriver.Chrome(options=options) # 创立 Chrome 浏览器对象
browser.get('https://maoyan.com/board/4') # 关上猫眼电影 TOP100 页面
results = []
for i in range(10): # 模仿点击“下一页”按钮,获取前 100 条数据
elements = browser.find_elements_by_css_selector('.board-wrapper dd')
for element in elements:
title = element.find_element_by_css_selector('.name a').text
star = element.find_element_by_css_selector('.star').text
release_time = element.find_element_by_css_selector('.releasetime').text
results.append((title, star, release_time))
next_button = browser.find_element_by_css_selector('.board-pagination .next')
next_button.click()
browser.quit() # 敞开浏览器对象
print(results)
在下面的代码中,咱们首先创立了一个 Chrome 浏览器对象,并关上了猫眼电影 TOP100 页面。而后,咱们模仿了点击“下一页”按钮,获取前 100 条数据。留神,在模仿点击“下一页”按钮之前,咱们须要先应用 find_elements_by_css_selector 办法找到所有电影条目。
4. 如何解决 JavaScript 加载的数据
4.1 网页加载过程
当咱们在浏览器中输出网址时,浏览器会依照以下步骤加载网页:
发送 HTTP 申请,获取 HTML 文档;
解析 HTML 文档,构建 DOM 树;
加载 CSS 文件和 JavaScript 文件,解析并执行 JavaScript 代码,构建渲染树;
将渲染树渲染成页面。
在这个过程中,如果页面中蕴含 JavaScript 代码,它可能会通过 Ajax 或其余形式向服务器申请数据,而后应用这些数据来更新页面。这些动静加载的数据,咱们在应用传统的 Requests 库爬取网页时是无奈获取的。
4.2 应用 Selenium 解决 JavaScript 加载的数据
Selenium 是一个弱小的自动化测试工具,咱们能够应用它来模仿用户在浏览器中的操作,从而获取 JavaScript 加载的数据。以下是应用 Selenium 解决 JavaScript 加载的数据的代码示例:
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument('--headless') # 应用无头模式,不显示浏览器窗口
browser = webdriver.Chrome(options=options) # 创立 Chrome 浏览器对象
browser.get('https://movie.douban.com/top250') # 关上豆瓣电影 TOP250 页面
results = []
while True:
elements = browser.find_elements_by_css_selector('.item')
for element in elements:
title = element.find_element_by_css_selector('.title').text
rating = element.find_element_by_css_selector('.rating_num').text
results.append((title, rating))
next_button = browser.find_element_by_css_selector('.next a')
if 'disabled' in next_button.get_attribute('class'): # 如果“下一页”按钮不可用,则退出循环
break
next_button.click()
browser.quit() # 敞开浏览器对象
print(results)
在下面的代码中,咱们首先创立了一个 Chrome 浏览器对象,并关上了豆瓣电影 TOP250 页面。而后,咱们应用一个 while 循环来一直点击“下一页”按钮,获取所有电影条目。留神,在模仿点击“下一页”按钮之前,咱们须要先应用 find_elements_by_css_selector 办法找到所有电影条目。
三、总结
到此为止,咱们曾经学会了 python 爬虫入门到进阶的一点点常识。在理论利用中,咱们还须要思考一些非凡状况和解决形式,例如网页加载速度、异步加载、反爬机制等。然而,通过对根底的爬虫常识的学习,咱们能够更好地了解和应答这些问题。