爬取排行榜应用信息

  1. 爬取豌豆荚排行榜app信息
  2. - app_detail_url - 应用详情页url
  3. - app_image_url - 应用图片url
  4. - app_name - 应用名称
  5. - app_install_count - 下载量
  6. - app_size - 应用大小
  7. - app_info - 应用简介
  8. 1.分析:
  9. - 目标url: https://www.wandoujia.com/top/app
  10. - 在网页中,发现了加载更多按钮,点击后,为异步请求,请求url为:
  11. https://www.wandoujia.com/wdjweb/api/top/more?resourceType=0&page=2&ctoken=kuoxO3QZz7JKIJtuA6RXibwL
  12. - 修改page的值,可以得到响应数据,则可以直接爬接口数据,page范围为1~41
  13. 2. 爬取数据过程
  14. - 发送请求
  15. - 解析数据
  16. - 保存数据到MySQL数据库

代码

  1. # top_app.py
  2. import requests
  3. from bs4 import BeautifulSoup
  4. from wandoujia.mysql_control import MySQL
  5. # 请求函数
  6. def get_data(url):
  7. response = requests.get(url)
  8. return response.json().get('data')
  9. # 解析数据
  10. def parse_data(json_data):
  11. data = json_data.get('content')
  12. # print(data)
  13. soup = BeautifulSoup(data, 'lxml')
  14. # 找出所以的li标签(每个app都在一个li标签里)
  15. li_list = soup.find_all(name='li', attrs={'class': 'card'})
  16. # print(li_list)
  17. for li in li_list:
  18. # 获取app详情页url
  19. app_detail_url = li.find(name='a').get('href')
  20. # print('应用详情页:', app_detail_url)
  21. # 获取app图片url
  22. img_tag = li.find(name='img')
  23. # print(img_tag)
  24. # app图片url
  25. app_image_url = img_tag.get('data-original')
  26. # print('应用图片:', app_image_url)
  27. # 应用名称
  28. app_name = img_tag.get('alt')
  29. # print('应用名称:', app_name)
  30. # 获取应用下载量
  31. app_install_count = li.find(name='span', attrs={'class': 'install-count'}).text
  32. # print('应用下载量:', app_install_count)
  33. # 获取应用大小
  34. try:
  35. app_size = li.find(name='span', attrs={'title': re.compile('MB')}).text
  36. except:
  37. app_size = ''
  38. # print('应用大小:', app_size)
  39. # 获取应用简介
  40. app_info = li.find(name='div', attrs={'class': 'comment'}).text.strip()
  41. # print('应用简介:', app_info)
  42. yield app_detail_url, app_image_url, app_name, app_install_count, app_size, app_info
  43. # 保存数据
  44. def save_data(generator_data, mysql_obj):
  45. for data in generator_data:
  46. # print(data)
  47. sql = 'insert into top_app(app_detail_url, app_image_url, app_name, app_install_count, app_size, app_info) ' \
  48. 'values(%s, %s, %s, %s, %s, %s)'
  49. mysql_obj.execute(sql, data)
  50. print(f'{data[2]} 数据已爬取成功')
  51. print('*' * 100)
  52. if __name__ == '__main__':
  53. # 实例化数据库对象
  54. mysql_obj = MySQL()
  55. # 拼接url
  56. for page in range(1, 42):
  57. url = f'https://www.wandoujia.com/wdjweb/api/top/more?resourceType=0&page={page}&ctoken=kuoxO3QZz7JKIJtuA6RXibwL'
  58. # 发送请求
  59. json_data = get_data(url)
  60. # 解析数据
  61. generator_data = parse_data(json_data)
  62. # 保存数据
  63. save_data(generator_data, mysql_obj)

MySQL数据库

  1. # mysql.py
  2. import pymysql
  3. class MySQL:
  4. def __init__(self):
  5. self.client = pymysql.connect(
  6. host='127.0.0.1',
  7. port=3306,
  8. database='wandoujia',
  9. user='root',
  10. password='admin',
  11. charset='utf8',
  12. autocommit=True
  13. )
  14. self.cursor = self.client.cursor(pymysql.cursors.DictCursor)
  15. def execute(self, sql, args):
  16. try:
  17. self.cursor.execute(sql, args)
  18. except Exception as e:
  19. print(e)
  20. def close(self):
  21. self.cursor.close()
  22. self.client.close()

爬取详情页下载链接并下载

  1. 爬取豌豆荚排行榜app详情页
  2. - 分析:
  3. - 目标url:在top_app文件中已有爬取的函数,可直接使用得到app_detail_url
  4. - 详情页面分析:
  5. - <div class="download-wp">下存在a标签<a class="normal-dl-btn">,href属性为下载链接
  6. - 爬取数据过程:
  7. - 使用上面top_app.py中的get_data(),和parse_data()可得到每个app的详情页
  8. - 发送请求
  9. - 解析数据
  10. - 多线程下载app

