文档章节

大麦网爬虫总结

陈清扬
 陈清扬
发布于 2014/09/07 23:54
字数 1204
阅读 248
收藏 0

json库

第一次使用json库,接受的输入是字典或者列表,但是列表输出的结果不像是json,有很多“[”、“]”,但是将字典转json的话,顺序就乱了,字典内部本来就是无序的,之前特别傻,还想了很多办法看能不能改变字典内的顺序,后来想想根本不可能,内存里面的顺序怎么可能改变呢?所有改变字典顺序的方法都只是在输出时改变了输出的顺序,但字典内部还是一样的。

在这个实验中我调整输出为json后顺序的方法是,将每一对影射作为一个单独的字典,很多对影射就构成一个列表,然后把这个字典扔给json(),再把转换后的字符串进行一系列的局部替换。


抛出错误

每一次的单独抓取都应该放入一个try中,这是之前没有想到的,这样就能避免出现问题时程序报错退出了。


TIPS:

  • 函数的局部申请了list的话,操作做完以后应该当场释放掉,虽然可矣认为是不必要,但这是写程序应该养成的习惯:del time[:]

  • 虽然模拟浏览器的方法用失败了,但是也学了很多以前不知道的操作,如find_elements之类的

  • 因为常常有google的什么东西加载不全,selenium常常会出莫名其妙的问题,譬如之前的点击操作报错,内部的机制你很难dodge过去。


附程序:

#encoding:utf-8
#-----------------------------------------
#-----------------------------------------
import sys
import urllib2
import urllib
import cookielib
from bs4 import BeautifulSoup
import StringIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver import ActionChains
from bidict import bidict
import json
import time

category={}
mcid={'演唱会':1,'音乐会':2,'话剧歌剧':3,'舞蹈芭蕾':4,'曲苑杂坛':5,'体育比赛':6,'度假休闲':7}

ccid={'流行':9,'摇滚':10,'民族':11,'音乐节':12,'其他演唱会':13,
      '管弦乐':14, '独奏':15,'室内乐及古乐':16, '声乐及合唱':17, '其他音乐会':18,
      '话剧 ':19,'歌剧 ':20,'歌舞剧 ':21,'音乐剧 ':22,'儿童剧 ':23,
      '舞蹈 ':24,'芭蕾 ':25,'舞剧 ':26,
      '相声 ':27,'魔术 ':28,'马戏 ':29,'杂技 ':30,'戏曲 ':31,'其他曲苑杂坛 ':32,
      '球类运动':33,'搏击运动':34,'其它竞技':35,
      '主题公园':36, '风景区':37, '展会':38, '特色体验':39, '温泉':40, '滑雪':41, '游览线路':42, '度假村':43, '代金券':44, '酒店住宿':45
      }
mcidDict=~bidict(mcid)
ccidDict=~bidict(ccid)

cj = cookielib.CookieJar()

opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
urllib2.install_opener(opener)
headers = { 'User-Agent': ' Chrome/35.0.1916.114 Safari/537.36' }

def get_source(url):
    global cj,opener,headers
    keepRequest=1
    tryTimes=0
    page=''

    while keepRequest==1 :
        tryTimes+=1
        if tryTimes>5:
            break
        try:
            req=urllib2.Request(url,headers=headers)
            page=urllib2.urlopen(req,timeout=2).read()
            # page=urllib2.urlopen(url,timeout=1).read()
        except:
            print 'request again'
        else:
            keepRequest=0
    return page

