爬虫基本原理介绍、实现及问题解决、爬虫实战、爬取经典moba游戏英雄列表

爬虫基本原理介绍、实现及问题解决、爬虫实战、爬取经典moba游戏英雄列表

爬虫(Web Crawler)是一种自动化的网络机器人,其基本功能是从互联网上抓取信息。爬虫的工作原理、实现方法以及可能遇到的问题及其解决方案如下:

基本原理

  1. 请求(Request):爬虫向目标网站发送HTTP请求,获取网页内容。
  2. 响应(Response):服务器处理请求后,返回网页的HTML、JSON或其他格式的响应数据。
  3. 解析(Parsing):爬虫解析响应内容,提取有用信息或链接。
  4. 存储(Storage):将提取的数据存储到数据库或文件中。
  5. 遍历(Traversal):根据解析出的链接,递归或迭代地发起新的请求,继续抓取其他网页。

实现方法

  1. 选择合适的工具:Python是实现爬虫的流行语言,常用的库有Requests、BeautifulSoup、lxml和Scrapy。
  2. 编写爬虫代码
    • 使用requests库发起请求获取网页内容。
    • 使用BeautifulSouplxml解析HTML,提取数据。
    • 使用正则表达式或XPath选择器定位所需信息。
    • 遍历页面中的链接,构建待抓取的URL队列。
  3. 遵守robots.txt协议:robots.txt文件定义了搜索引擎爬虫可以抓取的网站范围,合法的爬虫应遵守该协议。
  4. 设置User-Agent:模拟浏览器的User-Agent,避免被识别为爬虫而被封禁。
  5. 异常处理:编写代码处理可能出现的异常,如网络请求失败、解析错误等。

问题解决

  1. 反爬虫机制
    • IP封禁:使用代理服务器池,轮换IP地址。
    • 请求频率限制:设置合理的请求间隔,避免过快请求。
    • 验证码:使用OCR技术或第三方服务识别验证码。
    • 动态内容:分析Ajax请求,模拟浏览器行为或使用Selenium获取动态加载的数据。
  2. 数据清洗:对抓取的数据进行清洗和格式化,以便后续处理和分析。
  3. 性能优化
    • 使用多线程或异步IO提高爬取效率。
    • 合理设计数据存储结构,提高读写效率。
  4. 法律风险:尊重版权和隐私,遵守相关法律法规,避免侵权行为。

爬虫的开发和使用需要遵循法律法规和道德标准,不得侵犯他人权益。在实际应用中,应尽量减少对目标网站的影响,合理合法地使用爬虫技术。

Python爬虫简单实现

以下是一个简单的Python爬虫脚本,它使用requests库从百度网站获取HTML内容,并将其保存到本地文件中。我已经为代码添加了注释,以便更好地理解每一步的过程。

1
2
3
4
5
6
7
8
9
import requests

response = requests.get('https://www.baidu.com')
html = response.content.decode()
print(html)

with open('data/json/baidu.html', 'w') as fp:
fp.write(html)
print('保存完毕!')

在运行上述脚本时,需要注意以下几点:

  1. 确保requests库已经安装在你的Python环境中。如果没有安装,可以通过运行pip install requests来安装。
  2. 脚本中的data/json/baidu.html是保存文件的路径和文件名,你需要根据你的文件系统结构来修改这个路径,确保程序有权限写入到该路径。
  3. 如果你运行脚本时遇到网络问题,如无法访问百度网站,可能需要检查你的网络连接,或者检查是否有代理、VPN等网络设置影响了请求。
  4. 由于网络请求可能受到目标网站的反爬虫策略影响,建议在实际使用中添加适当的请求头、User-Agent等信息,并遵守目标网站的robots.txt文件规定。

数据清洗

BeautifulSoup 是一个用于解析HTML和XML文档的Python库,它创建了一个解析树,使得我们可以方便地提取和操作页面数据。在数据清洗过程中,BeautifulSoup 可以帮助我们从网页中提取有用的信息,并将其转换为统一的格式。以下是使用 BeautifulSoup 进行数据清洗的基本步骤:

安装BeautifulSoup

如果你还没有安装 BeautifulSoup,可以通过以下命令进行安装:

1
pip install beautifulsoup4

解析文档

首先,你需要一个HTML或XML文档作为输入。这可以是通过HTTP请求获取的网页内容,也可以是本地文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from bs4 import BeautifulSoup

# 假设我们已经有了HTML内容,可以直接解析
html_content = """
<html>
<head><title>页面标题</title></head>
<body>
<div class="content">
<p class="date">2023-03-17</p>
<ul id="list">
<li class="item">第一项</li>
<li class="item">第二项</li>
</ul>
</div>
</body>
</html>
"""

# 使用BeautifulSoup解析HTML
soup = BeautifulSoup(html_content, 'html.parser') # 'html.parser'是解析器,也可以使用'lxml'等

提取数据

使用 BeautifulSoup 提供的方法,如 find(), find_all(), select() 等,来定位和提取所需的元素。

1
2
3
4
5
6
7
# 提取单个元素
date_tag = soup.find('p', class_='date')
date = date_tag.text.strip() # 去除空白字符

# 提取多个元素
items = soup.find_all('li', class_='item')
item_texts = [item.text.strip() for item in items] # 列表推导式提取所有文本内容

数据清洗

对提取出的数据进行清洗,包括去除空白字符、标准化格式、转换数据类型等。

1
2
3
4
5
6
7
8
9
10
# 去除空白字符
cleaned_date = date.replace('\n', '').replace(' ', '')

# 标准化格式,例如日期格式
standard_date = cleaned_date.replace('-', '')

# 转换数据类型,例如将字符串转换为整数或浮点数
# 假设我们有一个价格字符串
price_str = '¥29.99'
price = float(price_str.replace('¥', '')) # 去除货币符号并转换为浮点数

存储数据

将清洗后的数据存储到适当的数据结构中,如列表、字典、数据帧等。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 将清洗后的数据存储到字典中
data = {
'date': standard_date,
'items': item_texts
}

# 或者存储到列表中
data_list = [
{'date': standard_date, 'items': item_texts}
]

# 如果需要,可以将数据保存到文件或数据库中
import json
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data_list, f, ensure_ascii=False, indent=4)

以上步骤展示了如何使用 BeautifulSoup 进行基本的数据清洗。在实际应用中,你可能需要根据具体的网页结构和数据需求,编写更复杂的解析和清洗逻辑。此外,BeautifulSoup 也提供了许多其他功能,如处理编码问题、解析嵌套标签等,可以根据需要进行学习和使用。

爬取经典moba游戏英雄列表

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import requests
from pyquery import PyQuery

url = 'https://pvp.qq.com/web201605/herolist.shtml'
html = requests.get(url).content
# print(html)

doc = PyQuery(html)

items = doc('.herolist > li').items()
# print(items)
# 生成迭代对象

# 循环遍历
for item in items:
# print(item)
url = item.find('img').attr('src')
# print(url)
urls = 'http:' + url
name = item.find('a').text()
# print(name)
url_content = requests.get(urls).content
# 下载 w write b bytes 二进制写入
with open('data/herolist/' + name + '.jpg', 'wb') as file:
# 保存
file.write(url_content)
print('正在下载:%s---------%s' % (name, urls))

print('下载完毕')
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 何福海
  • 访问人数: | 浏览次数:

请我喝杯奶茶吧~

支付宝
微信