代码

  1. # top_app_detail.py
  2. import os
  3. from concurrent.futures import ThreadPoolExecutor
  4. import requests
  5. from bs4 import BeautifulSoup
  6. from wandoujia import top_app
  7. # 获取详情页数据
  8. def get_detail_data(data):
  9. response = requests.get(data[0])
  10. # print(response.text)
  11. return response.text
  12. # 解析数据
  13. def parse_detail_data(response):
  14. soup = BeautifulSoup(response, 'lxml')
  15. app_download_url = soup.find(name='a', attrs={'class': 'normal-dl-btn'}).get('href')
  16. # print(f'应用名称: {data[2]}, 下载链接: {app_download_url}')
  17. return data[2], app_download_url
  18. # 保存数据
  19. def download_app(app_name_download_url_tuple):
  20. # 下载app
  21. app_name = os.path.join(save_dir, app_name_download_url_tuple[0])
  22. print(app_name_download_url_tuple[0], '开始下载')
  23. app_file = requests.get(app_name_download_url_tuple[1])
  24. # print(app_name)
  25. with open(app_name, 'wb') as f:
  26. for line in app_file.iter_lines():
  27. f.write(line)
  28. print(app_name_download_url_tuple[0], '下载完成')
  29. if __name__ == '__main__':
  30. # app保存文件夹
  31. save_dir = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'top_app')
  32. # 多线程下载,下载线程数为3
  33. pool = ThreadPoolExecutor(3)
  34. # 拼接url
  35. for page in range(1, 42):
  36. url = f'https://www.wandoujia.com/wdjweb/api/top/more?resourceType=0&page={page}&ctoken=kuoxO3QZz7JKIJtuA6RXibwL'
  37. # 获取详情页url
  38. # 发送请求
  39. json_data = top_app.get_data(url)
  40. # 解析数据
  41. generator_data = top_app.parse_data(json_data)
  42. # 爬取详情页
  43. for data in generator_data:
  44. # print(data)
  45. # 获取详情页数据
  46. detail_response = get_detail_data(data)
  47. # 解析详情页数据
  48. app_name_download_url_tuple = parse_detail_data(detail_response)
  49. # 单线程请求并下载app
  50. # download_app(app_name_download_url_tuple)
  51. # 使用多线程请求并下载app,下载线程数不宜过多,否则会很慢
  52. 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. BUAA SE 软件案例分析-CSDN

    Q A 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 系统地学习软件工程开发知识,掌握相关流程和技术,提升 ...

  2. (数据科学学习手札129)geopandas 0.10版本重要新特性一览

    本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 就在前不久,我们非常熟悉的Python地理 ...

  3. JavaAgent型内存马基础

    Java Instrumentation ​ java Instrumentation指的是可以用独立于应用程序之外的代理(agent)程序来监测和协助运行在JVM上的应用程序.这种监测和协助包括但不 ...

  4. 洛谷 P3147 [USACO16OPEN]262144 P

    链接: P3147 P3146双倍经验 前言: 今天发现的一道很有意思的DP题 分析: 第一眼以为是区间DP,于是设f[i][j]为从第i个数到第j个数可以合出的最大值,但思考后发现并不能简单合并,并 ...

  5. Spring中自定义Schema扩展机制

    一.前言 Spring 为基于 XML 构建的应用提供了一种扩展机制,用于定义和配置 Bean. 它允许使用者编写自定义的 XML bean 解析器,并将解析器本身以及最终定义的 Bean 集成到 S ...

  6. Photoshop cc 绿色版 最新版 下载

    Photoshop cc 绿色版 下载 Photoshop cc 绿色版 最新版下载百度网盘下载 Photoshop 下载提取码: dh6z 作为一个程序员, 不懂点基本的作图都不配"新时代 ...

  7. Android Jetpack Compose 引入示例工程

    引入 Jetpack Compose 示例工程 去GitHub上找到Compose的示例工程 https://github.com/android/compose-samples ,clone到本地 ...

  8. 挂载iscsi存储

    参考连接:https://segmentfault.com/a/1190000005853387?utm_source=tag-newest 安装客户端工具,iscsi-initiator yum i ...

  9. no space left on device 磁盘空间不足

    新挂载的目录,创建文件提示:no space left on device 1.执行命令:df -h ,查看盘是否挂载成功 2.用history命令查看历史命令,尴尬的发现挂载前忘记格式化了 3.取消 ...

  10. ES6-变量的解构赋值复习+学习

    ES6------变量的解构赋值 由于之前学过ES6的解构赋值,但是只是略看了一点网上的视频,所以今天就看了看ES6对这一部分的详细介绍,然后做一个总结的笔记. 首先,先大概说一下什么是变量的解构赋值 ...