360应用市场爬虫

依据搜索内容的不同,爬取相应APP的相关内容。例如搜索“微信”:
http://zhushou.360.cn/search/index/?kw=%E5%BE%AE%E4%BF%A1

看到页面请求方式为GET,因此可以用以下方法。
若为POST,获取html的方法为urllib.request

一级页面定义一个类spider():

  • init()
  • getsource(self,url):用来获取网页源码(url–html)
  • getinfo(self,html) :从html中提取信息

urllib2.urlopen(url).read() 获取网页源码:

    def getsource(self, url):
        response = urllib2.urlopen(url)
        html = response.read()
        return html

提取信息采用beautifulsoup完成:

    def getinfo(self, html):
        #用美味的汤将html转成soup
        soup = BeautifulSoup(html)
        #定义根节点1
        jd1 = soup.find_all('dl')   
        #定义根节点2
        jd2 = soup.find_all('div',attrs ={"class":"sdlft"})                  
        #获取根节点1下的子标签
        appName = jd1[0].find_all('span',attrs = {"class":"red"})                    
        description = jd1[0].find_all('p')
        #无法用soup匹配的标签采用正则表达式匹配:
        pattern = re.compile('\d\.\d')
        score = re.findall(pattern,str(jd2))[0]
        link = re.findall(r"(?<=href=\").+?(?=\")|(?<=href=\').+?(?=\')", str(jd1))[0]
        #获取根节点2下的子标签
        downNum =jd2[0].find_all('p',attrs = {"class":"downNum"})
        #提取soup中的标签
        name = appName[0].string
        des = description[0].string
        down = downNum[0].string
        pagelink ="http://zhushou.360.cn"+ link
        return name,des,score+'分',down,pagelink

二级页面定义nextPage类:

  • init
  • getsource(self,url)
  • getinfo(self,html)

实现方法同上,根据需求提取信息。需要注意的是,二级页面的url的获取,此次爬取的一级页面中,在href中已经有二级页面的url地址,因此只需要将一级页面的href拿到即可作为二级页面的输入。

存储爬取到的信息,定义savefun()类:

  • init
  • save(self)
    def save(self):
        #定义字典
        dict = {}
        dict['appName'] = (myspider.getinfo(html)[0].encode("utf-8"))
        dict['description'] = urllib.quote(myspider.getinfo(html)[1].encode("utf-8"))
        dict['score'] = myspider.getinfo(html)[2]
        dict['downLoad'] = myspider.getinfo(html)[3]
        dict['href'] = myspider.getinfo(html)[4]
        dict['tag'] = mypage.getinfo(html2)[0]
        dict['language'] = mypage.getinfo(html2)[1]
        print dict

        fp = file("02.txt", 'w')
        #print json.dumps(dict)
        fp.write(json.dumps(dict))
        fp.close()

主程序:

if __name__ == '__main__':
    keyword = "微信"
    base_url = "http://zhushou.360.cn/search/index/?kw=%s" % urllib.quote(keyword.encode("utf-8"))
    myspider = spider()
    html = myspider.getsource(base_url)
    #myspider.getinfo(html)
    base_url2 = myspider.getinfo(html)[4]
    mypage = nextPage()
    html2 = mypage.getsource(base_url2)
    mypage.getinfo(html2)

    mysave = savefun()
    mysave.save()

Tips:

  • URL中有中文需要转码:
    urllib.qoute(keyword.encode(“utf-8”)

  • soup的格式比较特殊,不能直接作为字符串操作
    str(soup)或appName[0].string操作

  • soup.p.dl可直接获取p标签下的dl标签

  • dict = {}定义字典,当字典导出的时候会碰到无法写入txt的情况,采用json.dumps改进。

待改进:
- 使用MySqldb或者MongoDB将爬取的数据直接入库
- 搜索应该封装成类,对代码进行优化
- Scrapy 框架 和 XPath 待学习

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值