热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Python3爬虫从零开始:抓取天猫电影排行

抓取分析首先打开要抓取的目标站点:http:maoyan.comboard4我们需要爬取得实惠电影名称、主演、评分等信息。可以看到在这个页面只有10部影片࿰

抓取分析

    首先打开要抓取的目标站点:http://maoyan.com/board/4

    我们需要爬取得实惠电影名称、主演、评分等信息。可以看到在这个页面只有10部影片,而我们需要爬取前100,也就是需要爬取10页。

    滚动到最下方分页列表,打开下一页,可以看到页面的URL发生了变化,多了参数offset=10。根据这个规律,我们可以通过改变URL的offset参数请求10次即可。

补充:确定一个网站是否可被爬取,可以先在网站根目录下查看Robots协议确定是否可爬:

 


抓取一页

这里,我们将提取一页的代码用一个函数表示:

def get_one_page(url):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.17 Safari/537.36',}response = requests.get(url,headers = headers)if response.status_code == 200:return response.textreturn Nonedef main():url = 'http://maoyan.com/board/4'html = get_one_page(url)print(html)main()

这样就可以得到我们的页面源代码。

 


正则提取

    这里,我们要按需进行提取,网页源码信息那么多,但是我们只需要提取我们需求的影片信息。因此,需要对源码进行正则提取,首先就要找到我们需要的信息的源码部分。F12在网页中打开【开发者模式】,在【Network】中左边打开4?offset=0的文件,可以看到源代码。

!注意,不要在【Elements】中直接查看源码,因为【Elements】中的源码可能经过Javascript操作(如果有的话)与原始请求页面不一样。

 

根据我们需要提取的信息构造我们的正则表达式:

#排名信息:

.*?board-index.*?>(.*?)

#图片信息:

.*?board-index.*?>(.*?).*?data-src="(.*?)"

#名字信息:

.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?)

#主演等等:

.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star">(.*?)

.*?releasetime">(.*?)

.*?integer">(.*?).*?fraction">(.*?).*?

def parse_one_page(html):pattern = re.compile('

.*?board-index.*?>(.*?)''.*?data-src="(.*?)".*?name.*?a.*?>(.*?)''.*?star">(.*?)

.*?releasetime">(.*?)

''.*?integer">(.*?).*?fraction">(.*?).*?
', re.S)items = re.findall(pattern,html)print(items)

结果:

 


完整代码

import reimport requestsimport jsondef get_one_page(url):headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3440.17 Safari/537.36',}response = requests.get(url,headers = headers)if response.status_code == 200:return response.textreturn Nonedef main(offset):url = 'http://maoyan.com/board/4?offset='+ str(offset)html = get_one_page(url)for item in parse_one_page(html):write_to_file(item)#排名信息:

.*?board-index.*?>(.*?)#图片信息:
.*?board-index.*?>(.*?).*?data-src="(.*?)"#名字信息:
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?)#主演等等综合:
.*?board-index.*?>(.*?).*?data-src="(.*?)".*?name.*?a.*?>(.*?).*?star">(.*?)

.*?releasetime">(.*?)

.*?integer">(.*?).*?fraction">(.*?).*?
def parse_one_page(html):pattern = re.compile('
.*?board-index.*?>(.*?)''.*?data-src="(.*?)".*?name.*?a.*?>(.*?)''.*?star">(.*?)

.*?releasetime">(.*?)

''.*?integer">(.*?).*?fraction">(.*?).*?
', re.S)items = re.findall(pattern,html)#整理数据#for item in items:yield{'index': item[0],'image': item[1],'title': item[2].strip(),'actor': item[3].strip()[3:],'time' : item[4].strip()[5:],'score': item[5].strip() + item[6].strip()}print(items)def write_to_file(content): #写入文件with open('result.txt','a',encoding='utf-8') as f:# print(content)f.write(json.dumps(content,ensure_ascii=False)+'\n') #json.dumps()是将dict转化成str格式if __name__ == '__main__': #这里没有这一行也可以for i in range(10):main(offset=i*10)

结果:

补充: if __name__ == '__main__'的意思是:当.py文件被直接运行时,if __name__ == '__main__'之下的代码块将被运行;当.py文件以模块形式被导入时,if __name__ == '__main__'之下的代码块不被运行。

参考见博客:https://blog.csdn.net/yjk13703623757/article/details/77918633

 

 

 


推荐阅读
  • Python瓦片图下载、合并、绘图、标记的代码示例
    本文提供了Python瓦片图下载、合并、绘图、标记的代码示例,包括下载代码、多线程下载、图像处理等功能。通过参考geoserver,使用PIL、cv2、numpy、gdal、osr等库实现了瓦片图的下载、合并、绘图和标记功能。代码示例详细介绍了各个功能的实现方法,供读者参考使用。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了在Win10上安装WinPythonHadoop的详细步骤,包括安装Python环境、安装JDK8、安装pyspark、安装Hadoop和Spark、设置环境变量、下载winutils.exe等。同时提醒注意Hadoop版本与pyspark版本的一致性,并建议重启电脑以确保安装成功。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
author-avatar
钢铁猪991884679
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有