对于Python爬虫,主要分为以下几个步骤:
下面将介绍具体的爬虫实现步骤和代码演示。
在进行爬虫之前,需要确定目标网站,并对该网站的结构和内容进行分析。这里以豆瓣电影为例,假设我们要爬取豆瓣电影Top250的电影名称、评分和评价人数等信息。
使用Python的requests库可以方便地向目标网站发送HTTP请求,并获取网页源代码。具体实现代码如下:
import requests
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/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
html = response.text
这里需要注意,为了避免被目标网站识别为爬虫程序,需要在请求头中添加User-Agent信息,以模拟浏览器访问。
2.使用Python的BeautifulSoup库解析网页源代码,提取所需信息
使用Python的BeautifulSoup库可以方便地解析网页源代码,并提取所需信息。具体实现代码如下:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
movies = soup.find_all('div', class_='item')
for movie in movies:
title = movie.find('span', class_='title').text
rating_num = movie.find('span', class_='rating_num').text
rating_people = movie.find('div', class_='star').find_all('span')[3].text[:-3]
print(title, rating_num, rating_people)
这里使用了find_all方法,通过CSS选择器查找所有class为item的div标签,然后对每个电影进行解析,提取电影名称、评分和评价人数等信息。
3.使用Python的正则表达式对提取的信息进行处理和筛选
有时候,需要对提取的信息进行处理和筛选,这时可以使用Python的正则表达式模块re。例如,我们需要筛选评价人数大于1万的电影,具体实现代码如下:
import re
for movie in movies:
title = movie.find('span', class_='title').text
rating_num = movie.find('span', class_='rating_num').text
rating_people = movie.find('div', class_='star').find_all('span')[3].text[:-3]
if re.match(r'^\d{4,}$', rating_people):
print(title, rating_num, rating_people)
这里使用了re.match方法,对评价人数进行匹配,筛选出评价人数大于1万的电影。
4.存储数据,可以选择存储到本地文件或数据库中
最后,将提取的信息存储到本地文件或数据库中。例如,将电影名称、评分和评价人数存储到CSV文件中,具体实现代码如下:
import csv
with open('movies.csv', 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['电影名称', '评分', '评价人数'])
for movie in movies:
title = movie.find('span', class_='title').text
rating_num = movie.find('span', class_='rating_num').text
rating_people = movie.find('div', class_='star').find_all('span')[3].text[:-3]
if re.match(r'^\d{4,}$', rating_people):
writer.writerow([title, rating_num, rating_people])
这里使用了Python的csv模块,将提取的信息存储到CSV文件中。
完整代码如下:
import requests
from bs4 import BeautifulSoup
import re
import csv
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/58.0.3029.110 Safari/537.3'}
response = requests.get(url, headers=headers)
html = response.text
soup = BeautifulSoup(html, 'html.parser')
movies = soup.find_all('div', class_='item')
with open('movies.csv', 'w', newline='', encoding='utf-8-sig') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['电影名称', '评分', '评价人数'])
for movie in movies:
title = movie.find('span', class_='title').text
rating_num = movie.find('span', class_='rating_num').text
rating_people = movie.find('div', class_='star').find_all('span')[3].text[:-3]
if re.match(r'^\d{4,}$', rating_people):
writer.writerow([title, rating_num, rating_people])