爬取排行榜应用信息

爬取豌豆荚排行榜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. [no code][scrum meeting] Alpha 7

    项目 内容 会议时间 2020-04-13 会议主题 OCR技术细节分析 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ).c ...

  2. oo第一单元学习总结

    写在开头: 第一次接触面向对象思想和java语言,在学习以及完成作业的过程经历了一个比较痛苦的过程, 虽然在每次写作业时总是会有一些小小的抱怨,虽然写出的代码还是很差, 但是看到自己有所进步,还是感觉 ...

  3. BUAA2020软工作业(二)——对软件工程的初步理解

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面帮助 ...

  4. OO前三次作业思考(第一次OO——Blog)

    OO前三次作业总结 基于度量分析程序结构 由于三次作业较多,决定分析内容.功能最为复杂的第三次作业. 上图为第三次作业的类图.我使用了一个抽象类Factor,写了五个因子继承Factor,然后又单独开 ...

  5. 扩展spring data jpa的repository

    在我们编写代码的过程中,spring data jpa为我们的持久层提供的极大的方便,但有时spring data jpa提供的repository并不能完全满足我们开发的需求,因此就需要进行扩展.s ...

  6. NOIP 模拟 $79\; \rm y$

    题解 \(by\;zj\varphi\) NOIP2013 的原题 最简单的思路就是一个 bfs,可以拿到 \(70pts\) 75pts #include<bits/stdc++.h> ...

  7. 震惊,hzoi的分差竟然折磨大,活到爆!

    众所周知,hzoi的分差非常"大",那么究竟有多大呢?最近,一位外国小哥开发出了hzoi的分差竟然折磨大,活到爆!的方法,这究竟是怎么一回事呢?快和小编一起来看看吧- 竟然1分就可 ...

  8. 洛谷 P4867 Gty的二逼妹子序列

    链接: P4867 题意: 给出长度为 \(n(1\leq n\leq 10^5)\) 的序列 \(s\),保证\(1\leq s_i\leq n\).有 \(m(1\leq m\leq 10^6)\ ...

  9. stat命令的实现

    任务详情 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate.c,提交码云链接 测试代码,mystat 与st ...

  10. Luogu P1084 疫情控制 | 二分答案 贪心

    题目链接 观察题目,答案明显具有单调性. 因为如果用$x$小时能够控制疫情,那么用$(x+1)$小时也一定能控制疫情. 由此想到二分答案,将问题转换为判断用$x$小时是否能控制疫情. 对于那些在$x$ ...