本文将介绍如何使用爬虫在微信对话中实现实时的电影咨询爬取功能,希望和大家一起来分享”

1. 撩妹起源

俗话说的好:少壮不撩妹,长大徒伤悲啊!

说的很对,但是在这个撩妹的时代,要想成功把到妹,还真得花点心思才行啊。每次和妹子约会,妹子有时就会问:最近有啥好看的电影没?对于妹子的提问,回答要么就是不知道,要么就是自己去查app了,觉得这样有时候就缺少了一些互动的乐趣了。

在这里还是要推荐下我自己建的Python开发学习群:628979297,群里都是学Python开发的,如果你正在学习Python ,小编欢迎你加入,今天分享的这个案例已经上传到群文件,大家都是软件开发党,不定期分享干货(只有Python软件开发相关的),包括我自己整理的一份2018最新的Python进阶资料和高级开发教程,欢迎进阶中和进想深入Python的小伙伴

于是就在想,如果有个能爬取电影咨询并能自动回复的东东是不是觉得有点小惊喜呢?

效果如如下:

(后面有完整的效果)

也是前一阵闲来无事,想到这就搞了个简单的小工具,实现了在微信上实时爬取网站电影咨询的功能。这样子,以后就可以偶尔给给妹子来个小惊喜,没准儿就投怀送抱了呢。哈哈,博主也是开玩笑,其实就是觉得好玩,撸起袖子就是一顿敲。

功能分析

好了,让我们看看是怎么个一回事。

网站电影的信息来源于豆瓣,都说豆瓣评分很公正客观,所以就选了这个作为目标源了。

目标功能:

用户输入任何带有电影字样的话(如:看电影),自动跳转到页面,提供 所有电影分类供用户选择。

用户选择任意一个类型后,分别反馈给用户按热度、时间、评论顺序排列的三份前十电影表单(电影名+评分)。

用户根据提供的电影,输入任意一个电影名后,将反馈给用户关于该电影的相关详细信息表单。

要求用户可以再次输入任意电影类型去搜其它电影或者此类型的任意其它电影。

网站页面分析:

博主看到,这个页面的这些电影类型都是动态的信息(红色框),因此不能使用常规的request方法舒服的爬取了,这里将使用自动化测试工具来解决动态页面的爬取。

这是点击电影进去后看到的详细信息,这些信息是静态的,在源码中有很好的体现,因此详细信息的爬取使用前几篇分享过的request方法解析,request方法详见下面:

Python从零学爬虫

页面抓取分析:

抓取信息小编使用了Xpath定位动态数据,以及BeautifulSoup的方法定位静态数据,方法很多种不唯一,只供参考(后续马上开一篇归纳所有爬取信息的方法)。

微信对话:

与微信互动的方面,就使用简单的接口模块itchat实现

好了,到此基本的功能实现方法有了一个概况,下面看看源码。由于篇幅问题,小编这里贴上部分主要源码.

2. 源码分析

电影概况信息(电影名+评分):

def browser_action_general_info(self, type_command): """ chrome browser acts to crawl the general info to users (movie name, score) :param type_command: :return: """ self.driver.get(self.url_category) sleep(1) # 点击选择的电影类型 for num in range(0, len(movie_category)): if type_command == movie_category[num]: self.driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[2]/div[1]' '/form/div[1]/div[1]/label[{}]'.format(num+1)).click() sleep(1) # 进行电影概况信息爬取 self.browser_crawl_general_info() # 返回一个包括所有顺序排列的电影名及评分,供后边查电影具体信息查找用 return movie_info_hot + movie_info_time + movie_info_commentdef browser_crawl_general_info(self): """ crawl the general info from douban webstie :return: """ # 清空顺列排列的列表,为用户下一次操作准备 del movie_info_hot[:] del movie_info_time[:] del movie_info_comment[:] for num in range(1, 4): # 分别点击hot, time, comment顺序排列 self.driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[2]/div' '[1]/form/div[3]/div[1]/label[{}]/input'.format(num)).click() sleep(1) # 分别获取三组顺序排列的前十个电影名和评分 for counter in range(1, 11): if num == 1: movie_info_hot.append(self.get_movie_general_info(counter)) elif num == 2: movie_info_time.append(self.get_movie_general_info(counter)) elif num == 3: movie_info_comment.append(self.get_movie_general_info(counter)) else: pass # 对数据进行清洗整理 self.clean_general_info()

这里使用了Chrome浏览器作为模拟对象进行爬取,由于浏览器有点慢,操作间隙加了一些延迟,不然反应不过来。如果追求速度,也可以使用PhantomJS来代替Chrome。

使用xpath定位对象,利用鼠标点击事件完成动态操作。

电影详细信息操作:

