头图

爬虫(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爬虫入门到进阶的一点点知识。在实际应用中,我们还需要考虑一些特殊情况和处理方式,例如网页加载速度、异步加载、反爬机制等。但是,通过对基础的爬虫知识的学习,我们可以更好地理解和应对这些问题。


Mlscoding
1 声望0 粉丝

I don't live in your trap.