一:爬虫 1、爬取的目标 将豆瓣电影网上的电影的基本信息,比如:电影名称、导演、电影类型、国家、上映年份、评分、评论人数爬取出来,并将爬取的结果放入csv文件中,方便存储。 2、网站结构 图1豆瓣网网站结构详情 此次实验爬取豆瓣网中电影页面中的电影的基本信息。 每一个电影包括电影名称、导演、电影类型、国家、上映年份、评分、评论人数。页面具体情况如图2所示。 图2豆瓣网电影基本信息详情 3、爬虫技术方案 1)、所用技术: 网站解析的使用的是Xpath、数据存储使用的是csv。 2)、爬取步骤: 1、导入所需的库,如re、time、requests、lxml、random和csv。 2、定义一个名为main的函数,该函数接受两个参数:page(页码)和f(文件对象)。 3、在main函数中,构造请求URL,设置请求头,并发送GET请求以获取网页内容。 4、使用lxml库解析网页内容,提取电影详情页的链接列表和电影名称列表。 5、遍历链接列表和名称列表,对于每个链接和名称,调用get_info函数来获取电影的详细信息。 6、在get_info函数中,同样构造请求URL,设置请求头,并发送GET请求以获取电影详情页的内容。 7、使用lxml库解析电影详情页的内容,提取导演、电影类型、国家、上映时间、评分和评论人数等信息。 8、打印提取到的信息,并将其写入CSV文件中。 9、在主程序中,创建一个CSV文件,并写入表头标题。 10、使用for循环遍历10个页面,调用main函数来爬取每一页的电影信息。 11、在每次循环之间,让程序休息一段时间,以避免过于频繁的请求导致IP被封禁。 4、爬取过程: 1)、导入所需要的包 import re
from time import sleep
import requests
from lxml import etree
import random
import csv import re:导入正则表达式模块,用于处理字符串。 from time import sleep:从time模块导入sleep函数,用于让程序暂停执行一段时间。 import requests:导入requests模块,用于发送HTTP请求。 from lxml import etree:从lxml模块导入etree函数,用于解析HTML文档。 import random:导入random模块,用于生成随机数。 import csv:导入csv模块,用于操作CSV文件。 2)、设置请求头,定义min函数接收参数,访问连接提取列表 def main(page, f):
url = f'https://movie.douban.com/top250?start={page * 25}&filter='
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36', }
resp = requests.get(url, headers=headers)
tree = etree.HTML(resp.text)
# 获取详情页的链接列表
href_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href')
# 获取电影名称列表
name_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
for url, name in zip(href_list, name_list):
f.flush() # 刷新文件
try:
get_info(url, name) # 获取详情页的信息
except:
pass
sleep(1 + random.random()) # 休息
print(f'第{i + 1}页爬取完毕') 3)、使用正则表达式开始爬取网页信息 def get_info(url, name):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36',
'Host': 'movie.douban.com',
}
resp = requests.get(url, headers=headers)
html = resp.text
tree = etree.HTML(html)
# 导演
dir = tree.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
# 电影类型
type_ = re.findall(r'property="v:genre">(.*?)</span>', html)
type_ = '/'.join(type_)
# 国家
country = re.findall(r'地区:</span> (.*?)<br', html)[0]
# 上映时间
time = tree.xpath('//*[@id="content"]/h1/span[2]/text()')[0]
time = time[1:5]
# 评分
rate = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
# 评论人数
people = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/div/div[2]/a/span/text()')[0]
print(name, dir, type_, country, time, rate, people) # 打印结果
csvwriter.writerow((name, dir, type_, country, time, rate, people)) # 保存到文件中 4)、将爬取结果放入csv文件中 5、爬虫结果 二:预处理 1、删除列 1)、新建转换,之后使用文件输入,将csv文件输入进行处理 之后进行字段获取。 2)、选择转换中的字段选择进行列删除,将上映时间这个列进行删除。 2、选择转换中的增加常量,增加评论数量这一列,查询电影评论的数量这一情况。
-
最后选择文本文件输出,将处理好的数据输出,输出的格式是csv文件,分割符用逗号隔开,编码用UTF-8J进行转码,防止输出文件中有乱码。文本文件命名成姓名_处理完成_csv。
4、预处理完全处理全流程: 三:爬虫数据源代码 代码: import re
from time import sleep
import requests
from lxml import etree
import random
import csv
def main(page, f):
url = f'https://movie.douban.com/top250?start={page * 25}&filter='
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36', }
resp = requests.get(url, headers=headers)
tree = etree.HTML(resp.text)
# 获取详情页的链接列表
href_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/@href')
# 获取电影名称列表
name_list = tree.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]/text()')
for url, name in zip(href_list, name_list):
f.flush() # 刷新文件
try:
get_info(url, name) # 获取详情页的信息
except:
pass
sleep(1 + random.random()) # 休息
print(f'第{i + 1}页爬取完毕')
def get_info(url, name):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.35 Safari/537.36',
'Host': 'movie.douban.com',
}
resp = requests.get(url, headers=headers)
html = resp.text
tree = etree.HTML(html)
# 导演
dir = tree.xpath('//*[@id="info"]/span[1]/span[2]/a/text()')[0]
# 电影类型
type_ = re.findall(r'property="v:genre">(.*?)</span>', html)
type_ = '/'.join(type_)
# 国家
country = re.findall(r'地区:</span> (.*?)<br', html)[0]
# 上映时间
time = tree.xpath('//*[@id="content"]/h1/span[2]/text()')[0]
time = time[1:5]
# 评分
rate = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/strong/text()')[0]
# 评论人数
people = tree.xpath('//*[@id="interest_sectl"]/div[1]/div[2]/div/div[2]/a/span/text()')[0]
print(name, dir, type_, country, time, rate, people) # 打印结果
csvwriter.writerow((name, dir, type_, country, time, rate, people)) # 保存到文件中
if __name__ == '__main__':
# 创建文件用于保存数据
with open('03-movie-xpath.csv', 'a', encoding='utf-8', newline='')as f:
csvwriter = csv.writer(f)
# 写入表头标题
csvwriter.writerow(('电影名称', '导演', '电影类型', '国家', '上映年份', '评分', '评论人数'))
for i in range(10): # 爬取10页
main(i, f) # 调用主函数
sleep(3 + random.random()) |