12行Python暴力爬《黑豹》豆瓣短评

12人阅读 评论(0) 收藏 举报
分类:

作者:黄嘉锋

来源:https://www.jianshu.com/p/ea0b56e3bd86


草长莺飞,转眼间又到了三月“爬虫月”。
这时往往不少童鞋写论文苦于数据获取艰难,辗转走上爬虫之路;
许多分析师做舆情监控或者竞品分析的时候,也常常使用到爬虫。

今天,本文将带领小伙伴们通过12行简单的Python代码,初窥爬虫的秘境。

爬虫目标


本文采用requests + Xpath,爬取豆瓣电影《黑豹》部分短评内容。话不多说,代码先上:

import requests; from lxml import etree; import pandas as pd; import time; import random; from tqdm import tqdm
name, score, comment = [], [], []
def danye_crawl(page):
   url = 'https://movie.douban.com/subject/6390825/comments?start=%s&limit=20&sort=new_score&status=P&percent_type='%(page*20)
   response = etree.HTML(requests.get(url).content.decode('utf-8'))
   print('\n', '第%s页评论爬取成功'%(page)) if requests.get(url).status_code == 200 else print('\n', '第%s页爬取失败'(page))
   for i in range(1,21):
       name.append(response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/a'%(i))[0].text)
       score.append(response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]'%(i))[0].attrib['class'][7])
       comment.append(response.xpath('//*[@id="comments"]/div[%s]/div[2]/p'%(i))[0].text)
for i in tqdm(range(11)): danye_crawl(i); time.sleep(random.uniform(6, 9))
res = pd.DataFrame({'name':name, 'score':score, 'comment':comment},columns = ['name','score','comment']); res.to_csv("豆瓣.csv")

运行以上的爬虫脚本,我们得以见证奇迹


爬虫结果与原网页内容的对比,完全一致


通过tqdm模块实现了良好的交互


工具准备


  • chrome浏览器(分析HTTP请求、抓包)

  • 安装Python 3及相关模块(requests、lxml、pandas、time、random、tqdm)
    requests:用来简单请求数据
    lxml:比Beautiful Soup更快更强的解析库
    pandas:数据处理神器
    time:设置爬虫访问间隔防止被抓
    random:随机数生成工具,配合time使用
    tqdm:交互好工具,显示程序运行进度


基本步骤


  1. 网络请求分析

  2. 网页内容解析

  3. 数据读取存储


涉及知识点


  • 爬虫协议

  • http请求分析

  • requests请求

  • Xpath语法

  • Python基础语法

  • Pandas数据处理


爬虫协议


爬虫协议即网站根目录之下的robots.txt文件,用来告知爬虫者哪些可以拿哪些不能偷,其中Crawl-delay告知了网站期望的被访问的间隔。(为了对方服务器端同学的饭碗,文明拿数据,本文将爬虫访问间隔设置为6-9秒的随机数)

豆瓣网站的爬虫协议


HTTP请求分析


使用chrome浏览器访问《黑豹》短评页面https://movie.douban.com/subject/6390825/comments?sort=new_score&status=P,按下F12,进入network面板进行网络请求的分析,通过刷新网页重新获得请求,借助chrome浏览器对请求进行筛选、分析,找到那个Ta

豆瓣短评页面请求分析


通过请求分析,我们找到了目标url为
'https://movie.douban.com/subject/6390825/comments?start=0&limit=20&sort=new_score&status=P&percent_type=',并且每次翻页,参数start将往上增加20
(通过多次翻页尝试,我们发现第11页以后需要登录才能查看,且登录状态也仅展示前500条短评。作为简单demo,本文仅对前11页内容进行爬取)


requests请求


通过requests模块发送一个get请求,用content方法获取byte型数据,并以utf-8重新编码;然后添加一个交互,判断是否成功获取到资源(状态码为200),输出获取状态

请求详情分析


(除了content,还有text方法,其返回unicode字符集,直接使用text方法遇到中文的话容易出现乱码)


Xpath语法解析


获取到数据之后,需要对网页内容进行解析,常用的工具有正则表达式、Beautiful Soup、Xpath等等;其中Xpath又快又方便。此处我们通过Xpath解析资源获取到了前220条短评的用户名、短评分数、短评内容等数据。
(可借助chrome的强大功能直接复制Xpath,Xpath语法学习http://www.runoob.com/xpath/xpath-tutorial.html)


数据处理


获取到数据之后,我们通过list构造dictionary,然后通过dictionary构造dataframe,并通过pandas模块将数据输出为csv文件


结语与彩蛋


本例通过requests+Xpath的方案,成功爬取了电影《黑豹》的部分豆瓣短评数据,为文本分析或其他数据挖掘工作打好了数据地基。
本文作为demo,仅展示了简单的爬虫流程,更多彩蛋如请求头、请求体信息获取、cookie、模拟登录、分布式爬虫等请关注后期文章更新哟。


最后,送上白话文版的代码:

import requests
from lxml import etree
import pandas as pd
import time
import random
from tqdm import tqdm

name, score, comment = [], [], []

def danye_crawl(page):
   url = 'https://movie.douban.com/subject/6390825/comments?start=%s&limit=20&sort=new_score&status=P&percent_type='%(page*20)
   response = requests.get(url)
   response = etree.HTML(response.content.decode('utf-8'))
   if requests.get(url).status_code == 200:
       print('\n', '第%s页评论爬取成功'%(page))
   else:
       print('\n', '第%s页爬取失败'(page))

   for i in range(1,21):
       name_list = response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/a'%(i))
       score_list = response.xpath('//*[@id="comments"]/div[%s]/div[2]/h3/span[2]/span[2]'%(i))
       comment_list = response.xpath('//*[@id="comments"]/div[%s]/div[2]/p'%(i))

       name_element = name_list[0].text
       score_element = score_list[0].attrib['class'][7]
       comment_element = comment_list[0].text

       name.append(name_element)
       score.append(score_element)
       comment.append(comment_element)

for i in tqdm(range(11)):
   danye_crawl(i)
   time.sleep(random.uniform(6, 9))

res = {'name':name, 'score':score, 'comment':comment}
res = pd.DataFrame(res, columns = ['name','score','comment'])
res.to_csv("豆瓣.csv") 关注【Python开发者交流平台】公众号 ,在微信后台回复【领取资源】,获取IT资源200G干货大全。
查看评论

Python全栈工程师-第12周

Python全栈工程师-WEB开发部分
  • 2018年01月28日 18:55

Python 3.6 爬虫爬取豆瓣《孤芳不自赏》短评

使用Python 3.6 进行对《孤芳不自赏》这部作品的短评爬取这部作品短评在豆瓣中的URL为:https://movie.douban.com/subject/26608228/comments?s...
  • c091728
  • c091728
  • 2017-10-25 22:54:38
  • 792

python爬虫 登陆豆瓣 爬豆瓣电影短评

       这个爬虫的目的是爬取豆瓣电影短评和评分(从1星到5星),这些东西可以做情感分类。由于不登录的情况下只能看电影短评的前几页,所以要实现登陆豆瓣。       登陆豆瓣的部分是在网上看的别人...
  • u013781175
  • u013781175
  • 2016-07-06 12:07:30
  • 2960

爬虫笔记-使用python爬取豆瓣短评

之前说明 # -*- encoding:utf-8 -*- import requests from bs4 import BeautifulSoup import re import random...
  • hustllx
  • hustllx
  • 2017-11-28 09:45:05
  • 285

使用requests爬取豆瓣《长城》影评

上一篇文章介绍了使用urllib包爬取《长城》豆瓣影评数据,但是无法爬取所有的数据,只能爬到几百条数据就会被服务器禁止访问。也不知道是什么原因。这里要注意,我是用python3中的urllib.req...
  • chenpe32cp
  • chenpe32cp
  • 2017-01-08 10:05:52
  • 864

Python爬虫(入门+进阶)学习笔记 1-3 使用Requests爬取豆瓣短评

Requests库介绍:Requests库官方的介绍有这么一句话:Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用。 这句话直接并霸气地宣示了Requests库是p...
  • kissazhu
  • kissazhu
  • 2018-03-27 17:07:06
  • 74

使用python爬取《长城》豆瓣影评

声明:这里参考了这篇博客的代码爬取豆瓣影评时,不能使用最简单粗暴的爬虫策略,因为豆瓣服务器 是有反爬虫机制的。简单的粗暴的方式只能爬取四页就会被禁掉。所以这里必须要使用表头,伪装成使用浏览器进行访问...
  • chenpe32cp
  • chenpe32cp
  • 2017-01-07 23:16:05
  • 1395

Scrapy 爬取 豆瓣电影的短评

之前爬取电影信息的时候,将电影短评的url一并存起来了。 因此爬取电影短评的时候只需将数据库中存在的url 放入start_urls中就好了。spider.py# -*- coding: utf-8...
  • u013402772
  • u013402772
  • 2016-04-15 10:30:35
  • 3139

豆瓣短评爬虫

  • 2012年06月02日 13:47
  • 6.25MB
  • 下载

使用BeautifulSoup实现简单豆瓣爬虫

最近想做一个图书排行榜的一个web项目,基础框架也搭建完毕。但是在实现View的时候,发现了一个问题——坑爹啊 小哥我没数据啊 !!! 不过哥我也很机智,瞬间就有了两个方案: 1.搭好管理后台,然...
  • danny_amos
  • danny_amos
  • 2015-07-24 16:44:40
  • 1043
    个人资料
    持之以恒
    等级:
    访问量: 1万+
    积分: 1666
    排名: 3万+
    博客专栏
    文章存档
    最新评论