写一个Python爬虫

成天看后端他们在那搞爬虫,最近不忙,我也来试试,就爬取豆瓣电影的Top250列表吧,Google啥的反作弊机制太成熟,不适合新人上手。
看了一些资料需要安装几个必要的库,如requestsBeautifulSoup

以下是实现步骤和代码:

步骤:

  1. 安装依赖库 :首先确保安装了所需的库。可以使用pip进行安装。我的Mbp自带Python2.7,这就省略了一个安装Python的步骤。
1
2
pip install requests
pip install beautifulsoup4
  1. 编写爬虫代码 :用Python编写爬虫,抓取豆瓣Top250的电影信息。豆瓣Top250网页使用了分页,所以还需要处理多个页面。

  2. 处理反爬虫机制 :豆瓣网站有一定的反爬虫措施,可以通过设置User-Agent等方式来模拟浏览器请求。

代码实现:

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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73

import requests
from bs4 import BeautifulSoup
import time
import csv

# 获取页面的HTML
def get_page(url):
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"
}
response = requests.get(url, headers=headers)
return response.text

# 解析页面
def parse_page(html):
soup = BeautifulSoup(html, 'html.parser')
movies = []

# 查找电影条目
for item in soup.find_all('div', class_='item'):
movie = {}

# 电影名
title = item.find('span', class_='title')
movie['title'] = title.text if title else 'N/A'

# 评分
rating = item.find('span', class_='rating_num')
movie['rating'] = rating.text if rating else 'N/A'

# 评价人数
num_ratings = item.find('div', class_='star').find_all('span')[-1]
movie['num_ratings'] = num_ratings.text if num_ratings else 'N/A'

# 电影详情链接
movie['link'] = item.find('a')['href']

# 将数据加入列表
movies.append(movie)

return movies

# 保存到CSV
def save_to_csv(movies, filename='douban_top250.csv'):
keys = movies[0].keys()
with open(filename, mode='w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=keys)
writer.writeheader()
writer.writerows(movies)

# 主函数
def main():
base_url = "https://movie.douban.com/top250?start="

all_movies = []

# 爬取前10页
for i in range(0, 250, 25):
url = base_url + str(i)
print(f"正在爬取第{i//25 + 1}页...")
html = get_page(url)
movies = parse_page(html)
all_movies.extend(movies)
time.sleep(2) # 防止被封,添加延时

# 保存到CSV文件
save_to_csv(all_movies)
print("爬取完毕,数据已保存到douban_top250.csv")

if __name__ == "__main__":
main()

注释:

  1. get_page(url) :该函数发送一个HTTP GET请求到豆瓣Top250页面,返回页面的HTML内容。

  2. parse_page(html) :该函数使用BeautifulSoup解析页面内容,提取电影名称、评分、评价人数和链接等信息,并将其存储在字典中。返回一个电影字典的列表。

  3. save_to_csv(movies, filename) :该函数将电影数据保存到CSV文件中,文件名为douban_top250.csv

  4. main() :这是爬虫的主函数,负责循环爬取豆瓣Top250页面的内容并保存。每次请求后,程序暂停2秒,避免被封。