Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy
爬前叨叨
2018年就要结束了,还有4天,就要开始写2019年的教程了,没啥感动的,一年就这么过去了,今天要爬取一个网站叫做酷安,是一个应用商店,大家可以尝试从手机APP爬取,不过爬取APP的博客,我打算在50篇博客之后在写,所以现在就放一放啦~~~

酷安网站打开首页之后是一个广告页面,点击头部的应用即可
页面分析
分页地址找到,这样就可以构建全部页面信息
我们想要保存的数据找到,用来后续的数据分析
上述信息都是我们需要的信息,接下来,只需要爬取即可,本篇文章使用的还是scrapy
,所有的代码都会在文章中出现,阅读全文之后,你就拥有完整的代码啦
import scrapy
from apps.items import AppsItem # 导入item类
import re # 导入正则表达式类
class AppsSpider(scrapy.Spider):
name = 'Apps'
allowed_domains = ['www.coolapk.com']
start_urls = ['https://www.coolapk.com/apk?p=1']
custom_settings = {
"DEFAULT_REQUEST_HEADERS" :{
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 你的UA'
}
}
代码讲解
custom_settings 第一次出现,目的是为了修改默认
setting.py
文件中的配置
def parse(self, response):
list_items = response.css(".app_left_list>a")
for item in list_items:
url = item.css("::attr('href')").extract_first()
url = response.urljoin(url)
yield scrapy.Request(url,callback=self.parse_url)
next_page = response.css('.pagination li:nth-child(8) a::attr(href)').extract_first()
url = response.urljoin(next_page)
yield scrapy.Request(url, callback=self.parse)
代码讲解
- response.css 可以解析网页,具体的语法,你可以参照上述代码,重点阅读 ::attr('href') 和 ::text
- response.urljoin 用来合并URL
- next_page 表示翻页
parse_url函数
用来解析内页,本函数内容又出现了3个辅助函数,分别是self.getinfo(response)
,self.gettags(response)
, self.getappinfo(response)
还有response.css().re
支持正则表达式匹配,可以匹配文字内部内容
def parse_url(self,response):
item = AppsItem()
item["title"] = response.css(".detail_app_title::text").extract_first()
info = self.getinfo(response)
item['volume'] = info[0]
item['downloads'] = info[1]
item['follow'] = info[2]
item['comment'] = info[3]
item["tags"] = self.gettags(response)
item['rank_num'] = response.css('.rank_num::text').extract_first()
item['rank_num_users'] = response.css('.apk_rank_p1::text').re("共(.*?)个评分")[0]
item["update_time"],item["rom"],item["developer"] = self.getappinfo(response)
yield item
三个辅助方法如下
def getinfo(self,response):
info = response.css(".apk_topba_message::text").re("\s+(.*?)\s+/\s+(.*?)下载\s+/\s+(.*?)人关注\s+/\s+(.*?)个评论.*?")
return info
def gettags(self,response):
tags = response.css(".apk_left_span2")
tags = [item.css('::text').extract_first() for item in tags]
return tags
def getappinfo(self,response):
#app_info = response.css(".apk_left_title_info::text").re("[\s\S]+更新时间:(.*?)")
body_text = response.body_as_unicode()
update = re.findall(r"更新时间:(.*)?[<]",body_text)[0]
rom = re.findall(r"支持ROM:(.*)?[<]",body_text)[0]
developer = re.findall(r"开发者名称:(.*)?[<]", body_text)[0]
return update,rom,developer
保存数据
数据传输的item在这个地方就不提供给你了,需要从我的代码中去推断一下即可,哈哈
import pymongo
class AppsPipeline(object):
def __init__(self,mongo_url,mongo_db):
self.mongo_url = mongo_url
self.mongo_db = mongo_db
@classmethod
def from_crawler(cls,crawler):
return cls(
mongo_url=crawler.settings.get("MONGO_URL"),
mongo_db=crawler.settings.get("MONGO_DB")
)
def open_spider(self,spider):
try:
self.client = pymongo.MongoClient(self.mongo_url)
self.db = self.client[self.mongo_db]
except Exception as e:
print(e)
def process_item(self, item, spider):
name = item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self,spider):
self.client.close()
代码解读
- open_spider 开启爬虫时,打开Mongodb
- process_item 存储每一条数据
- close_spider 关闭爬虫
- 重点查看本方法 from_crawler 是一个类方法,在初始化的时候,从setting.py中读取配置
SPIDER_MODULES = ['apps.spiders']
NEWSPIDER_MODULE = 'apps.spiders'
MONGO_URL = '127.0.0.1'
MONGO_DB = 'KuAn'