def browser_action_detail_info(self, counter, movie_name): """ chrome browser acts to crawl the detail info for users :param counter: :param movie_name: :return: """ movie_click_num = 0 # click the type of movie # 点击上次用户选择的电影类型 for num in range(0, len(movie_category)): if command_cache[0] == movie_category[num]: self.driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[2]/div[1]' '/form/div[1]/div[1]/label[{}]'.format(num+1)).click() sleep(1) # 点击选择用户选择的电影所在顺序排列 self.driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[2]/div' '[1]/form/div[3]/div[1]/label[{}]/input'.format(counter)).click() sleep(1) if counter == 1: for x in range(0, len(movie_info_hot)): if movie_name in movie_info_hot[x]: movie_click_num = x + 1 elif counter == 2: for x in range(0, len(movie_info_time)): if movie_name in movie_info_time[x]: movie_click_num = x + 1 else: for x in range(0, len(movie_info_comment)): if movie_name in movie_info_comment[x]: movie_click_num = x + 1 # 点击电影名称进入详细页面,记录详细页面的url movie_detail_url = self.driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div[4]/div/a[{}]' .format(movie_click_num)).get_attribute('href') return movie_detail_url

根据用户输入的电影名,查找其在详细列信息列表movie_info_all(三个顺序排列列表hot, time,

comment的顺序extend总和)的位置

进而定位电影名在哪个排列列表中里面,然后点击进去获得该电影的url

电影详细信息页面下载:

@staticmethod def download_detail_info_html(url_target): """ download douban target html :param url_target: :return: """ try: response = urllib.request.Request(url_target, headers=headers) result = urllib.request.urlopen(response) html = result.read().decode('utf-8') # 返回下载的网页html,以供下一步进行数据提取 return html except urllib.error.HTTPError as e: if hasattr(e, 'code'): print(e.code) except urllib.error.URLError as e: if hasattr(e, 'reason'): print(e.reason)

根据上面返回的电影名url进行request下载,并返回下载的html。

由于不是海量数据爬取,也没加入代理IP池等反爬技术。

电影详细信息解析(字段):

@staticmethod def parse_detail_info(html_result): """ parse the html downloaded :param html_result: :return: """ # 清空详细信息列表 del movie_detail_info[:] # 定义详细信息字段  movie_name = '' actor_name_list = '主演: ' director_name = '导演: ' movie_type = '类型: ' movie_date = '上映日期: ' movie_runtime = '片长: ' soup = BeautifulSoup(html_result, 'lxml') # 用BeautifulSoup方法从下载页面中提取字段信息 movie_name = movie_name + soup.find('span', property='v:itemreviewed').string.strip() + soup.find('span', class_='year').string.strip() director_name = director_name + soup.find('a', rel='v:directedBy').string.strip() for x in soup.find_all('a', rel='v:starring'): actor_name_list = actor_name_list + x.string.strip() + '/' for x in soup.find_all('span', property='v:genre'): movie_type = movie_type + x.string.strip() + '/' for x in soup.find_all('span', property='v:initialReleaseDate'): movie_date = movie_date + x.string.strip() + '/' movie_runtime = movie_runtime + soup.find('span', property='v:runtime').string.strip() # 将所有字段信息字符串放入详细信息列表中 movie_detail_info.append(movie_name) movie_detail_info.append(director_name) movie_detail_info.append(actor_name_list) movie_detail_info.append(movie_type) movie_detail_info.append(movie_date) movie_detail_info.append(movie_runtime)

在函数体开头清空movie_detail_info,以准备用户下次的操作。

根据提供的html进行详细信息字段的解析,将各个字段字符串放进movie_detail_info大列表中。

Wehchat微信数据交换接口:

@itchat.msg_register(itchat.content.TEXT, itchat.content.PICTURE)def simple_reply(msg):global movie_info_all# 接受用户任意包含“电影”的字样,跳转到指定页面等待if u'电影' in msg['Text']: douban_object.browser_hotopen() douban_object.cvt_cmd_to_ctgy_url(msg['Text']) movie_category_option = ' '.join(douban_crawl.movie_category) itchat.send_msg('----请选择一种类型---- ' + movie_category_option, msg['FromUserName'])# 接受用户的电影类型输入,并执行概况信息爬取,然后反馈给用户elif msg['Text'] in douban_crawl.movie_category: itchat.send_msg('正在查找' + msg['Text'] + '电影...', msg['FromUserName']) del douban_crawl.command_cache[:] douban_crawl.command_cache.append(msg['Text']) # 进行概况信息爬取,并将所有排列列表扩展到一起 movie_info_all = douban_object.browser_action_general_info(msg['Text']) itchat.send_msg('----按热度排序---- ' + ' ' + ' '.join(douban_crawl.movie_info_hot), msg['FromUserName']) itchat.send_msg('----按时间排序---- ' + ' ' + ' '.join(douban_crawl.movie_info_time), msg['FromUserName']) itchat.send_msg('----按评论排序---- ' + ' ' + ' '.join(douban_crawl.movie_info_comment), msg['FromUserName'])# 接受用户的电影名的选择,并进行指定电影的详细字段爬取,然后返回给用户else: search_num = 0 for x in movie_info_all: if msg['Text'] in x: itchat.send_msg('正在查找' + msg['Text'] + '...', msg['FromUserName']) loc = movie_info_all.index(x) if 0 <= loc < 10: search_num = 1 elif 10 <= loc < 20: search_num = 2 else: search_num = 3 break url_result = douban_object.browser_action_detail_info(search_num, msg['Text']) html_result = douban_object.download_detail_info_html(url_result) douban_object.parse_detail_info(html_result) itchat.send_msg(' '.join(douban_crawl.movie_detail_info), msg['FromUserName'])

