原文链接

查看影片的详细信息

进入豆瓣电影Top250,选择某一影片,右击,选择“检查元素”。
爬取豆瓣电影Top250影片信息 - 图1

爬取过程

需安装的包

安装requests、etree、json。

  1. // An highlighted block
  2. import json
  3. import requests
  4. from lxml import etree

确定爬取地址

由于豆瓣电影Top250是分页的,即计划爬取的影片信息分布在不同的页面上,其对应的网址不同,故需对不同的爬取地址统一格式。
爬取豆瓣电影Top250影片信息 - 图2
代码如下:

  1. // An highlighted block
  2. url_list=[]
  3. base_url="https://movie.douban.com/top250?start={}&filter="
  4. for i in range(0,10):
  5. url=base_url.format(i*25)
  6. url_list.append(url)
  7. print(url_list)

发送请求头

很多网站有反爬虫机制,如果发送没有haeders信息的请求,会被认为是爬虫,则会被禁止请求。设置header,通过request发送请求头。header中必须包含的信息有User_Agent,还可包括Host、Referer、Cookie等,查看方式如下。
爬取豆瓣电影Top250影片信息 - 图3
发送请求代码如下:

  1. // An highlighted block
  2. header={
  3. " Host": "movie.douban.com"
  4. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"
  5. #Referer Cookie
  6. }
  7. for url in url_list:
  8. data=requests.get(url,headers=header,allow_redirects=False).content.decode()
  9. print(data)

解析数据

可利用BeautifulSoup或etree.HTML解析数据,此处使用后者。

  1. // An highlighted block
  2. xpath_data=etree.HTML(data)

通过下图,可以看到每一影片的完整信息对应的源代码为<div class="item">,影片题目对应的源代码为<a href="https://movie.douban.com/subject/1292052/">,影片导演及出版信息等对应的源代码为<p class="">,影片评分对应的源代码为<div class="star">,影片简介对应的源代码为<p class="quote">
爬取豆瓣电影Top250影片信息 - 图4
进一步解析代码如下:

  1. // An highlighted block
  2. xpath_data=etree.HTML(data)
  3. movie_list=xpath_data.xpath('//div[@class="item"]') #获取每一部电影的全部信息
  4. data_list=[]
  5. for movie in move_list:
  6. movie_dic={}
  7. movie_dic['herf']=movie.xpath('.//div[@class="hd"]/a/@herf')[0] #获取每一部电影的链接
  8. movie_dic['name']=movie.xpath('.//a/span/text()')[0] #获取每一部电影的名字
  9. movie_dic['dir&act']=movie.xpath('.//div[@class="bd"]/p/text()')[0] .replace('\n','').replace(' ','') #获取每一部电影的导演和演员
  10. movie_dic['year&coun&class']=movie.xpath('.//div[@class="bd"]/p/text()')[1] .replace('\n','').replace(' ','') #获取每一部电影的放映时间、出版国家、标签
  11. movie_dic['rating']=movie.xpath('.//div[@class="star"]/span/text()')[0] #获取每一部电影的评分
  12. movie_dic['comment']=movie.xpath('.//div[@class="star"]/span/text()')[1] #获取每一部电影的评论人数
  13. movie_dic['summary']=movie.xpath('p[@class="quote"]/span/text()')[0].replace(' ','') #获取每一部电影的简介
  14. data_list.append(movie_dic)
  15. print(data_list)

保存数据

将解析得到的数据保存为json格式,代码如下:

  1. // An highlighted block
  2. json.dump(data_list,open('movie_250.json','w',encoding='UTF-8'))

完整代码

爬取豆瓣电影Top250影片信息的完整代码如下:

  1. // An highlighted block
  2. import json
  3. import requests
  4. from lxml import etree
  5. #构建所有的url
  6. base_url="https://movie.douban.com/top250?start={}&filter="
  7. url_list=[]
  8. for i in range(0,10):
  9. url=base_url.format(i*25)
  10. url_list.append(url)
  11. print(url_list)
  12. #数据爬取
  13. header={
  14. "Host": "movie.douban.com",
  15. "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36 Edge/18.17763"
  16. #Referer Cookie
  17. }
  18. data_list=[]
  19. for url in url_list:
  20. #发送请求
  21. data=requests.get(url,headers=header,allow_redirects=False).content.decode()
  22. print(data)
  23. #解析数据
  24. xpath_data=etree.HTML(data)
  25. movie_list=xpath_data.xpath('//div[@class="item"]') #获取每一部电影的全部信息
  26. for movie in movie_list:
  27. movie_dic={}
  28. movie_dic['herf']=movie.xpath('.//div[@class="hd"]/a/@href')[0] #获取每一部电影的链接
  29. movie_dic['name']=movie.xpath('.//a/span/text()')[0] #获取每一部电影的名字
  30. movie_dic['dir&act']=movie.xpath('.//div[@class="bd"]/p/text()')[0] .replace('\n','').replace(' ','') #获取每一部电影的导演和演员
  31. movie_dic['year&coun&class']=movie.xpath('.//div[@class="bd"]/p/text()')[1] .replace('\n','').replace(' ','') #获取每一部电影的放映时间、出版国家、标签
  32. movie_dic['rating']=movie.xpath('.//div[@class="star"]/span/text()')[0] #获取每一部电影的评分
  33. movie_dic['comment']=movie.xpath('.//div[@class="star"]/span/text()')[1] #获取每一部电影的评论人数
  34. movie_dic['summary']=movie.xpath('.//p[@class="quote"]/span/text()') #获取每一部电影的简介
  35. data_list.append(movie_dic)
  36. #存储数据
  37. json.dump(data_list,open('movie_250.json','w',encoding='UTF-8'))

参考资料:廖雪峰爬虫课程