以下是一个基于Python的简单网络爬虫实现示例,以爬取豆瓣电影Top250的电影名称和评分为例:
-
安装必要的库
- 我们需要安装
requests
库用于发送HTTP请求获取网页内容,BeautifulSoup
库用于解析HTML页面。 - 可以使用
pip install requests beautifulsoup4
命令进行安装。
- 我们需要安装
-
导入相关库
import requests
from bs4 import BeautifulSoup
- 发送请求并获取页面内容
url = 'https://movie.douban.com/top250'
headers = {'User - Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36'}
response = requests.get(url, headers = headers)
html_content = response.text
- 这里设置
User - Agent
头部信息是为了模拟浏览器访问,避免被服务器拒绝访问。
- 解析页面内容
soup = BeautifulSoup(html_content, 'html.parser')
movie_list = soup.find_all('div', class_='hd')
score_list = soup.find_all('span', class_='rating_num')
- 我们通过
BeautifulSoup
的find_all
方法来查找所有符合条件的HTML标签。这里分别查找包含电影名称的<div class="hd">
标签和包含评分的<span class="rating_num">
标签。
- 提取信息
for movie, score in zip(movie_list, score_list):movie_name = movie.a.span.textprint(f"电影名称: {movie_name}, 评分: {score.text}")
- 通过遍历找到的电影名称标签和评分标签,提取出电影名称和评分并打印出来。
如果要进一步扩展这个爬虫:
- 分页处理
- 豆瓣电影Top250是分页显示的。可以通过分析页面的URL结构来实现分页爬取。例如,第二页的URL是
https://movie.douban.com/top250?start = 25&filter =
,其中start
参数表示从第几个电影开始显示。 - 可以使用循环来遍历不同的页面,修改
start
参数的值来获取所有页面的内容。
- 豆瓣电影Top250是分页显示的。可以通过分析页面的URL结构来实现分页爬取。例如,第二页的URL是
for page in range(0, 250, 25):url = f'https://movie.douban.com/top250?start={page}&filter='# 后续的请求、解析和提取步骤与前面相同
- 数据存储
- 可以将爬取到的数据存储到文件或者数据库中。
- 如果存储到CSV文件中,可以使用
csv
模块。
import csv
with open('douban_movies.csv', 'w', newline='', encoding='utf - 8 - sig') as csvfile:fieldnames = ['电影名称', '评分']writer = csv.DictWriter(csvfile, fieldnames = fieldnames)writer.writeheader()for movie, score in zip(movie_list, score_list):movie_name = movie.a.span.textwriter.writerow({'电影名称': movie_name, '评分': score.text})
- 如果存储到数据库(如MySQL),需要安装
mysql - connector - python
库,然后进行数据库连接、创建表和插入数据等操作。
import mysql.connector
mydb = mysql.connector.connect(host = "localhost",user = "your_user",password = "your_password",database = "your_database"
)
mycursor = mydb.cursor()
mycursor.execute('CREATE TABLE IF NOT EXISTS douban_movies (movie_name VARCHAR(255), score VARCHAR(10))')
for movie, score in zip(movie_list, score_list):movie_name = movie.a.span.textsql = "INSERT INTO douban_movies (movie_name, score) VALUES (%s, %s)"val = (movie_name, score.text)mycursor.execute(sql, val)
mydb.commit()