def Spider():
    global mcidDict,ccidDict

    global cj,opener,headers
    outcomePathHead='C:/Users/Gentlyguitar/Desktop/MyWork/damai/outcome/'
    # get_source('http://www.damai.cn/projectlist.do?mcid=1&ccid=9')
    # print get_source('http://item.damai.cn/66780.html')
    ccidThresh={1:13,2:18,3:23,4:26,5:32,6:35,7:45}
    startMcid=3
    startCcid=21
    mcid=startMcid
    ccid=startCcid

    while mcid<=7:
        while ccid<=ccidThresh[mcid]: #
            print '当前数据存放地址:'
            path=outcomePathHead+mcidDict[mcid]+'/'+ccidDict[ccid]+'.txt'
            # path=outcomePathHead+'test.txt'
            print path
            uipath = unicode(path , "utf8")
            fileOut=open(uipath,'w')
            pageIndex=1
            while 1: # index of page keep changing until there is no perform list in the page
                try:
                    performListPage='http://www.damai.cn/projectlist.do?mcid='+str(mcid)+'&ccid='+str(ccid)+'&pageIndex='+str(pageIndex)
                    print '当前页面目录:',performListPage
                    listPage=get_source(performListPage)
                    soup=BeautifulSoup(listPage)
                    performList=soup.find(attrs={'id':'performList'})
                    titleList=performList.find_all('h2')
                    linkList=[]
                    for each in titleList:
                        a=each.find('a')
                        linkList.append(a['href'])

                    if len(titleList)== 0: # indicate the index of page has come to an end, ccid therefore needs to change
                        print 'this is an empty page'
                        break

                    for eachshow in linkList:
                        time=[]
                        price=[]
                        print eachshow
                        showpage=get_source(eachshow)
                        # showpage=get_source('http://item.damai.cn/70686.html')
                        soup=BeautifulSoup(showpage,"html.parser")

                        try:
                            title=soup.find(attrs={'class':'title'}).get_text().strip() # get the title
                        except:
                            title='待定'
                        try:
                            location=soup.find(attrs={'itemprop':'location'}).get_text().strip() # get the location
                        except:
                            location='待定'

    # try:
                        try:
                            timeList=soup.find(attrs={'id':'perform'}).find_all('a') # get the time, which is a list
                            for index,eachtime in enumerate(timeList):
                                time.append(eachtime.get_text().encode('utf-8'))
                            pidList=[]
                            for index,eachtime in enumerate(timeList): # get the price for each time
                                pid=eachtime['pid']
                                # print eachtime['class'],type(eachtime['class'])
                                if eachtime['class']==[u'grey']:
                                    price.append('暂无')
                                    continue
                                if index>0:
                                    data={'type':'33',
                                          'performID':pid,
                                          'business':'1',
                                          'IsBuyFlow':'False',
                                          'sitestaus':'3'}
                                    post_data=urllib.urlencode(data)
                                    url='http://item.damai.cn/ajax.aspx'
                                    keepRequest=1
                                    tryTimes=0
                                    while keepRequest==1: # a time limit is needed
                                        tryTimes+=1
                                        if tryTimes>5:
                                            break
                                        try:
                                            req=urllib2.Request(url,post_data,headers)
                                            newpage=urllib2.urlopen(req).read()
                                        except:
                                            print 'click problem'
                                        else:
                                            keepRequest=0
                                    soup=BeautifulSoup(newpage,"html.parser")
                                    priceLinkList=soup.find_all('a',attrs={'class':True,'price':True})

                                else:
                                    priceLinkList=soup.find(attrs={'id':'price'}).find_all('a')
                                priceList=[]
                                for eachlink in priceLinkList:
                                    norlizedPrice=eachlink.get_text()
                                    norlizedPrice=norlizedPrice.replace(u'暂时无货,登记试试运气~',u' ( 无货 )').replace(u'点击进行预定登记',u' ( 可预定 )')
                                    priceList.append(norlizedPrice.encode('utf-8'))
                                price.append(priceList)

                        except:
                            time.append('待定')
                            price.append('待定')

                        mcidName=mcidDict[mcid]
                        ccidName=ccidDict[ccid]
                        titleName=title.encode('utf-8')
                        placeName=location.encode('utf-8')
                        data=[{"mcid": mcidName},
                              {"ccid": ccidName},
                              {"title": titleName},
                              {"place": placeName},
                              {"time": time},
                              {"price": price}]

                        normalizedData= json.dumps(data,ensure_ascii=False,sort_keys=True,indent=1)
                        normalizedData=normalizedData.replace('[\n {\n','{\n').replace('\n }\n]','\n}').replace('\n }, \n {\n',' ,\n')
                        #print normalizedData
                        fileOut.write(normalizedData+'\n\n\n')
                        fileOut.flush()

                        del time[:]
                        del price[:]
                except:
                    print 'something wrong'
                pageIndex+=1
            ccid+=1
        mcid+=1






