requests+bs4爬取豌豆荚排行榜及下载排行榜app
爬取排行榜应用信息
爬取豌豆荚排行榜app信息
- app_detail_url - 应用详情页url
- app_image_url - 应用图片url
- app_name - 应用名称
- app_install_count - 下载量
- app_size - 应用大小
- app_info - 应用简介
1.分析:
- 目标url: https://www.wandoujia.com/top/app
- 在网页中,发现了加载更多按钮,点击后,为异步请求,请求url为:
https://www.wandoujia.com/wdjweb/api/top/more?resourceType=0&page=2&ctoken=kuoxO3QZz7JKIJtuA6RXibwL
- 修改page的值,可以得到响应数据,则可以直接爬接口数据,page范围为1~41
2. 爬取数据过程
- 发送请求
- 解析数据
- 保存数据到MySQL数据库
代码
# top_app.py
import requests
from bs4 import BeautifulSoup
from wandoujia.mysql_control import MySQL
# 请求函数
def get_data(url):
response = requests.get(url)
return response.json().get('data')
# 解析数据
def parse_data(json_data):
data = json_data.get('content')
# print(data)
soup = BeautifulSoup(data, 'lxml')
# 找出所以的li标签(每个app都在一个li标签里)
li_list = soup.find_all(name='li', attrs={'class': 'card'})
# print(li_list)
for li in li_list:
# 获取app详情页url
app_detail_url = li.find(name='a').get('href')
# print('应用详情页:', app_detail_url)
# 获取app图片url
img_tag = li.find(name='img')
# print(img_tag)
# app图片url
app_image_url = img_tag.get('data-original')
# print('应用图片:', app_image_url)
# 应用名称
app_name = img_tag.get('alt')
# print('应用名称:', app_name)
# 获取应用下载量
app_install_count = li.find(name='span', attrs={'class': 'install-count'}).text
# print('应用下载量:', app_install_count)
# 获取应用大小
try:
app_size = li.find(name='span', attrs={'title': re.compile('MB')}).text
except:
app_size = ''
# print('应用大小:', app_size)
# 获取应用简介
app_info = li.find(name='div', attrs={'class': 'comment'}).text.strip()
# print('应用简介:', app_info)
yield app_detail_url, app_image_url, app_name, app_install_count, app_size, app_info
# 保存数据
def save_data(generator_data, mysql_obj):
for data in generator_data:
# print(data)
sql = 'insert into top_app(app_detail_url, app_image_url, app_name, app_install_count, app_size, app_info) ' \
'values(%s, %s, %s, %s, %s, %s)'
mysql_obj.execute(sql, data)
print(f'{data[2]} 数据已爬取成功')
print('*' * 100)
if __name__ == '__main__':
# 实例化数据库对象
mysql_obj = MySQL()
# 拼接url
for page in range(1, 42):
url = f'https://www.wandoujia.com/wdjweb/api/top/more?resourceType=0&page={page}&ctoken=kuoxO3QZz7JKIJtuA6RXibwL'
# 发送请求
json_data = get_data(url)
# 解析数据
generator_data = parse_data(json_data)
# 保存数据
save_data(generator_data, mysql_obj)
MySQL数据库
# mysql.py
import pymysql
class MySQL:
def __init__(self):
self.client = pymysql.connect(
host='127.0.0.1',
port=3306,
database='wandoujia',
user='root',
password='admin',
charset='utf8',
autocommit=True
)
self.cursor = self.client.cursor(pymysql.cursors.DictCursor)
def execute(self, sql, args):
try:
self.cursor.execute(sql, args)
except Exception as e:
print(e)
def close(self):
self.cursor.close()
self.client.close()
爬取详情页下载链接并下载
爬取豌豆荚排行榜app详情页
- 分析:
- 目标url:在top_app文件中已有爬取的函数,可直接使用得到app_detail_url
- 详情页面分析:
- <div class="download-wp">下存在a标签<a class="normal-dl-btn">,href属性为下载链接
- 爬取数据过程:
- 使用上面top_app.py中的get_data(),和parse_data()可得到每个app的详情页
- 发送请求
- 解析数据
- 多线程下载app
代码
# top_app_detail.py
import os
from concurrent.futures import ThreadPoolExecutor
import requests
from bs4 import BeautifulSoup
from wandoujia import top_app
# 获取详情页数据
def get_detail_data(data):
response = requests.get(data[0])
# print(response.text)
return response.text
# 解析数据
def parse_detail_data(response):
soup = BeautifulSoup(response, 'lxml')
app_download_url = soup.find(name='a', attrs={'class': 'normal-dl-btn'}).get('href')
# print(f'应用名称: {data[2]}, 下载链接: {app_download_url}')
return data[2], app_download_url
# 保存数据
def download_app(app_name_download_url_tuple):
# 下载app
app_name = os.path.join(save_dir, app_name_download_url_tuple[0])
print(app_name_download_url_tuple[0], '开始下载')
app_file = requests.get(app_name_download_url_tuple[1])
# print(app_name)
with open(app_name, 'wb') as f:
for line in app_file.iter_lines():
f.write(line)
print(app_name_download_url_tuple[0], '下载完成')
if __name__ == '__main__':
# app保存文件夹
save_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'top_app')
# 多线程下载,下载线程数为3
pool = ThreadPoolExecutor(3)
# 拼接url
for page in range(1, 42):
url = f'https://www.wandoujia.com/wdjweb/api/top/more?resourceType=0&page={page}&ctoken=kuoxO3QZz7JKIJtuA6RXibwL'
# 获取详情页url
# 发送请求
json_data = top_app.get_data(url)
# 解析数据
generator_data = top_app.parse_data(json_data)
# 爬取详情页
for data in generator_data:
# print(data)
# 获取详情页数据
detail_response = get_detail_data(data)
# 解析详情页数据
app_name_download_url_tuple = parse_detail_data(detail_response)
# 单线程请求并下载app
# download_app(app_name_download_url_tuple)
# 使用多线程请求并下载app,下载线程数不宜过多,否则会很慢
pool.submit(download_app, app_name_download_url_tuple)
requests+bs4爬取豌豆荚排行榜及下载排行榜app的更多相关文章
- requests + bs4 爬取豌豆荚所有应用的信息
1.分析豌豆荚的接口的规律 - 获取所有app的接口url 2.往每一个接口发送请求,获取json数据 解析并提取想要的数据 app_data: 1.图标 app_img_url 2.名字 app_n ...
- requests bs4 爬取 资讯 图片
#!/usr/bin/env python # Version = 3.5.2 # __auth__ = '无名小妖' import requests from bs4 import Beautifu ...
- PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...
- 使用request+bs4爬取所有股票信息
爬取前戏 我们要知道利用selenium是非常无敌的,自我认为什么反爬不反爬都不在话下,但是今天我们为什么要用request+bs4爬取所有股票信息呢?因为他比较原始,因此今天的数据,爬取起来也是比较 ...
- [实战演练]python3使用requests模块爬取页面内容
本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取 ...
- python实战项目 — 使用bs4 爬取猫眼电影热榜(存入本地txt、以及存储数据库列表)
案例一: 重点: 1. 使用bs4 爬取 2. 数据写入本地 txt from bs4 import BeautifulSoup import requests url = "http:// ...
- requests+正则爬取豆瓣图书
#requests+正则爬取豆瓣图书 import requests import re def get_html(url): headers = {'User-Agent':'Mozilla/5.0 ...
- requests+正则表达式爬取ip
#requests+正则表达式爬取ip #findall方法,如果表达式中包含有子组,则会把子组单独返回出来,如果有多个子组,则会组合成元祖 import requests import re def ...
- 爬虫系列4:Requests+Xpath 爬取动态数据
爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...
随机推荐
- BUAA SE 软件案例分析-CSDN
Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...
- (数据科学学习手札129)geopandas 0.10版本重要新特性一览
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...
- JavaAgent型内存马基础
Java Instrumentation java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序.这种监测和协助包括但不 ...
- 洛谷 P3147 [USACO16OPEN]262144 P
链接: P3147 P3146双倍经验 前言: 今天发现的一道很有意思的DP题 分析: 第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并 ...
- Spring中自定义Schema扩展机制
一.前言 Spring 为基于 XML 构建的应用提供了一种扩展机制,用于定义和配置 Bean. 它允许使用者编写自定义的 XML bean 解析器,并将解析器本身以及最终定义的 Bean 集成到 S ...
- Photoshop cc 绿色版 最新版 下载
Photoshop cc 绿色版 下载 Photoshop cc 绿色版 最新版下载百度网盘下载 Photoshop 下载提取码: dh6z 作为一个程序员, 不懂点基本的作图都不配"新时代 ...
- Android Jetpack Compose 引入示例工程
引入 Jetpack Compose 示例工程 去GitHub上找到Compose的示例工程 https://github.com/android/compose-samples ,clone到本地 ...
- 挂载iscsi存储
参考连接:https://segmentfault.com/a/1190000005853387?utm_source=tag-newest 安装客户端工具,iscsi-initiator yum i ...
- no space left on device 磁盘空间不足
新挂载的目录,创建文件提示:no space left on device 1.执行命令:df -h ,查看盘是否挂载成功 2.用history命令查看历史命令,尴尬的发现挂载前忘记格式化了 3.取消 ...
- ES6-变量的解构赋值复习+学习
ES6------变量的解构赋值 由于之前学过ES6的解构赋值,但是只是略看了一点网上的视频,所以今天就看了看ES6对这一部分的详细介绍,然后做一个总结的笔记. 首先,先大概说一下什么是变量的解构赋值 ...