想抓取网站数据却不知道从何下手?这篇带你从零开始,写出第一个爬虫程序!
爬虫(Spider/Scraper) = 自动化程序 + 模拟浏览器访问 + 提取数据
1 2 3 | 我们的电脑 ──请求──> 网站服务器 <─返回网页HTML── ──解析提取──> 有用数据
|
爬虫能干什么?
二、准备工作
1. 安装Python库
1 2 3 4 5 | # 最基础的爬虫库 pip install requests
# HTML解析库(后面会讲) pip install beautifulsoup4 lxml
|
2. 认识HTTP请求
我们访问网页,本质上是在发送HTTP请求:
三、第一个爬虫: requests库基础
1. 最简单的GET请求
1 2 3 4 5 6 7 8 9 10 11 12 13 | import requests
# 发送GET请求 response = requests.get('https://www.example.com')
# 查看状态码(200=成功,404=不存在,403=被禁止) print(response.status_code)
# 查看返回的HTML内容 print(response.text)
# 查看二进制内容(适合图片、视频) print(response.content)
|
2. 带请求头的请求
很多网站会检测请求头,如果发现是爬虫会拒绝访问:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | import requests
# 伪装成浏览器 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36' }
response = requests.get( 'https://www.example.com', headers=headers )
print(response.status_code) print(response.text)
|
3. 带参数的请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import requests
# URL参数 params = { 'wd': 'Python爬虫', # 搜索关键词 'pn': 10# 页码 }
headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }
response = requests.get( 'https://www.baidu.com/s', params=params, headers=headers )
# 打印完整URL print(response.url) # 输出: https://www.baidu.com/s?wd=Python%E7%88%AC%E8%99%AB&pn=10
|
四、数据解析:BeautifulSoup入门
网页返回的是HTML代码,我们需要从中提取有用信息。
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 30 31 32 33 34 35 36 37 | from bs4 import BeautifulSoup
html = """ <html> <body> <div class="article"> <h1>文章标题</h1> <p class="content">这是文章内容</p> <a href="https://example.com">链接</a> </div> </body> </html> """
# 解析HTML soup = BeautifulSoup(html, 'lxml')
# 1. 通过标签名查找 print(soup.h1) # <h1>文章标题</h1> print(soup.p) # <p class="content">这是文章内容</p>
# 2. 获取文本内容 print(soup.h1.text) # 文章标题 print(soup.p.get_text()) # 这是文章内容
# 3. 通过class查找 article = soup.find('div', class_='article') print(article.text)
# 4. 获取属性 link = soup.find('a') print(link['href']) # https://example.com
# 5. 查找所有 all_links = soup.find_all('a') for link in all_links: print(link['href'])
|
常用查找方法
1 2 3 4 5 | # CSS选择器示例 soup.select('.article') # class="article" soup.select('#header') # id="header" soup.select('div > a') # div下的a标签 soup.select('a[href="xxx"]') # 属性匹配
|
五、实战:爬取简单网页
目标:爬取一个简单的文章页面
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 | import requests from bs4 import BeautifulSoup
# 目标网页 url = 'https://example.com/blog/article-1'
# 发送请求 headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36' }
response = requests.get(url, headers=headers) response.encoding = 'utf-8'# 指定编码
# 解析网页 soup = BeautifulSoup(response.text, 'lxml')
# 提取信息 title = soup.find('h1').text content = soup.find('div', class_='content').text date = soup.find('time').text
# 打印结果 print(f'标题: {title}') print(f'发布时间: {date}') print(f'内容: {content[:100]}...') # 只显示前100字
|
六、常见问题
| | |
|---|
| | response.encoding = 'utf-8' |
| | |
| | |
| | |
| | |
延时和异常处理
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import requests from bs4 import BeautifulSoup import time
url = 'https://example.com/page'
try: response = requests.get(url, timeout=10) # 10秒超时 response.raise_for_status() # 检查状态码 soup = BeautifulSoup(response.text, 'lxml') print('爬取成功') except requests.exceptions.RequestException as e: print(f'请求失败: {e}')
# 延时:不要爬太快 time.sleep(2) # 停2秒
|
七、写在最后
第一篇爬虫入门核心就这些:
1 | requests发送请求 → BeautifulSoup解析 → 提取数据
|
下篇预告:爬取图片/文件下载、多页面翻页爬取、存储到本地。
如果这篇文章对你有帮助,欢迎点赞+在看👍
有问题欢迎留言,我们一起进步!
#AI学习 #Python爬虫 #requests #BeautifulSoup #数据分析
Photo by zenigame photo on Unsplash