得到数据
调整一下爬取速度和并发数
DOWNLOAD_DELAY = 3
# The download delay setting will honor only one of:
CONCURRENT_REQUESTS_PER_DOMAIN = 8
代码走起,经过一系列的努力,得到数据啦!!!
抽空写个酷安的数据分析,有需要源码的,自己从头到尾的跟着写一遍就O98K了
Python爬虫入门教程 36-100 酷安网全站应用爬虫 scrapy的更多相关文章
- Python爬虫入门教程 27-100 微医挂号网专家团队数据抓取pyspider
1. 微医挂号网专家团队数据----写在前面 今天尝试使用一个新的爬虫库进行数据的爬取,这个库叫做pyspider,国人开发的,当然支持一下. github地址: https://github.com ...
- Python爬虫入门教程 24-100 微医挂号网医生数据抓取
1. 写在前面 今天要抓取的一个网站叫做微医网站,地址为 https://www.guahao.com ,我们将通过python3爬虫抓取这个网址,然后数据存储到CSV里面,为后面的一些分析类的教程做 ...
- Python爬虫入门教程 48-100 使用mitmdump抓取手机惠农APP-手机APP爬虫部分
1. 爬取前的分析 mitmdump是mitmproxy的命令行接口,比Fiddler.Charles等工具方便的地方是它可以对接Python脚本. 有了它我们可以不用手动截获和分析HTTP请求和响应 ...
- Python爬虫入门教程 43-100 百思不得姐APP数据-手机APP爬虫部分
1. Python爬虫入门教程 爬取背景 2019年1月10日深夜,打开了百思不得姐APP,想了一下是否可以爬呢?不自觉的安装到了夜神模拟器里面.这个APP还是比较有名和有意思的. 下面是百思不得姐的 ...
- Python爬虫入门教程 37-100 云沃客项目外包网数据爬虫 scrapy
爬前叨叨 2019年开始了,今年计划写一整年的博客呢~,第一篇博客写一下 一个外包网站的爬虫,万一你从这个外包网站弄点外快呢,呵呵哒 数据分析 官方网址为 https://www.clouderwor ...
- Python基础入门教程
Python基础入门教程 Python基础教程 Python 简介 Python环境搭建 Python 基础语法 Python 变量类型 Python 运算符 Python 条件语句 Python 循 ...
- Python爬虫入门教程 1-100 CentOS环境安装
简介 你好,当你打开这个文档的时候,我知道,你想要的是什么! Python爬虫,如何快速的学会Python爬虫,是你最期待的事情,可是这个事情应该没有想象中的那么容易,况且你的编程底子还不一定好,这套 ...
- Python爬虫入门教程 5-100 27270图片爬取
27270图片----获取待爬取页面 今天继续爬取一个网站,http://www.27270.com/ent/meinvtupian/ 这个网站具备反爬,so我们下载的代码有些地方处理的也不是很到位, ...
- Python爬虫入门教程 50-100 Python3爬虫爬取VIP视频-Python爬虫6操作
爬虫背景 原计划继续写一下关于手机APP的爬虫,结果发现夜神模拟器总是卡死,比较懒,不想找原因了,哈哈,所以接着写后面的博客了,从50篇开始要写几篇python爬虫的骚操作,也就是用Python3通过 ...
随机推荐
- unity runtime时导入fbx文件
TriLib is a Unity model loader package designed to allow the user to load various 3D model formats i ...
- 我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制
PWM 是一种调节输出功率的技术(俗称调压),其原理在于改变输出方波的占空比,具体输出见下图: 输出信号为电压值,当负载为恒阻时,上图中的输出功率分别为 25%.50%.75%. 实现方法如下: 设置 ...
- JavaScript(九)
内置对象 1.document document.referrer //获取上一个跳转页面的地址(需要服务器环境) 2.location window.location.href //获取或者重定ur ...
- input type='file' 上传文件 判断图片的大小是否合格与witdh 和 height 是否合格
function CheckFiles(obj) { var array = new Array('gif', 'jpeg', 'png', 'jpg'); //可以上传的文件类型 if (obj.v ...
- idea在springboot项目中没有【新建JSP选项】的解决方法
https://blog.csdn.net/qq_26525215/article/details/53726690 转载于CSDN
- VB输出数据到EXCEL
Private Sub Command1_Click() Dim i As Long Dim j As Long , ) As Long Dim xlApp, WS, WB Set xlApp = C ...
- wpa_supplicant 的编译
1. wpa_supplicant的编译需要用到的3个源码包, 分别是wpa_supplicant, openssl, libnl wpa_supplicant的下载地址:http://w1.fi/r ...
- python 可迭代对象 迭代器 生成器总结
可迭代对象 只要有魔法方法__iter__的就是可迭代对象 list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...
- post数据时报错:远程服务器返回错误: (400) 错误的请求。
网上查了多种方法,有不少说法,报400说是传的数据格式不对,最后的结论确实是数据格式不对. Content_Type为:application/json,配的数据格式有些麻烦,特别数多层,单层还好.例 ...
- oracle启动服务和监听
1.故障问题:tomcat显示启动oracle数据库失败,数据库服务启动正常 操作1:重启tomcat查看错误信息 2:重启数据库服务 命令: (1) 启动Oracle服务 C:\Users\Admi ...