应该是个,爬取手机app上的数据的数据爬取,什么思路

&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!Scrapy 入门教程之爬取iTunes app数据
Scrapy 是什么?Scrapy 是一个开源的基于Twisted的python爬虫框架,我们只要定制几个简单的模块就能实现网络数据的爬
Scrapy 是什么?
Scrapy 是一个开源的基于Twisted的python爬虫框架,我们只要定制几个简单的模块就能实现网络数据的爬取。
Scrapy 的整体架构
简单的解释一下上面的图:
爬虫处理的原材料是一个或多个url,爬取时Sheduler会把一个url分配给Downloader来进行一次网络的request请求,请求完成后Downloader再把所得到的response传到Spiders,如果返回的数据是我们需要的,数据就会被处理成相应的Item交给ItemPipeline来进行存储等处理。如果返回的仍然是要处理的url,那么就要交由Scheduler就行再一次的处理过程。
3.Scrapy的安装
sudo pip_install scrapy
或 sudo easy_intall scrapy
输入密码安装完成。输用 scrapy 如果没有 command not found 就表示已经安装成功。
4.创建项目
scrapy startproject project_name
如果看到上面的提示,那么我们的项目就创建成功了。切换到项目录下,我们会看到如下的目录结构
appScrapy/
scrapy.cfg
整个项目的配制信息
appScrapy/
存放所有python定制模块的文件夹
保存爬取到的的数据的数据结构
pipelines.py
数据流处理文件,对爬取的数据流进行处理
settings.py
设置文件,在这里设置数据库等
存放我们定制的爬虫
我们来找全目标,appStore的娱乐排行榜/cn/genre/ios-yu-le/id6016?mt=8
我们要爬取的数据就是列表中的app名字跟其相应的具体信息的url。
首先我们来定制我们用来保存数据类型的 items.py,打开items.py,境加后的代码如下:
# define the fields for your item here like:
name = scrapy.Field()
url = scrapy.Field()
简单说明一下,所有item都继承于scrapy.Item,里面的字段都是scrapy.Field()类型,scrapy.Field()可以接收任何数据类型。
现在该定制我们的爬虫了。
文件夹下建立一个AppScrapy.py,然后打开添加如下代码
from scrapy.spider import BaseSpider
from appScrapy.items import AppscrapyItem
name = 'app_scrapy'
start_urls = ["/cn/genre/ios-yu-le/id6016?mt=8"]
result = []
lis = response.xpath("//div[@class='grid3-column']/div")
for li in lis:
array = li.xpath("./ul/li")
for node in array:
item = AppscrapyItem()
item["name"] = node.xpath("./a/text()").extract()
item["url"] = node.xpath("./a/@href").extract()
result.append(item)
return result
所有爬虫类都需要继承自 BaseSpider,并且必须定义一个name,因为启动爬虫时我们要靠这个名字来启动。一个url的数组,必须的这个爬虫才能知道自己应该去哪,最后必须实现parse方法,在这里对爬回来的数据真行筛选得到我们想要的。
当我们启动这个爬虫时 (scrapy crawl app_scrapy),scrapy会从start_urls中取出第一条url,并且用这个url发起一个request,并且把parse作为该request的回调函数,在回调函数中的response就是该request请求后得到的响应。
对于内容的选取我们用xpath方法,xpath方法中要求输入一个路径返回一个selector数组。
对于路径我们可以使用Chrome的开发者工具得到,如上图所示。 我们想要获取内容时,只要在Element选项卡下选中内容,然后右键选择 copy xPath
lis = response.xpath("//div[@class='grid3-column']/div")
首先我们利用xpath获得 class =
‘grid3-column’的div 中所有的div,返回的值一个数组。从上面的图片中我们可以看数组中应该是3个表示div 的selector.
每个div中的内容如上图所示。我们取出每一个div对其内容再解析。
for li in lis:
array = li.xpath("./ul/li")
for node in array:
item = AppscrapyItem()
item["name"] = node.xpath("./a/text()").extract()
item["url"] = node.xpath("./a/@href").extract()
result.append(item)
首先用for 循环取出每一个div,然后在当前的div下获取所有的ul下的所有li,所上图所示,我们会得到一个表示li的selector数组。我们再看一下li的结构
中间的文字我们通过text()来获得,所以当前li的文字路径为”./a/text()” “.”表示当前的selector开始。如果这样返回,xpath返回的是一个selector.我们想要获取其真正的值还需要调用extract(),这样就会返回一个其真实字面值的数组。
要想获取字段的属性值,需要使用 @,如上面的@href,然后把这些值赋给我们写好的item就ok了。
数据当然要把保存了,未完待续,下次写怎么保存到数据库。,
你最喜欢的新浪微博数据爬取:用户个人信息
新浪微博数据的爬取主要有两种方法,当然也可以说博主只知道这两种方法,一种是使用新浪API获取,另一种是结合正则直接爬取页面信息。第一种方法虽然官方封装甚好,给出的数据也比较丰富,但说到底还是限制太多,很多接口只能获取当前登录用户的信息,无法获取好友的信息(你若不信,可以实践一下),所以在爬取数据的过程中干脆放弃了。本文主要介绍第二种方法,即如何结合正则爬取页面信息。登录微博首先是登录微博,博主使用的是urllib2(当然你也可以使用requests),说明一下,有关爬取的相关代码,都写在SinaClient这个类中,login方法如下:12345678910111213141516171819202122232425262728#使用urllib2模拟登录过程def login(self, username=None, password=None):    self.status = False #重新将登录状态设置为False    (&Start to login...&)    #根据用户名和密码给默认参数赋值,并初始化post_data    self.setAccount(username, password)
   self.setPostData()
   self.enableCookie()
   #登录时请求的url    login_url = r&.cn/sso/login.php?client=ssologin.js(v1.4.15)&    headers = self.headers    request = urllib2.Request(login_url, urllib.urlencode(self.post_data), headers)    resText = urllib2.urlopen(request).read()    try:                jsonText = json.loads(resText)        if jsonText[&retcode&] == &0&:            (&Login success!&)            self.status = True            #将cookie加入到headers中            cookies = &;&.join([cookie.name + &=& + cookie.value for cookie in self.cookiejar])            headers[&Cookie&] = cookies        else:            self.logger.error(&Login Failed --& & + jsonText[&reason&])    except Exception, e:        print e        (&Login Failed2!&)    self.headers = headers    return self上面用到了几个方法,与先前的模拟新浪微博登录:从原理分析到实现这篇博文的源码类似,可以参考模拟登录新浪的源码/csuldw/WSpider/tree/master/SinaLogin。本文的完整源码,待后续整理完整后,也会在该github的WSpider仓库中给出。登录之后,就可以进行数据爬取了。获取用户个人信息为了方便,博主将请求ULR的内容写在了openURL方法里,该方法返回的是该url链接的源码,代码如下:12345#打开url时携带headers,此header需携带cookiesdef openURL(self, url, data=None):    req = urllib2.Request(url, data=data, headers=self.headers)    text = urllib2.urlopen(req).read()    return text爬取用户个人信息时,为了得到更多的信息,我们需请求多个地址,博主在爬取时访问了如下四个:url_app = “/%s/info“ %uidapp_page = “/%s“ %uidurl_web = “/%s/info“ %uidtag_url = “/account/privacy/tags/?uid=%s“ %uid温馨提示:%uid是新浪微博用户ID,若想查看四个页面的信息,将%s替换成用户ID即可。比如将url_app中的uid赋值为,则网址为//info。在上述网址中,从url_app中可以得到昵称、性别、地区、生日、简介、性取向、婚姻状况、首页链接八个字段;从app_page中可以得到用户的关注量、粉丝量、微博量;从url_web中可以获取用户的注册日期;从tag_url中则可以得到用户的标签信息。将这些信息合并到一起,加上uid,共可得14个字段。爬取过程中有的字段取值因用户没填写而造成结果不存在,为了统一字段数量,我们将这些不存在的字段统一置为空串。请求一个页面时,我们可以将页面的源码保存下来,然后使用BeautifulSoup进行解析,再结合正则找到需要的字段值。整个代码如下:123456789101112131415161718192021222324252627282930313233343536373839404142434445464748from bs4 import BeautifulSoup as BSdef getUserInfos(self, uid):    url_app = &/%s/info& %uid    text_app = self.openURL(url_app)    soup_app = unicode(BS(text_app, &html.parser&))    nickname = re.findall(u&\u[:|\uff1a](.*?)    gender = re.findall(u&\ub[:|\uff1a](.*?)    address = re.findall(u&\ua[:|\uff1a](.*?)    birthday = re.findall(u&\u751f\u65e5[:|\uff1a](.*?)    desc = re.findall(u&\u7b80\u4ecb[:|\uff1a](.*?)    sexorientation = re.findall(u&\u\u5411[:|\uff1a](.*?)    marriage = re.findall(u&\u611f\u60c5\u72b6\u51b5[:|\uff1a](.*?)    homepage = re.findall(u&\u4e92\u[:|\uff1a](.*?)    #根据app主页获取数据    app_page = &/%s& %uid    text_homepage = self.openURL(app_page)    soup_home = unicode(BS(text_homepage, &html.parser&))    tweets_count = re.findall(u&\u5fae\u535a\[(\d+)\]&, soup_home)    follows_count = re.findall(u&\u\[(\d+)\]&, soup_home)    fans_count = re.findall(u&\u7c89\u4e1d\[(\d+)\]&, soup_home)    #根据web用户详情页获取注册日期    url_web = &/%s/info& %uid    text_web = self.openURL(url_web)    reg_date = re.findall(r&\d{4}-\d{2}-\d{2}&, text_web)    #根据标签详情页获取标签            tag_url = &/account/privacy/tags/?uid=%s& %uid    text_tag = self.openURL(tag_url)          soup_tag = BS(text_tag, &html.parser&)    res = soup_tag.find_all(&div&, {&class&:&c&})    tags = &|&.join([elem.text for elem in res[2].find_all(&a&)])        #将用户信息合并            userinfo = {}    userinfo[&uid&] = uid    userinfo[&nickname&] = nickname[0] if nickname else &&    userinfo[&gender&] = gender[0] if gender else &&    userinfo[&address&] = address[0] if address else &&    userinfo[&birthday&] = birthday[0] if birthday else &&    userinfo[&desc&] = desc[0] if desc else &&    userinfo[&sex_orientation&] = sexorientation[0] if sexorientation else &&    userinfo[&marriage&] = marriage[0] if marriage else &&    userinfo[&homepage&] = homepage[0] if homepage else &&    userinfo[&tweets_count&] = tweets_count[0] if tweets_count else &0&    userinfo[&follows_count&] = follows_count[0] if follows_count else &0&    userinfo[&fans_count&] = fans_count[0] if fans_count else &0&    userinfo[&reg_date&] = reg_date[0] if reg_date else &&    userinfo[&tags&] = tags if tags else &&    return userinfo上述方法传入的只有一个用户IDuid,最终返回的是一个dict,也就是json串。之所以以JSON串返回是因为这会方便我们后续的数据处理,比如存储至本地或者写入到数据库中。结果字段值如下:1234567891011121314uid:用户IDnickname:昵称address:地址sex:性别birthday:生日desc:简介marriage:婚姻状况follows_count:关注数fans_count:粉丝数tweets_count:微博数homepage:首页链接reg_date:注册时间tag:标签sex_orientation:性取向 实例运行代码后,最终的结果将以JSON串返回,传入uid为的参数,返回结果如下:目前只包含这14个字段,如果需要更多的信息,可去新浪微博网址中仔细查看相关字段,然后将想要的信息加入到userinfo中即可。在后续博文中,将给出用户粉丝爬取、用户关注爬取、用户微博爬取等相关信息,敬请期待!End.作者:刘帝伟 (中国统计网特邀认证作者)本文为中国统计网原创文章,需要转载请联系中国统计网(小编微信:itongjilove),转载时请注明作者及出处,并保留本文链接。

我要回帖

更多关于 app 爬取 的文章

 

随机推荐