if __name__ == "__main__":
    Spider()


© 著作权归作者所有

上一篇: python版opencv
下一篇: gre
陈清扬
粉丝 5
博文 52
码字总数 23875
作品 0
海淀
私信 提问
中国科学家证实: 是世界大麦起源中心之一

中国是世界大麦起源中心之一 原始链接: 大麦青稞起源 1926年,N ·瓦维洛夫(Vavilov,N.)在研究从全世界收集的16000份大麦样本后,从他所提出的八个作物起源中心中确定了三个是大麦起源中心,即中...

FreeBlues
2016/05/24
84
0
爱彼迎来啦,漫漫漫画获数千万元融资,本周可不止这些 | Weekly Report

KEY NEWS 微信指数上线 “微信指数”于3月26日正式上线,这是微信官方提供的基于微信大数据的移动端指数。通过“微信指数”,微信用户可以直观地获取关键词的指数情况,直观地查询到关键词最...

Demo产品计划
2017/03/28
0
0
百威要用 Space X 的二手火箭把大麦种子送上太空

摘要 我们会喝到更好喝的啤酒,还是会听到更响亮的百威品牌? 美国当地时间周三下午,百威提供的一批大麦种子将搭乘 Space X 的猎鹰 9 号火箭上太空。这批大麦种子将在空间站停留一个月左右,...

geekerdeng
2017/12/13
0
0
从 Flutter 的视频渲染到 App 落地经验

3月23日周六,由 RTC 开发者社区主办的 “RTC Dev Meetup 北京站”如约举行,超过100位求知若渴的开发者参加了活动。来自 LeanCloud、声网 Agora、阿里、美团点评的资深工程师,与他们共同分...

声网Agora
03/28
0
0
阿里云解析,解析量国内第一,400万域名信任之选

小编今天很高兴为大家介绍阿里云解析(万网云解析)服务: 阿里云解析是基于万网18年专业DNS解析服务经验,并结合阿里云强大的网络基础设施上,重新设计开发的新一代DNS解析平台,面向全球域名...

阿里云官方博客
2015/05/26
261
3

没有更多内容

加载失败,请刷新页面

加载更多

掌握生成对抗网络(GANs),召唤专属二次元老婆(老公)不是梦

全文共6706字,预计学习时长12分钟或更长 近日,《狮子王》热映,其逼真的外形,几乎可以以假乱真,让观众不禁大呼:awsl,这也太真实了吧! 实体模型、CGI动画、实景拍摄、VR等技术娴熟运用...

读芯术
28分钟前
1
0
C#经典面试题100道

1. .NET和C#有什么区别 答:.NET一般指 .NET FrameWork框架,它是一种平台,一种技术。 C#是一种编程语言,可以基于.NET平台的应用。 2.一列数的规则如下: 1、1、2、3、5、8、13、21、34......

元歌
31分钟前
0
0
重磅!容器集群监控利器 阿里云Prometheus 正式免费公测

Prometheus 作为容器生态下集群监控的首选方案,是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native C...

阿里云云栖社区
33分钟前
1
0
LeetCode 160: 相交链表 Intersection of Two Linked Lists

爱写Bug(ID:iCodeBugs) 编写一个程序,找到两个单链表相交的起始节点。 Write a program to find the node at which the intersection of two singly linked lists begins. 如下面的两个链...

iCodeBugs
35分钟前
2
0
hadoop yarn漏洞 8088端口进入挖矿病毒处理记录

早上发现服务器cpu使用异常 进程如图所示 按照挖矿病毒的套路 肯定是定时任务不停地执行脚本 遂查看定时任务 进入/var/spool/cron 查看定时任务 发现里面有一个root文件 定时任务每分钟执行一...

詹姆斯-高斯林
38分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部