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 [分页]:参 ...
随机推荐
- AIApe问答机器人Scrum Meeting 5.3
Scrum Meeting 6 日期:2021年5月3日 会议主要内容概述:汇报两日工作. 一.进度情况 组员 负责 两日内已完成的工作 后两日计划完成的工作 工作中遇到的困难 李明昕 后端 与前端对 ...
- ESD
Reverse standoff voltage是保护二极管的反向工作电压, 在这个电压, 二极管是不工作的. Breakdown voltage 是二极管的击穿电压, 超过这个电压后, 二极管迅速反 ...
- 数据治理之元数据管理的利器——Atlas入门宝典
随着数字化转型的工作推进,数据治理的工作已经被越来越多的公司提上了日程.作为Hadoop生态最紧密的元数据管理与发现工具,Atlas在其中扮演着重要的位置.但是其官方文档不是很丰富,也不够详细.所以整 ...
- Linux修改bashrc
.bashrc是一个隐藏的文件,要打开并修改该文件需要: (1) 查看:ll -a 找到文件 .bashrc: (2) 打开:vi .bashrc (或者 vim .bashrc) 打开文件: (3) ...
- (转载)gcc -l参数和-L参数
-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so ...
- 字符串折叠&压缩(区间DP)
字符串折叠 题目描述 折叠的定义如下: 一个字符串可以看成它自身的折叠.记作S = S X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S) = SSSS-S(X个S). 如果A = A ...
- Codeforces Round #735 (Div. 2)
这次的cf依旧掉分..... A题和B题在不懈死磕下瞎搞出来了,不过还是被C题卡住了... C. Mikasa 简述题意就是给定n和m,让n^0,n^1,n^2...,n^m,求着m+1个数中没有出现 ...
- hdu 2571 命运(水DP)
题意: M*N的grid,每个格上有一个整数. 小明从左上角(1,1)打算走到右下角(M,N). 每次可以向下走一格,或向右走一格,或向右走到当前所在列的倍数的列的位置上.即:若当前位置是(i,j), ...
- oeasy教您玩转vim - 57 - # 行可视化
可视化编辑 回忆上节课内容 上次我们了解到可视模式 其实可视化对应三种子模式 字符可视模式 v 行可视模式 大写V 块可视模式ctrl+v 我们先来了解字符可视化模式 快捷键 v 可配合各种mot ...
- c++ template 实现一个简单的"栈"
一: 实现一个简单的swap 原来我们写swap一定会这样写: 对于int类型的: swap(const int &x,const int &y) { int temp; temp = ...