1)先确定爬取的方式
在页面点击右键,查看源码,是否有我们想要获取的数据。
有数据,则后续我们可以采用xpath的方式进行解析。
不是通过异步加载的话,url和请求都确定了
url:/top250请求方式:get
2)爬取豆瓣250第一页所有的图片
通过xpath来获取img元素通过在图片上右击 -> 检查 ; 或者通过开发者工具的选择元素选中图片标签。
手动获取xpath://div[contains(@class, “pic”)]//img/@src
自动获取:在Elements将对应标签右击,点击 copy xpath 或 copy Full xpath
import osimport requestsfrom lxml import etreeurl = '/top250'headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/90.0.4430.212 Safari/537.36 '}def main():# 获取源码文件html = requests.get(url, headers=headers).text# 解析htmlhtml = etree.HTML(html)img_urls = html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[1]/a/img/@src')# 获取图片if not os.path.exists('./豆瓣电影图片'):os.mkdir('./豆瓣电影图片')for item in img_urls:# 获取图片内容content = requests.get(item, headers=headers).content# 获取图片名称fn = item.split('/')[-1]print(fn)with open('./豆瓣电影图片/' + fn, 'wb') as f:f.write(content)if __name__ == '__main__':main()
运行结果:
3)爬取豆瓣250第一页电影的信息
需求:获取每一页中电影的信息,包括电影名、主创、评分、简评
Code:
输出结果:
4)爬取豆瓣250所有电影信息
第一页: /top250?start=0&filter=
第二页:/top250?start=25&filter=
Code:
运行时报错:
报错原因:xpath在返回解析的结果时,如果获取不到内容,则返回一个空列表,在豆瓣250电影列表中,有些电影是没有简介的
解决方法:为inq添加判断
Code:
输出结果:
5)将内容保存到excel表格中
可以使用两个模块:openpyxl 或者 xlwt
固定步骤:
import xlwt# 创建一个excel工作簿book = xlwt.Workbook(encoding='utf-8')# 为工作簿添加sheetsheet = book.add_sheet('豆瓣top250')# 写表头sheet.write(0, 0, '排名')sheet.write(0, 1, '名称')sheet.write(0, 2, '评分')sheet.write(0, 3, '简介')sheet.write(0, 4, '主创')# 保存文件book.save(u'豆瓣Top250.xlsx')
总的代码:
import xlwtimport requestsfrom lxml import etreeurl = '/top250'headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ''Chrome/90.0.4430.212 Safari/537.36 '}def main(num):# 获取源码文件html = requests.get(url + f'?start={str(num * 25)}&filter=', headers=headers).text# 解析htmlhtml = etree.HTML(html)# 获取电影标签列表movies = html.xpath('//ol[contains(@class,"grid_view")]/li')# print(len(movies), movies)# 遍历列表,取出信息for item in movies:title = item.xpath('.//span[contains(@class,"title")][1]/text()')[0]author = item.xpath('./div/div[2]/div[2]/p[1]/text()')[0].strip()score = item.xpath('.//span[contains(@class,"rating_num")][1]/text()')[0]index = item.xpath('./div/div[1]/em/text()')[0]inq = item.xpath('.//span[contains(@class, "inq")]/text()')# 处理简介为空的问题inq = '' if not inq else inq[0]print(f'电影名:{title} | 评分:{score} | 排名:{index} | 简介:{inq} | 主创{author} ')# 函数中使用全局变量global nsheet.write(n, 0, index)sheet.write(n, 1, title)sheet.write(n, 2, score)sheet.write(n, 3, inq)sheet.write(n, 4, author)n += 1if __name__ == '__main__':# 创建一个excel工作簿book = xlwt.Workbook(encoding='utf-8')# 为工作簿添加sheetsheet = book.add_sheet('豆瓣top250')# 全局变量n = 1# 写表头sheet.write(0, 0, '排名')sheet.write(0, 1, '名称')sheet.write(0, 2, '评分')sheet.write(0, 3, '简介')sheet.write(0, 4, '主创')for i in range(10):main(i)# 保存文件book.save(u'豆瓣Top250.xls')
输出结果: