买了本书《精通Python网络爬虫》,看完了第6章,我感觉我好像可以干点什么;学的不多,其中的笔记我放到了GitHub上:https://github.com/NSGUF/PythonLeaning/blob/master/examle-urllib.py,因为我用的python3.0,所以,在爬取数据的时候只用到了一个包:urllib。该博文的源码:https://github.com/NSGUF/PythonLeaning/blob/master/APPInfo.py
思路:首先,如果进入了豌豆荚的首页可以看到,其图如图1,主要是分为安卓软件和安卓游戏,所以只需得到这里面所有的链接即可,如影音播放,系统工具等;
图1
当点击随意一个链接时,显示图2,如图可见,该页面会显示每个软件的基本信息,并且会链接到其详细信息上,这时,如果能获取到详细信息的链接就能得到所需的基本信息了;
图2
由于该网站是分页的,所以必须得到页数,由图可见,每个页面的最大都是42,而具体却没有到42,所以后面会显示图4.没有更多内容了所以,可以循环42次;
图3
图4
综上所述:可得获取图1中画下划线的链接,同样包括安卓游戏中的该链接
def getAllLinks(url):#获取首页链接的所有子链接
html1=str(urllib.request.urlopen(url).read())
pat='<a class="cate-link" href="(http://.+?")>'
allLink=re.compile(pat).findall(html1)
allLinks=[]
for link in allLink:
allLinks.append(link.split('"')[0])
return allLinks
获取图2中圈起来的链接,因为其有页码,所以得加上页码
def getAllDescLinks(url,page):#获取子链接中所有app指向的链接
url=url+'/'+str(page)
print(url)
html1=str(urllib.request.urlopen(url).read().decode('utf-8'))
pat2='<ul id="j-tag-list" class="app-box clearfix">[\s\S]*<div class="pagination">'
allLink=str(re.compile(pat2).findall(html1)).strip('\n').replace(' ','').replace('\\n','').replace('\\t','')
allLink=allLink.split('<divclass="icon-wrap"><ahref="')
allLinks=[]
for i in range(1,len(allLink)):
allLinks.append(allLink[i].split('"><imgsrc')[0])
allLinks=list(set(allLinks))
return allLinks
获取详细信息中的信息:
def getAppName(html):#获取app名字
pat='<span class="title" itemprop="name">[\s\S]*</span>'
string=str(re.compile(pat).findall(html))
name=''
if string!='[]':
name=string.split('>')[1].split('<')[0]
return name
def getDownNumber(html):#下载次数
pat='<i itemprop="interactionCount"[\s\S]*</i>'
string=str(re.compile(pat).findall(html))
num=''
if string!='[]':
num=string.split('>')[1].split('<')[0]
return num
def getScore(html):#评分
pat='<span class="item love">[\s\S]*<i>[\s\S]*好评率</b>'
string=str(re.compile(pat).findall(html))
score=''
if string!='[]':
score=string.split('i')[2].split('>')[1].split('<')[0]
return score
def getIconLink(html):#app中icom的图片链接
pat='<div class="app-icon"[\s\S]*</div>'
image=str(re.compile(pat).findall(html))
img=''
if image!='[]':
img='http://'+str(image).split('http://')[1].split('.png')[0]+'.png'
return img
def getVersion(html):#版本
pat='版本</dt>[\s\S]*<dt>要求'
version=str(re.compile(pat).findall(html))
if version!='[]':
version=version.split(' ')[1].split('</dd>')[0]
return version
def getSize(html):#大小
pat='大小</dt>[\s\S]*<dt>分类'
size=str(re.compile(pat).findall(html))
if size!='[]':
size=size.split('<dd>')[1].split('<meta')[0].strip('\n').replace(' ','').replace('\\n','')#strip删除本身的换行,删除中文的空格,删除\n字符
return size
def getImages(html):#所有截屏的链接
pat='<div data-length="5" class="overview">[\s\S]*</div>'
images1=str(re.compile(pat).findall(html))
pat1='http://[\s\