导入包

# json包
import json
#正则表达式包
import re
import requests
from requests import RequestException

定义爬取html函数

#函数:获取一页html
def get_one_page(url):
try:
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36'
}
'''
Response对象返回包含了整个服务器的资源
Response对象的属性,有以下几种
r.status_code: HTTP请求的返回状态,200表示连接成功,404表示失败
2.r.text: HTTP响应内容的字符串形式,即,url对应的页面内容
3.r.encoding:从HTTP header中猜测的响应内容编码方式
4.r.apparent_encoding:从内容中分析出的响应内容编码方式(备选编码方式)
5.r.content: HTTP响应内容的二进制形式
'''
response = requests.get(url, headers=headers, timeout=1000)
if response.status_code == 200:
return response.text
except requests.exceptions.RequestException as e:
print(e)

定义解析html函数【正则】

#函数:解析一页html
def parse_one_page(html):
#re.compile 是预编译正则表达式函数,是用来优化正则的,它将正则表达式转化为对象
#re.compile 函数用于编译正则表达式,生成一个 Pattern 对象,pattern 是一个字符串形式的正则表达式
#pattern 是一个匹配对象Regular Expression,它单独使用就没有任何意义,需要和findall(), search(), match()搭配使用。
pattern = re.compile(
'<em class="">(\d+)</em>.*?<a href="(.*?)">.*?' +
'<img width="100" alt=".*?" src="(.*?)" class=""' +
'>.*?<span class="title">(.*?)</span>.*?<span ' +
'class="other">&nbsp;/&nbsp;(.*?)</span>.*?<div ' +
'class="bd">.*?<p class="">.*?导演: (.*?)&nbsp.*?<br>' +
'.*?(\d{4})&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;(.*?)\n' +
'.*?</p>.*?<span class="rating_num" property="v:' +
'average">(.*?)</span>',
re.S)
items = re.findall(pattern, html)
for item in items:
yield {
'index': item[0],
'page_src': item[1],
'img_src': item[2],
'title': item[3],
'other_title': item[4],
'director': item[5],
'release_date': item[6],
'country': item[7],
'type': item[8],
'rate': item[9],
}

定义保存内容函数

