案例实现
需求:要爬取豆瓣top250的电影信息数据(标题 评分 引言 详情页的url) 10页的数据
都要爬取 并写入到csv文件中
https://movie.douban.com/top250?start=0&filter= 第一页
https://movie.douban.com/top250?start=25&filter= 第二页
https://movie.douban.com/top250?start=50&filter= 第三页
https://movie.douban.com/top250?start=75&filter= 第四页
一共是250条 25页
分析:
(page-1) * 25
总结
第一个 str格式化的运用
解决办法 先是找规律 进行格式化的替换
doubanUrl = 'https://movie.douban.com/top250?start={}&filter='
s1 = '钢铁侠'
s2 = '蜘蛛侠'
r = f'hello{s1},{s2}'
print(r)
s = 'i like {}' # str.format()
w = s.format('python')
print(w)
第二个 xpath语法的运用
第一步 先生成一个element对象
第二步 用xpath进行导航
第三个 csv文件的存储
第四个 小细节 例如 非空判断
# 非布尔值判断 只要不是空性的 统统代表是True 反之 空性[] () {} None 0...
if quote:
quote = quote[0]
else:
quote =''
douban.py
# @ Time : 2021/2/25 12:19
# @ Author : Ellen
import requests
from lxml import etree
import csv
# headers = {
# 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
# }
#
# response = requests.get('https://movie.douban.com/top250?start=0&filter=', headers=headers)
# response.encoding = 'utf-8'
# # headers = response.request.headers # 请求头信息
# print(response.text)
# print(headers)
# 第一步 目标网站
doubanUrl = 'https://movie.douban.com/top250?start={}&filter='
# 第二步 发起请求获取响应结果
def getSource(url):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'
}
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
return response.text
# 第三步 解析数据 电影的名字 评分 引言 详情页的Url
def getEveryItem(source):
html_element = etree.HTML(source)
movieItemList = html_element.xpath("//div[@class='info']")
# 定义一个空的列表 保存电影数据 [{'title':'肖申克的救赎'}, {'title': '霸王别姬'}]
movieList = []
for eachMovie in movieItemList:
# 定义一个字典保存电影信息 k-v
movieDict = {}
title = eachMovie.xpath('div[@class="hd"]/a/span[@class="title"]/text()') # 主标题
otherTitle = eachMovie.xpath('div[@class="hd"]/a/span[@class="other"]/text()') # 副标题
link = eachMovie.xpath('div[@class="hd"]/a/@href')[0] # 详情页url
star = eachMovie.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0] # 评分
quote = eachMovie.xpath('div[@class="bd"]/p[@class="quote"]/span/text()') # 引言 名句
# 非布尔值判断 只要不是空性的 统统代表是True 反之 空性[] () {} None 0...
if quote:
quote = quote[0]
else:
quote =''
movieDict['title'] =''.join(title+otherTitle) # 主标题+副标题
movieDict['url'] = link # 详情页url
movieDict['star'] = star # 评分
movieDict['quote'] = quote # 引言
movieList.append(movieDict)
print(movieList)
return movieList
# 第四部 保存数据
def writeDate(movieList):
with open('douban.csv', 'w', encoding='utf-8', newline='') as file_obj:
writer = csv.DictWriter(file_obj, fieldnames=['title', 'star', 'quote', 'url'])
writer.writeheader()
for each in movieList:
writer.writerow(each)
if __name__ == '__main__':
movieList = []
for i in range(10):
# 获取目标url
pageLink = doubanUrl.format(i * 25)
source = getSource(pageLink)
movieList += getEveryItem(source)
writeDate(movieList)