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

爬虫实战(五):爬豆瓣top250

目录爬虫实战(五):爬豆瓣top250一、网址分析1、页面分析2、源码分析3、内容解析4、链接分析二、编写代码1、获取每页url2、获取ol里面的li标签3、获取数据4、数据清洗三

目录



  • 爬虫实战(五):爬豆瓣top250

    • 一、网址分析

      • 1、 页面分析

      • 2、 源码分析

      • 3、 内容解析

      • 4、 链接分析



    • 二、编写代码

      • 1、 获取每页url

      • 2、 获取ol里面的li标签

      • 3、 获取数据

      • 4、 数据清洗



    • 三、完整代码




爬虫实战(五):爬豆瓣top250

一、网址分析


1、 页面分析

通过抓包分析,可得数据不是动态加载出来的,而是静态页面,故我们可以直接发送请求到页面,就可以获得数据了


2、 源码分析

通过F12调试工具可以得到页面数据,即,该页面的数据,存储在一个类名为grid_view的ol标签里面,同时该类名在页面中唯一,故我们可以使用这个节点定位到我们的数据,遍历li标签,获取内容


3、 内容解析


4、 链接分析

"""
1. https://movie.douban.com/top250?start=0
2. https://movie.douban.com/top250?start=25
3. https://movie.douban.com/top250?start=50
n. https://movie.douban.com/top250?start=25*(n-1)
"""
urls = [https://movie.douban.com/top250?start=25*(i-1) for i in range(11)] # 其总共有250部电影

故,我们可以使用for循环,或者是先生成链接,采用入栈的形式来访问,亦或者可以使用递归的方式来爬取页面


二、编写代码


1、 获取每页url

# !/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "123.py"
__time__ = "2022/7/6 10:19"
import requests, re # 导入模块
from lxml import etree # 进行xpath解析
from fake_useragent import UserAgent # 使用随机请求头
import pandas as pd # 导入数据解析模快
urls = [f'https://movie.douban.com/top250?start={25*(i-1)}' for i in range(10, 0, -1)] # 获取全部的url链接,存储为全局变量,使用出栈的方式,所以采取倒序
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Host': 'movie.douban.com',
'Pragma': 'no-cache',
'sec-ch-ua': '"Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'user-agent': UserAgent().random
}
lis_data = [] # 存储爬取到的数据
while urls:
print(urls.pop())

2、 获取ol里面的li标签

def get_tags(url):
headers.update({'user-agent': UserAgent().random}) # 使得user-agent足够随机
resp = requests.get(url, headers=headers) # 发送请求
resp.encoding = "utf-8" # 设置编码
tree = etree.HTML(resp.text) # 得到页面源码,交给etree
ol = tree.xpath('//*[@id="content"]/div/div[1]/ol/li') # 获取到ol
for li in ol:
print(li)

get_tags("https://movie.douban.com/top250?start=0")

3、 获取数据

def get_data(li):
imgSrc = li.xpath(".//img/@src")[0] # 图片链接
try:
imgSrc = imgSrc.replace("webp", "jpg")
except Exception as e:
imgSrc = "图片没有找到"
title = li.xpath(".//img/@alt")[0] # 标题
detailUrl = li.xpath(".//div[@class='hd']/a/@href")[0] # 详细地址
detail = li.xpath(".//div[@class='bd']/p[1]/text()") # 里面包含导演,年份,类型,我们只要年份和类型
time = re.search(r"\d+", detail[1]).group() # 出版年份
type_ = " ".join(re.findall(r"[\u4e00-\u9fa5]+", detail[1])) # 电影类型
score = li.xpath(".//span[@class='rating_num']/text()")[0] # 获取评分
quote = li.xpath(".//span[@class='inq']/text()")[0] # 电影格言
# print(title, imgSrc, detailUrl, time, type_, score, quote) # 输出获取的数据
lis_data.append({
"标题": title,
"图片链接": imgSrc,
"详情页链接": detailUrl,
"出版时间": time,
"电影类型": type_,
"评分": score,
"格言": quote
}) # 把结果存储到准备好的容器中,提交给pandas库进行解析,这里也可以将数据写入数据库

# 测试使用
resp = requests.get("https://movie.douban.com/top250?start=25", headers=headers)
resp.encoding = "utf-8"
tree = etree.HTML(resp.text) # 得到页面源码,交给etree
ol = tree.xpath('//*[@id="content"]/div/div[1]/ol/li') # 获取到ol
for li in ol :
get_data(li)
print(lis_data)

4、 数据清洗

def parse_data():
df = pd.DataFrame(lis_data)
new_df = df.dropna() # 可以,丢弃为空的数据
# 同时也还可以做一些图表分析等工作,这里就省略
# print(new_df)
new_df.to_excel("./douban.xlsx", index=None)
parse_data()

三、完整代码

