爬取排行榜应用信息

爬取豌豆荚排行榜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的更多相关文章

  1. requests + bs4 爬取豌豆荚所有应用的信息

    1.分析豌豆荚的接口的规律 - 获取所有app的接口url 2.往每一个接口发送请求,获取json数据 解析并提取想要的数据 app_data: 1.图标 app_img_url 2.名字 app_n ...

  2. requests bs4 爬取 资讯 图片

    #!/usr/bin/env python # Version = 3.5.2 # __auth__ = '无名小妖' import requests from bs4 import Beautifu ...

  3. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  4. 使用request+bs4爬取所有股票信息

    爬取前戏 我们要知道利用selenium是非常无敌的,自我认为什么反爬不反爬都不在话下,但是今天我们为什么要用request+bs4爬取所有股票信息呢?因为他比较原始,因此今天的数据,爬取起来也是比较 ...

  5. [实战演练]python3使用requests模块爬取页面内容

    本文摘要: 1.安装pip 2.安装requests模块 3.安装beautifulsoup4 4.requests模块浅析 + 发送请求 + 传递URL参数 + 响应内容 + 获取网页编码 + 获取 ...

  6. python实战项目 — 使用bs4 爬取猫眼电影热榜(存入本地txt、以及存储数据库列表)

    案例一: 重点: 1. 使用bs4 爬取 2. 数据写入本地 txt from bs4 import BeautifulSoup import requests url = "http:// ...

  7. requests+正则爬取豆瓣图书

    #requests+正则爬取豆瓣图书 import requests import re def get_html(url): headers = {'User-Agent':'Mozilla/5.0 ...

  8. requests+正则表达式爬取ip

    #requests+正则表达式爬取ip #findall方法,如果表达式中包含有子组,则会把子组单独返回出来,如果有多个子组,则会组合成元祖 import requests import re def ...

  9. 爬虫系列4:Requests+Xpath 爬取动态数据

    爬虫系列4:Requests+Xpath 爬取动态数据 [抓取]:参考前文 爬虫系列1:https://www.cnblogs.com/yizhiamumu/p/9451093.html [分页]:参 ...

随机推荐

  1. [Beta]the Agiles Scrum Meeting 2

    会议时间:2020.5.11 20:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 yjy 修复bug将自动评测改为异步HTTP请求 tq 实现查看.删除测试点功能的后端将自动评测改为异 ...

  2. Spring DeferredResult 异步请求

    Spring DeferredResult 异步请求 一.背景 二.分析 三.实现要求 四.后端代码实现 五.运行结果 1.超时操作 2.正常操作 六.DeferredResult运行原理 六.注意事 ...

  3. 关于把RTL工程代码封装成IP时对define宏定义参数的处理

    在把RTL工程封装成IP的时候,如果工程中的代码中含有global include中定义的参数,则vivado不支持该参数文件的封装.出现IP_FLOW 19-4646的错误代码,解决方法: 1.在用 ...

  4. hdu 3863 No Gambling (不会证明,但是是对的,,)

    题意: N=4时 规则: 双方每次可以连接自己颜色的两个点(相邻,长度为1),线和线不能交叉重叠. 蓝方要连接左右,红方要连接上下. 蓝方先.问谁先连接? 思路: 经过观察....蓝方胜....... ...

  5. [WPF] 使用三种方式实现弧形进度条

    1. 需求 前天看到有人问弧形进度条怎么做,我模仿了一下,成果如下图所示: 当时我第一反应是可以用 Microsoft.Toolkit.Uwp.UI.Controls 里的 RadialGauge 实 ...

  6. 2021.11.4测试T1-妹子

    题目 今天测试,直接挂完了 写了四个小时,最后发现自己题目理解错误了 有两个区间,在输入了 \(l\) 和 \(r\) 以后,进行查询 \[ min(max(a_1,a_2,...a_p,b_{p+1 ...

  7. Canal 实战 | 第一篇:SpringBoot 整合 Canal + RabbitMQ 实现监听 MySQL 数据库同步更新 Redis 缓存

    一. Canal 简介 canal [kə'næl],译意为水道/管道/沟渠,主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费 早期阿里巴巴因为杭州和美国双机房部署,存在跨机房同 ...

  8. node获取请求我的客户端的地址

    node获取请求我的客户端的地址 const http = require('http'); //创建 Server const server = http.createServer() // 监听r ...

  9. [python]Appium+python +pytest 实现APP自动化,基于安卓

    1.安卓环境搭建 &关于app自动化,个人觉得安装过程比较复杂,脚本难度实现和web自动化差不多封装关键字即可,因此,下面会写安装.启动APP以及过程中遇到的一些坑(这一篇偏向解释给个人) & ...

  10. flower 指定app

    flower 指定app # tasks.py from celery import Celery celery = Celery(broker="amqp://", backen ...