〇、安装Python解释器
Python程序一般是翻译一行,执行一行。
一、安装pycharm集成开发环境
二、了解python基础
三、爬虫的流程
写一个爬虫程序的步骤:
- 获取网页内容
通过代码给一个网站服务器发送请求,服务器返回网页内容。
(浏览器的作用与此相同,之后会将网页内容渲染展示) - 解析网页内容
把想要的内容提取出来 - 储存或分析数据
看具体需求:收集数据集(将数据储存进数据库);分析数据趋势(把数据做成可视化图表);舆情监控(使用AI做做文本情绪分析)。
必须遵守的规则
不要爬取公民隐私数据
不要爬取受著作权保护的内容
不要爬取国家事务、国防建设、尖端科学技术领域的计算机系统等
保证自己写的虫是一只温和善良的虫
- 请求数量和频率不能过高(否则无异于DDos攻击【通过给服务器发送海量高频的请求,抢占资源,其他用户访问受限】);
- 网站有明显的反爬限制(需登录或者有验证码),不要强行突破;
- 可以通过查看网站的robots.txt文件,了解可爬取的网页路径范围。
所需知识:
- HTTP请求
- python request库
- HTML网页结构
- python Beautiful Soup库
四、HTTP请求和响应
HTTP(Hypertext Transfer Protocol)超文本传输协议:是一种客户端和服务器之间的请求协议。
Get方法(用于获得数据)和Post方法(用于创建数据)
HTTP请求分为请求行、请求头和请求体三部分组成:
请求行:
POST /user/info HTTP/1.1
方法类型、资源路径(查询参数)和协议版本
请求头:
Host:www.example.com
主机域名【主机域名和请求行中的资源路径可以得到一个完整的网址】
User-Agent:curl/7.77.0
用于告知服务器客户端的相关信息,请求来自浏览器还是其他方式发出。
Accpet:*/*
告诉服务器客户端想接收的响应数据是什么类型的,多种类型用逗号分隔
*/*表示什么类型都可以
请求体:
{"username":"laomao",
"email":"laomao@csdn.com"}
get的请求体一般为空
HTTP响应由状态行、响应头和响应体三个部分组成:
状态行:
HTTP/1.1 200 OK
协议版本、状态码、状态消息
状态码【2开头成功、3开头需要进一步操作、4开头客户端错误、5开头服务器错误】
响应头:
Date:Fri,27 Jan 2024 02:10:48 GMT
Content-Type:text/html;charset=utf-8
时间和响应数据类型
响应体:
<!DOCTYPE html>
<head><title>首页</title></head>
<body><h1>老猫加油鸭!</h1><p>小路冲吖!</p></body>
<html>
服务器给客户端的数据内容
五、python request库
在终端输入 pip install requests(Mac输入pip3 install requests)
import requests
# 定义请求头
headers = {
"User-Agent":"XXX"
}
response = requests.get("https://movie.douban.com/top250",headers=headers)
print(response.status_code)
print(response.text)
六、HTML网页结构
关注更多html课程即可!
七、Beautiful Soup库
用于解析网页内容
安装 pip install bs4
引入 from bs4 import BeautifulSoup
八、实战,获取豆瓣电影TOP250
import requests
from bs4 import BeautifulSoup
# 将爬虫伪装为浏览器
headers = {
"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36 Edg/123.0.0.0"
}
for start_num in range(0, 250, 25):
response = requests.get(f"https://movie.doban.com/top250?start={start_num}", headers=headers)
html = response.text
soup = BeautifulSoup(html, "html.parser")
all_titles = soup.findAll("span", attrs={"class": "title"})
for title in all_titles:
title_string = title.string
if "/" not in title_string:
print(title_string)
可以通过正则表达式根据自定义规则匹配一个或多个目标;
使用多线程增加爬虫程序的效率。