# !/usr/bin/python3
# -*- coding: UTF-8 -*-
__author__ = "A.L.Kun"
__file__ = "123.py"
__time__ = "2022/7/6 10:19"
import requests, re # 导入模块
from lxml import etree # 进行xpath解析
from fake_useragent import UserAgent # 使用随机请求头
import pandas as pd # 导入数据解析模快
from logging import Logger
log = Logger(__name__)
urls = [f'https://movie.douban.com/top250?start={25*(i-1)}' for i in range(10, 0, -1)] # 获取全部的url链接,存储为全局变量,使用出栈的方式,所以采取倒序
headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'zh-CN,zh;q=0.9',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Host': 'movie.douban.com',
'Pragma': 'no-cache',
'sec-ch-ua': '"Not A;Brand";v="99", "Chromium";v="102", "Google Chrome";v="102"',
'sec-ch-ua-mobile': '?0',
'sec-ch-ua-platform': '"Windows"',
'Sec-Fetch-Dest': 'document',
'Sec-Fetch-Mode': 'navigate',
'Sec-Fetch-Site': 'none',
'Sec-Fetch-User': '?1',
'Upgrade-Insecure-Requests': '1',
'user-agent': UserAgent().random
}
lis_data = [] # 存储爬取到的数据
def get_data(li):
imgSrc = li.xpath(".//img/@src")[0] # 图片链接
try:
imgSrc = imgSrc.replace("webp", "jpg")
except Exception as e:
imgSrc = "图片没有找到"
title = li.xpath(".//img/@alt")[0] # 标题
detailUrl = li.xpath(".//div[@class='hd']/a/@href")[0] # 详细地址
detail = li.xpath(".//div[@class='bd']/p[1]/text()") # 里面包含导演,年份,类型,我们只要年份和类型
time = re.search(r"\d+", detail[1]).group() # 出版年份
type_ = " ".join(re.findall(r"[\u4e00-\u9fa5]+", detail[1])) # 电影类型
score = li.xpath(".//span[@class='rating_num']/text()")[0] # 获取评分
try:
quote = li.xpath(".//span[@class='inq']/text()")[0] # 电影格言
except Exception as e:
quote = "暂时没有格言哦!"
# print(title, imgSrc, detailUrl, time, type_, score, quote) # 输出获取的数据
lis_data.append({
"标题": title,
"图片链接": imgSrc,
"详情页链接": detailUrl,
"出版时间": time,
"电影类型": type_,
"评分": score,
"格言": quote
}) # 把结果存储到准备好的容器中,提交给pandas库进行解析,这里也可以将数据写入数据库
def get_tags(url):
headers.update({'user-agent': UserAgent().random}) # 使得user-agent足够随机
resp = requests.get(url, headers=headers) # 发送请求
resp.encoding = "utf-8" # 设置编码
tree = etree.HTML(resp.text) # 得到页面源码,交给etree
ol = tree.xpath('//*[@id="content"]/div/div[1]/ol/li') # 获取到ol
for li in ol:
get_data(li) # 获取到数据
log.info(f"{url},数据获取完成")
def parse_data():
df = pd.DataFrame(lis_data)
new_df = df.dropna() # 可以,丢弃为空的数据
# 同时也还可以做一些图表分析等工作,这里就省略
# print(new_df)
new_df.to_excel("./douban.xlsx", index=None, encoding="utf-8")
# print(new_df)
def main():
while urls:
get_tags(urls.pop())
parse_data()
if __name__ == "__main__":
main()

本文来自博客园,作者:A-L-Kun,转载请注明原文链接:https://www.cnblogs.com/liuzhongkun/p/16450367.html



推荐阅读
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • ASP.NET2.0数据教程之十四:使用FormView的模板
    本文介绍了在ASP.NET 2.0中使用FormView控件来实现自定义的显示外观,与GridView和DetailsView不同,FormView使用模板来呈现,可以实现不规则的外观呈现。同时还介绍了TemplateField的用法和FormView与DetailsView的区别。 ... [详细]
  • 使用正则表达式爬取36Kr网站首页新闻的操作步骤和代码示例
    本文介绍了使用正则表达式来爬取36Kr网站首页所有新闻的操作步骤和代码示例。通过访问网站、查找关键词、编写代码等步骤,可以获取到网站首页的新闻数据。代码示例使用Python编写,并使用正则表达式来提取所需的数据。详细的操作步骤和代码示例可以参考本文内容。 ... [详细]
  • 导出功能protectedvoidbtnExport(objectsender,EventArgse){用来打开下载窗口stringfileName中 ... [详细]
  • 本文介绍了一种在PHP中对二维数组根据某个字段进行排序的方法,以年龄字段为例,按照倒序的方式进行排序,并给出了具体的代码实现。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • Tkinter Frame容器grid布局并使用Scrollbar滚动原理
    本文介绍了如何使用Tkinter实现Frame容器的grid布局,并通过Scrollbar实现滚动效果。通过将Canvas作为父容器,使用滚动Canvas来滚动Frame,实现了在Frame中添加多个按钮,并通过Scrollbar进行滚动。同时,还介绍了更新Frame大小和绑定滚动按钮的方法,以及配置Scrollbar的相关参数。 ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • PHP输出缓冲控制Output Control系列函数详解【PHP】
    后端开发|php教程PHP,输出缓冲,Output,Control后端开发-php教程概述全景网页源码,vscode如何打开c,ubuntu强制解锁,sts启动tomcat慢,sq ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 如何在php文件中添加图片?
    本文详细解答了如何在php文件中添加图片的问题,包括插入图片的代码、使用PHPword在载入模板中插入图片的方法,以及使用gd库生成不同类型的图像文件的示例。同时还介绍了如何生成一个正方形文件的步骤。希望对大家有所帮助。 ... [详细]
  • C#中DataGridView中数据导出为网页的问题
    在对服务器进行巡检后,我们需要保存一份巡检的日志下来,虽然可以通过sprie.xls第三方控件保存为excel,但是感觉还是直接生成网页更加方便。这里使用到了VUE2+elemen ... [详细]
  • Highcharts翻译系列之二十:曲线图例子(二)
    Highcharts翻译系列之二十:曲线图例子(二)代码 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有