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

news/2024/7/3 2:14:05
本文使用的是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数据库中进行存储。

http://lihuaxi.xjx100.cn/news/236290.html

相关文章

大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc

昆明理工大学大一C语言大作业题目综合性实践排序求平均值(包括将数拆散求最大最小值)。函数ReadDat()随机产生100个存放到数组aa中00个jsSort()函数的功能是&#xff1a;进行降序排列。最后调用函数WriteDat()函数函数ReadDat()00个四位数存入数组a中&#xff0c;函数jsValue()…

NAT环境无法访问云端的深层次分析

这是一次我维护runningdoctor时候遇到的问题现象&#xff1a;1.用户无法打开web.runningdoctor.cn 2.监控状态无异常、无报警 3.tracert结果无异常、丢包率正常 4.用户无法访问的时候&#xff0c;我们能打开网站 5.多地代理访问网站&#xff0c;结果正常 6.有打开网站特别慢的时…

[附源码]Python计算机毕业设计SSM-乐室预约小程序(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

并发任务的可视化

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

用devcpp如何编码c语言,Dev C++的使用

我们在使用之前先准备一段C语言代码。#include int main(){printf("欢迎进入C语言网&#xff01;");return 0;}1. 新建文件初步使用这款软件&#xff0c;我们先选择源文件进行创建&#xff0c;打开软件后点击左上角的File->New->Source File,也可以使用快捷键C…

代替国足踢决赛?马宁当选卡日大战第四官员

卡塔尔杀进亚洲杯决赛。 图片来源&#xff1a;Osports全体育图片社 中新网1月30日电 日本与卡塔尔将会师本届亚洲杯的决赛。北京时间30日&#xff0c;亚足联官方已经公布了本次决赛的裁判组&#xff0c;中国裁判员马宁将担任第四官员。 来自乌兹别克斯坦的亚洲金哨伊尔马托夫将…

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;磨炼了的价值观在自己心里就好。 类似的还有 1. 罗振宇不发年终奖&#xff1a;https://xueqiu.com/7118120763/119669075 2. 有赞白鸦强行一波996&#xff1a;https://baijiahao.baidu.com/s?id1623959680…