movie_detail_info等的一些列表都是用了join方法字符串化了,并用n隔开。

以上就是大部分的核心源码了,写的有点糙,欢迎大家一起讨论和指正。

3.功能效果图

4.总结归纳

模块使用

使用Selenium工具进行动态操作

使用request进行相应静态请求下载

使用Selenium的xpath进行数据定位和提取

使用BeautifulSoup进行数据提取

使用itchat完成微信对话数据交互

python自动爬取更新电影网站_Python爬虫之—微信实时爬取电影咨询相关推荐

  1. python爬取虎扑评论_python爬虫系列Selenium定向爬取虎扑篮球图片详解

    前言: 作为一名从小就看篮球的球迷,会经常逛虎扑篮球及湿乎乎等论坛,在论坛里面会存在很多精美图片,包括NBA球队.CBA明星.花边新闻.球鞋美女等等,如果一张张右键另存为的话真是手都点疼了.作为程序员 ...

  2. python爬去百度百科词条_Python爬虫入门学习实践——爬取小说

    本学期开始接触python,python是一种面向对象的.解释型的.通用的.开源的脚本编程语言,我觉得python最大的优点就是简单易用,学习起来比较上手,对代码格式的要求没有那么严格,这种风格使得我 ...

  3. python爬取网页数据软件_python爬虫入门10分钟爬取一个网站

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  4. python爬取京东商品属性_python爬虫小项目:爬取京东商品信息

    #爬取京东手机信息 import requests from bs4 import BeautifulSoup from selenium import webdriver import re imp ...

  5. python爬取b站评论_Python爬虫框架:scrapy抓取B站博人传评论数据

    1. B站博人传评论数据爬取简介 今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看.网址 ...

  6. python爬虫爬音乐格式是什么_Python爬虫练习:去爬某平台音乐

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于IT共享之家 ,作者IT共享者 现在的听歌软件动不动就是各种 ...

  7. python自动爬取更新电影网站_python爬取电影网站信息

    一.爬取前提 1)本地安装了mysql数据库 5.6版本 2)安装了Python 2.7 二.爬取内容 电影名称.电影简介.电影图片.电影下载链接 三.爬取逻辑 1)进入电影网列表页, 针对列表的ht ...

  8. python爬取豆瓣电影信息_Python爬虫入门 | 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

  9. python爬虫电影信息_Python爬虫入门 | 爬取豆瓣电影信息

    这是一个适用于小白的Python爬虫免费教学课程,只有7节,让零基础的你初步了解爬虫,跟着课程内容能自己爬取资源.看着文章,打开电脑动手实践,平均45分钟就能学完一节,如果你愿意,今天内你就可以迈入爬 ...

最新文章

  1. Flink在美团的应用与实践听课笔记
  2. 面试:说说 HTTPS 的工作原理?
  3. wukong搜索引擎源码解读
  4. Java 中浮点数---------BigDecimal和double(初探)
  5. 并查集【CF731C】Socks
  6. Android版添加phonegap--websocket客户端插件教程
  7. java 类 属性数量_跟我学java编程—Java类的属性与成员变量
  8. layui下拉框的高度_LAYUI select 下拉框得高度
  9. flutter中使用InkWell给任意Widget添加点击事件
  10. #开工新姿势#开启一年新征程,云社区叫你来充电啦!
  11. HTML5给我们带来了什么
  12. PHP连接mysql数据库使用方法,PHP连接MySQL数据库的操作方法
  13. C++11 range-based for loop
  14. quartus仿真22:优先编码器74148的级联(详细)
  15. Android SharedPreferences的简单使用
  16. 【渝粤教育】国家开放大学2018年春季 8647-21T工程经济与管理 参考试题
  17. 字节流Stream(Output 、Input)、字符流(Reader、Writer)
  18. 自媒体平台数据统计分析爬虫系列教程文档
  19. Chrome 配置samesite=none方式
  20. 网页Loding效果的实现

热门文章

  1. 这是未来的隐私工具吗?
  2. python如何计算平均分_python脚本如何输入成绩求平均分?
  3. 【C语言】5个成绩,去掉最高分,去掉最低分,求 平均分
  4. nexmo - 电话报警Alert
  5. Widget-苹果.谷歌和诺基亚着迷的网络新思维
  6. Mysql基础篇(1)—— 基础概念、DML基本语法和表连接
  7. python+cv2+pyzbar 二维码画框、角度
  8. tableSizeFor的理解
  9. 一个网站做渗透测试对企业的安全性建议
  10. 网警如何查虚拟服务器,网警查高防云服务器