当前位置: 首页 > 编程日记 > 正文

python爬取电影和美食数据实战

本文使用的是requests+正则来匹配网页内容,对于数据量较多的采用了多线程抓取的方法,共3个案例,分别是抓取猫眼电影TOP100榜单和淘票票正在热映的电影信息、以及美团的美食数据。这几个案例采用的方法大同小异。

1、首先选择想要爬取的网站
2、确定要用的模块,requests,json,re三个模块,如果想加快爬取速度可以加一个Pool
3、 网页请求,先得到整个页面,需要加一个headers来进行请求,否则会被网站拦截
4、格式化整个页面,通过patter的正则来匹配,找出我们需要的内容,
5、   获取数据,findall,然后通过yield将数据返回,yield 是一个类似 return 的关键字,迭代一次遇到yield时就返回yield后面(右边)的值
6、遍历获取到的数据
7、保存到相应的文档中
8、关闭文档,
9、提示数据保存成功。


一、爬取猫眼电影Top100榜单的数据
4b481a8b06d0cb199a85ff95b6b340cce5e1c2eb
import requests
from multiprocessing import Pool
from requests.exceptions import RequestException
import re
import json

def get_one_page(url):
try:
headers = {
"user-agent"'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
11
response = requests.get(url, headers=headers)
if response.status_code ==200:
return response.text
return None
except RequestException:
return None

def parse_one_page(html):
pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'
'.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'
'.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)

items =re.findall(pattern,html)
for item in items:
yield {
'index':item[0],
'image':item[1],
'title':item[2],
'actor':item[3].strip()[3:],
'time': item[4].strip()[5:],
'score': item[5] + item[6]
}

def write_to_file(content):
with open('result.txt', 'a', encoding='utf-8'as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')
f.close()


def main(offset):
url ='http://maoyan.com/board/4?offset='+str(offset)
html = get_one_page(url)
for item in parse_one_page(html):
#print(item)
write_to_file(item)

if __name__ == '__main__':
#for i in range(10):
# main(i*10)
pool = Pool()
pool.map(main,[i*10 for i in range(10)])


结果:将爬取的数据存放到文本文件中,
因为我这边采用的是线程池爬取的,所以有时候是不按顺序进行存储的,如果采用非多线程方式,就会按照顺序进行存储。

2f93b76a44a7a37d8643afa3308dd20b8e60e957



二、爬取淘票票正在热映的电影

09312c3acc4fd4721f2ecc9d0f823f8cab28a11a
可以看到网页结构如下,我这边使用了正则匹配的方法进行查找:

54a5bc36a9ccfe0eab00f53fefa0cd3211663879
代码如下:

import requests
from requests.exceptions import RequestException
import re
import json

def get_one_page(url):
    try:
        headers = {
            "user-agent"'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}
        11
        response = requests.get(urlheaders=headers)
        if response.status_code ==200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):

    pattern = re.compile('<div class="movie-card-poster">.*?data-src="(.*?)".*?<span class="bt-l">(.*?)</span>.*?<span class="bt-r">(.*?)</span>.*?<div class="movie-card-list">.*?<span>(.*?)</span>'
    +'.*?<span>(.*?)</span>.*?<span>(.*?)</span>.*?<span>(.*?)</span>.*?<span>(.*?)</span>.*?<span>(.*?)</span>',re.S)

    items = re.findall(patternhtml)
    for item in items:
        yield {
            'image': item[0],
            'title': item[1],
            'score': item[2],
            'director': item[3].strip()[3:],
            'actor': item[4].strip()[3:],
            'type': item[5].strip()[3:],
            'area': item[6].strip()[3:],
            'language': item[7].strip()[3:],
            'time': item[8].strip()[3:]
        }


def write_to_file(content):
    with open('movie-hot.txt''a'encoding='utf-8'as f:
        f.write(json.dumps(contentensure_ascii=False) + '\n')
        f.close()


def main():
    url ='https://www.taopiaopiao.com/showList.htm'
    html = get_one_page(url)
    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

if __name__ == '__main__':
       main()


结果:
f09314f5878a685c3256130bc49a0674502b6f53

三、爬取美团(深圳)美食店铺信息,评分大于4.0分的店铺

做为一名吃货,想知道我所在是城市的美食店,所以爬取评分较高的店铺信息:

eff3fd8f412f77c7ec54dd9d957e4ad206728d09



美团的这个网页的不同之处在于,全部是通过js渲染生成的,所以我这边是拿到页面后,在js里面查找到的数据,然后用正则来匹配。

import requests
from multiprocessing import Pool
from requests.exceptions import RequestException
import re
import json
"""
author  朱培
title   爬取美团(深圳)美食店铺信息,评分大于4.0分的店铺

"""
def get_one_page(url):
    try:
        headers = {
            "user-agent"'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}

        response = requests.get(urlheaders=headers)
        if response.status_code ==200:
            return response.text
        return None
    except RequestException:
        return None

def parse_one_page(html):

    pattern = re.compile('"poiId":(.*?),"frontImg":"(.*?)","title":"(.*?)","avgScore":(.*?),"allCommentNum":(.*?)'
    +',"address":"(.*?)","avgPrice":(.*?),'re.S)

    items = re.findall(patternhtml)
    for item in items:
        if float(item[3]) >= 4.0:
            yield {
                'poiId': item[0],
                'frontImg': item[1],
                'title': item[2],
                'avgScore': item[3],
                'allCommentNum':item[4],
                'address': item[5],
                'avgPrice': item[6]
            }


def write_to_file(content):
    with open('food-meituan.txt''a'encoding='utf-8'as f:
        f.write(json.dumps(contentensure_ascii=False) + '\n')
        f.close()


def main(n):
    url ='http://sz.meituan.com/meishi/pn'+str(n)+'/'
    html = get_one_page(url)

    for item in parse_one_page(html):
        print(item)
        write_to_file(item)

if __name__ == '__main__':
    #for i in range(32):
    #     main(i)
    pool = Pool()
    pool.map(mainfor in range(32)])


结果如下:

391899ec09b2dd677c0a9e8d3c7f13fa0ddd3d97

对于后期,可以选择把这个数据落库,常用的可以放在mongodb或者mysql数据库中进行存储。

相关文章:

Asp.Net页面执行流程分析

在我的上一篇文章中说到了HttpModule、HttpHandle的简单使用&#xff0c;我们可以利用它们在页面请求的过程中加入自己的事件处理程序。那么在一个aspx页面请求时后台到底做了什么&#xff1f;当然asp.net做了很多事情&#xff0c;过程也比较复杂&#xff0c;本文主要分析一下大…

正则验证非法字符

function regText(text){var reg /^[\s\u4e00-\u9fa5a-z0-9_-]{0,}$/;if(!reg.exec(text)){console.log("非法字符")}else{console.log("有效字符")} } regText("abc") 验证 &#xff1a;汉字、英文、数字、下划线、中划线、空格 转载于:https…

活动排序工具之双代号网络(AOA)与单代号网络(AON)[cont.]

箭线图ADM/双代号网络AOA 图示 箭线表示活动 节点表示一个活动的开始或结束 三要素&#xff1a;结点、箭线、线路 唯一使用虚活动的活动排序工具&#xff0c;虚活动用虚线箭头表示&#xff0c;没有历时&#xff0c;不需资源&#xff0c;只表达活动关系的需要 只使用一种活动之…

并发任务的可视化

一、任务要求&#xff1a;在linux系统中设计一个父进程&#xff0c;三个子进程(A,B,C)。子进程A,B同时被父进程启动来计算&#xff08;不实现具体的计算任务&#xff0c;先用CPU空跑来代替&#xff09;。进程A计算5分钟&#xff0c;而进程B计算8分钟。当进程A,B都计算完成后才能…

银监会警示担保圈贷款风险 联保贷款变异 防多米诺效应

互保联保本是解决小微企业以及农村金融贷款需求的重要创新&#xff0c;但却在部分行业、部分地区逐渐变异&#xff0c;成为引发风险事件的诱因。 据媒体报道&#xff0c;银监会近日发文要求加强企业担保圈贷款风险的防范和化解工作。银监会警示&#xff0c;担保圈企业风险较高的…

SharePoint 2007 系列(4) -Site Settings

Site administration 转载于:https://www.cnblogs.com/xuxiaoguang/archive/2008/11/05/1326913.html

软件项目管理重点总结

文章目录概论走进项目管理把控环境&#xff0c;控制过程整合项目资源控制项目范围保障项目进度驾驭项目成本保证项目质量协调项目人力资源改善项目的沟通应对项目风险关注项目的采购和外包概论 项目的定义&#xff1a;为创造一个特定的产品、服务或者成果而采取的临时性的努力…

jQuery发送含有数组参数的ajax请求以及后台Struts2的OGNL解析错误

当使用jquery1.3以上版本时&#xff0c;进行ajax参数传值时&#xff0c;会出现以下的一个错误: ognl.ExpressionSyntaxException: Malformed OGNL expression: f[] [ognl.ParseException: Encountered " "]" "] "" at line 1, column 3. 这个错…

数据绑定以及Container.DataItem绑定技巧

数据绑定以及Container.DataItem绑定技巧 灵活的运用数据绑定操作绑定到简单属性:<%#UserName%>绑定到集合:<asp:ListBox id"ListBox1" datasource<%# myArray%> runat"server">绑定到表达式:<%#(class1.property1.ToString() "…

LeetCode 76. Minimum Window Substring / 567. Permutation in String

76. Minimum Window Substring 典型Sliding Window的问题&#xff0c;维护一个区间&#xff0c;当区间满足要求则进行比较选择较小的字串&#xff0c;重新修改start位置。 思路虽然不难&#xff0c;但是如何判断当前区间是否包含所有t中的字符是一个难点&#xff08;t中字符有重…

计算机网络中的协议数据单元的控制信息主要包括哪些内容

在计算机网络的数据传输过程中会对数据进行封装&#xff0c;俗称加头(链路层还会加尾)&#xff0c;增加的控制信息主要包括以下内容&#xff1a; 地址(Address)&#xff1a;用来标识发送端或接收端差错检测编码(Error-detecting code)&#xff1a;用于差错检测或纠正协议控制(…

jQuery 超屏加载

jQuery 超屏加载&#xff0c;当文档超出屏幕的高度时&#xff0c;加载最新下个列数据 $(window).scroll(function () {var height $(document).height(); //页面的高度var keheight $(window).height(); //浏览器可视的高度var sheight $(document).scrollTop(); //滚动的高…

自己动手,打造轻量级VSCode/C#环境代替LinqPad

.Net 的项目都挺重的&#xff0c;一直想找一个轻量级的 CSharp 环境&#xff0c;能像Python那样&#xff0c;选一个文件就能跑的。之前用的是 LinqPad&#xff0c;但它的缺点也很明显&#xff1a; &#xff08;1&#xff09; 不付费&#xff0c;自动完成不能用&#xff08;…

让html:error只显示第一条错误信息

struts-config.xml 中的 <plug-in className"org.apache.struts.validator.ValidatorPlugIn"> 里面加上 <set-property property"stopOnFirstError" value"true"/> 就可以了 </plug-in> 转载于:https://www.cnblogs.com/kakak…

(C++)除基取余法:将十进制数转化为Q进制数

所谓基&#xff0c;就是指将要转换成的进制Q。 除基取余的意思就是&#xff1a;每次将待转换数除以Q&#xff0c;然后将得到的余数作为低位存储&#xff0c;而商则继续除以Q并重复上面的操作&#xff0c;直至商0时&#xff0c;将所有位从高到低输出就可以得到Q进制数。 代码实…

《C++ Primer 4th》读书笔记 第5章-表达式

原创文章&#xff0c;转载请注明出处&#xff1a; http://www.cnblogs.com/DayByDay/p/3912114.html 转载于:https://www.cnblogs.com/DayByDay/p/3912114.html

vue - check-versions.js for child_process

webpack之类的配置文件. webpack.base.conf.js

EasyPHP-2.0b1+ Mantis-1.1.0安装及技巧

转载&#xff1a; EasyPHP-2.0b1 Mantis-1.1.0安装及技巧 注&#xff1a;部分配置来源网络&#xff0c;写此文仅为以后配置提供参考 Mantis是一个轻量级的brower的bug管理系统&#xff0c;界面直观&#xff0c;简单易用&#xff0c;安装简单&#xff0c;支持多语言&#xff0c;…

PAT 显示格式错误

记录一&#xff1a; 2021/7/8 10:26 代码逻辑写错了&#xff0c;一个该没有空格的地方也加了空格

翡润年华-毛货展示003

www.520jade.com转载于:https://www.cnblogs.com/520jade/p/3912790.html

json学习之路

总感觉自己比别人慢好几排&#xff0c;不知道到底多少&#xff0c;但至少一排吧&#xff1f;&#xff1f;&#xff1f; 一直很喜欢js&#xff0c;但刚开始编程的时候一直把js停留在"有效性验证"上&#xff0c;大大浪费了js.不过当时已经知道js很强大了&#xff0c;可…

layoutSubviews 调用情况

init初始化不会触发layoutSubviews 但是是用initWithFrame 进行初始化时&#xff0c;当rect的值不为CGRectZero时,也会触发addSubview会触发layoutSubviews设置view的Frame会触发layoutSubviews&#xff0c;当然前提是frame的值设置前后发生了变化滚动一个UIScrollView会触发la…

python基本数据类型之序列类型和映射类型

序列类型&#xff1a;字符串/元组/列表 映射类型&#xff1a;字典 更正&#xff1a;&#xff1a;三引号也可以用来表示字符串&#xff0c;并且有额外用途&#xff1a;①搞定多行字符串 ②内用单引号和双引号 列表可以根据内容得到索引 有多个相同内容时根据第一个得到下标

关于EF中ApplyCurrentValues和ApplyOriginalValues区别

关于EF中ApplyCurrentValues和ApplyOriginalValues区别&#xff1a;两者都是编辑数据时使用。 // // 摘要: // 将 System.Data.Objects.ObjectStateEntry 的 System.Data.Objects.ObjectStateEntry.CurrentValues // 属性设置为与所提供对象的属性…

PHP Session中保存Object

在PHP中&#xff0c;使用Session保存Object时&#xff0c;PHP会将Object自动序列化。在读取Session变量时&#xff0c;准确地说是在session_start时&#xff0c;PHP会将Session中已序列化的Object反序列化。这时就需要Class的定义&#xff0c;Why&#xff1f;因为序列化时只是保…

kali linux网络配置

事情是这样的 今天早上想安装一个按个人信息生成密码的软件 发现无法安装 发现问题后 我首先检查了kali有没有获取到IP 然后就是没有获取IP 怎么解决问题如下&#xff1a; 原理进程&#xff1a; 1.写入dhcp服务 1.进行DNS设置 首先输入命令&#xff1a; gedit /etc/network/int…

流程快速开发平台,工作流引擎中间件,工作质量考核设计

为什么80%的码农都做不了架构师&#xff1f;>>> 工作质量考核设计关键字&#xff1a;CCBPM工作质量考核时效考核 需求背景:我们把在工作流程引擎中的考核分为两种模式&#xff0c;一种是时效考核、另外一种是质量考核。 时效考核就是对用户的操作进行时间点的记录&…

Windows 7 操作系统核心文件

【Windows\Boot】启动必须文件 【Windows\Help】帮助文件 【Windows\inf】安装硬件和软件时所需的inf文件 【Windows\System32】系统的主要组件 ActiveX文件&#xff08;*.ocx&#xff09;应用程序应用程序扩展&#xff08;*.dll&#xff09;控制面板项&#xff08;*.cpl&#…

安装SQL SERVER2000提示注册表文件被挂起的解决方案

在安装SQL SERVER 2000时出现如下的提示&#xff1a; “以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机。” 按照提示重启计算机&#xff0c;再安装&#xff0c;仍然出现同样的提示。这是因为安装程序在先前的安装过程中在系统注册…