#函数:将内容写入文件
def write_to_file(content):
with open('douban_movie_rankings.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content, ensure_ascii=False) + '\n')

定义主函数

#主空函数
def main():
#用于翻页
for offset in range(10):
#获取网址
url = f'https://movie.douban.com/top250?start={offset * 25}&filter='
#获取html文件
html = get_one_page(url)
for item in parse_one_page(html):
print(item)
write_to_file(item)

定义魔法函数

if __name__ == '__main__':
main()

运行结果:

原创作者:孤飞-博客园

原文链接:https://www.cnblogs.com/ranxi169/p/16564490.html

最新豆瓣top250爬虫案例代码分析[注释齐全]的更多相关文章

  1. 正则表达式实战:最新豆瓣top250爬虫超详细教程

    检查网页源代码 首先让我们来检查豆瓣top250的源代码,一切网页爬虫都需要从这里开始.F12打开开发者模式,在元素(element)页面通过Ctrl+F直接搜索你想要爬取的内容,然后就可以开始编写正 ...

  2. Java豆瓣电影爬虫——使用Word2Vec分析电影短评数据

    在上篇实现了电影详情和短评数据的抓取.到目前为止,已经抓了2000多部电影电视以及20000多的短评数据. 数据本身没有规律和价值,需要通过分析提炼成知识才有意义.抱着试试玩的想法,准备做一个有关情感 ...

  3. unity3d 射弹基础案例代码分析

    #pragma strict import UnityEngine.UI; function Start () { } var speed : int = 5; var newobject : Tra ...

  4. Java豆瓣电影爬虫——抓取电影详情和电影短评数据

    一直想做个这样的爬虫:定制自己的种子,爬取想要的数据,做点力所能及的小分析.正好,这段时间宝宝出生,一边陪宝宝和宝妈,一边把自己做的这个豆瓣电影爬虫的数据采集部分跑起来.现在做一个概要的介绍和演示. ...

  5. Forward团队-爬虫豆瓣top250项目-项目总结

    托管平台地址:https://github.com/xyhcq/top250 小组名称:Forward团队 组长:马壮 成员:李志宇.刘子轩.年光宇.邢云淇.张良 我们这次团队项目内容是爬取豆瓣电影T ...

  6. Python爬虫之多线程下载豆瓣Top250电影图片

    爬虫项目介绍   本次爬虫项目将爬取豆瓣Top250电影的图片,其网址为:https://movie.douban.com/top250, 具体页面如下图所示:   本次爬虫项目将分别不使用多线程和使 ...

  7. Forward团队-爬虫豆瓣top250项目-项目进度

    项目地址:https://github.com/xyhcq/top250 我们的项目是爬取豆瓣top250的电影的信息,在做这个项目前,我们都没有经验,完全是从零开始,过程中也遇到了很多困难,不过我们 ...

  8. 《Forward团队-爬虫豆瓣top250项目-开发文档》

    码云地址:https://github.com/xyhcq/top250 模块功能:获取豆瓣top250网页的源代码,并分析. def getHTMLText(url,k): # 获取网页源代码 tr ...

  9. 基础爬虫,谁学谁会,用requests、正则表达式爬取豆瓣Top250电影数据!

    爬取豆瓣Top250电影的评分.海报.影评等数据!   本项目是爬虫中最基础的,最简单的一例: 后面会有利用爬虫框架来完成更高级.自动化的爬虫程序.   此项目过程是运用requests请求库来获取h ...

随机推荐

  1. Ajax——Get请求

    Get.html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  2. df-查看磁盘目录空间大小

    查看磁盘分区挂载情况. 语法 df [option] 选项 -T 显示文件系统类型. -h 带单位显示. 示例 [root@localhost ~]# df -Th Filesystem Type S ...

  3. 第30章 LeetCode 72 编辑距离

    每日一句 A flower cannot blossom without sunshine, and man cannot live without love. 花没有阳光就不能盛开,人没有爱就不能生 ...

  4. 并发编程原理学习:synchronized关键字

    概述 关键字synchronized可以修饰方法或者以同步代码块的形式来进行使用,它主要确保多个线程在同一时刻只能有一个线程处于方法或者同步块中,它保证了线程对变量访问的可见性和排他性. 同步代码块 ...

  5. 【Java集合】ArrayDeque源码解读

    简介 双端队列是一种特殊的队列,它的两端都可以进出元素,故而得名双端队列. ArrayDeque是一种以循环数组方式实现的双端队列,它是非线程安全的. 它既可以作为队列也可以作为栈. 继承体系 Arr ...

  6. 《原CSharp》第二回 巧习得元素分类 子不知怀璧其罪

    第二回 巧习得元素分类 子不知怀璧其罪 ===================================================================== 云溪父亲见状看了看云 ...

  7. 17.Nginx 重写(location rewrite)

    Nginx 重写(location / rewrite) 目录 Nginx 重写(location / rewrite) 常见的nginx正则表达式 location lication的分类 loca ...

  8. ABAP CDS DDHEADANNO

  9. 你真的会python中的for循环吗

    for 循环是 Python 中的通用序列迭代器:它可以单步遍历任何有序序列中的元素.for 语句适用于字符串.列表.元组.其他内置可迭代对象和类创建的新对象. for 通常比 while 循环更容易 ...

  10. 7.Spark SQL

    1.分析SparkSQL出现的原因,并简述SparkSQL的起源与发展. SparkSQL出现是因为关系数据库已经不能满足各种在大数据时代新增的用户需求.首先,用户需要在不同的结构化和非结构化数据中执 ...