• 豆瓣 爬虫


    太久没有写爬虫了,掌握的知识不能让他生疏了

    想了想写一个按照输入,能查询到豆瓣里的信息

    首先,先打开豆瓣的搜索页面

    会发现是这样的,左边有一栏标签,然后有个搜索框。

    可以点击标签,观察url的变化,发现https://www.douban.com/search?cat=1001&q=中的cat也相对应的发生变化,我这边就先选取几个来,电影,书籍,音乐,游戏。发现除了游戏外,规律是1001,1002,1003.很有意思,然后q=后面的参数就是你要搜索的东西。

    那我们要完成的功能,就是在我们自己地方,输入信息,然后输出豆瓣评分等一系列详情。

    我这边是在跳转到他的详细页面去爬取数据,当然,如果仅是我最后的那些内容来看,在这个页面就能满足了。

    而且我的代码是获得搜索到的第一条数据,如果有更多的需求的话,可以去看一些xpath,然后修改

    话不多说,我先获取到修改一条需要修改的url,先写个视图,

    def menu():
        print("*请输入对应序号,锁定查询范围*")
        print("********** 1   书籍 **********")
        print("********** 2   电影 **********")
        print("********** 3   音乐 **********")
        print("********** 4   游戏 **********")

    这个菜单,表示搜索的标签时什么,然后需要处理下,获取对应url,

    def getUrl(x,what):
        if x == 4:
            y = 3114
        else:
            y = 1000+x
        url = 'https://www.douban.com/search?cat={}&q='.format(y)+what
        
        getNewUrl(x,url)

    那个what指的就是输入的要搜索的内容。

    第一条url就这样只做好了,字符串拼一下

    然后要获取第二条url,这里用xpath的方法,并输出他

    def getNewUrl(x,url):
        #模拟浏览器
        kv = {'user-agent':'Mozilla/5.0'}
        html = requests.get(url , headers = kv).text
        s = etree.HTML(html)
    
        new_url = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[3]/div[2]/div[1]/div[2]/div/h3/a/@href')[0]
        print("豆瓣地址:",new_url)
        
        spyder(x,new_url)

    然后获取到了一条详细页面的url,这时候我们就要去里面找数据了

    由于豆瓣的原因,导致这些分区的标题,评分等对应的xpath并不相同,所以我一直在传一个参数x,表示选择的分区,然后再爬虫的函数里分类选择。

    def spyder(x,url):
        #模拟浏览器
        kv = {'user-agent':'Mozilla/5.0'}
        html = requests.get(url , headers = kv).text
        s = etree.HTML(html)
        
        if x == 1:                  #书籍
            
            title = s.xpath('/html/body/div[3]/h1/span/text()')[0].strip()
            print("标题:",title)
            
            goal = s.xpath('/html/body/div[3]/div[2]/div/div[1]/div[1]/div[1]/div[2]/div/div[2]/strong/text()')[0].strip()
            print("评分:",goal)
            
            chubanshe = s.xpath('//*[@id="info"]/text()')
            chubanshe1 = s.xpath('//*[@id="info"]/span/text()')
            
            #print(chubanshe,chubanshe1)
            
            message = [q.strip() for q in chubanshe if q.strip()!='']
            message1 = [q.strip() for q in chubanshe1 if q.strip()!='' and q.strip!=':']
    
            isbn = message[len(message)-1]
            message[len(message)-1] = s.xpath('/html/body/div[3]/div[2]/div/div[1]/div[1]/div[1]/div[1]/div[2]/a/text()')[0].strip()
            message.append(isbn)
    
            text = s.xpath('/html/body/div[3]/div[2]/div/div[1]/div[3]/div[1]/div[1]/div/p/text()')[0].strip()
    
            j=0
            for i in range(len(message)):
                if message1[j]==":":
                    j = j+1
                print(message1[j],message[i])
                j = j+1
                
            print('内容简介:',text)
            
            print("********************************************************************")
            print()
            print()
        elif x == 2:                #电影
            title = s.xpath('/html/body/div[3]/div[1]/h1/span[1]/text()')[0].strip()
            print("title:",title)
    
            goal = s.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[1]/div[1]/div[2]/div[1]/div[2]/strong/text()')[0].strip()
            print("评分",goal)
    
            text = s.xpath('/html/body/div[3]/div[1]/div[3]/div[1]/div[3]/div/span[1]/text()')[0].strip()
            print("剧情简介:",text)
            
        elif x == 3:                #音乐
            title = s.xpath('/html/body/div[3]/h1/span/text()')[0].strip()
            print("title:",title)
    
            goal = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/div[1]/div[2]/div/div[2]/strong/text()')[0].strip()
            print("评分",goal)
            
            text = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[3]/div[1]/span/text()')[0].strip()
            print("简介:",text)
    
            chubanshe = s.xpath('//*[@id="info"]/text()')
            chubanshe1 = s.xpath('//*[@id="info"]/span/text()')
            
            message = [q.strip() for q in chubanshe if q.strip()!='']
            message1 = [q.strip() for q in chubanshe1 if q.strip()!='' and q.strip!=':']
    
            
            j=0
            for i in range(len(message)):
                if message1[j]==":":
                    j = j+1
                print(message1[j],message[i])
                j = j+1
            
        elif x == 4:                #游戏
            title = s.xpath('/html/body/div[3]/div[1]/h1/text()')[0].strip()
            print("title:",title)
    
            goal = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[1]/div[2]/div/div/div[2]/strong/text()')[0].strip()
            print("评分",goal)
    
            text = s.xpath('/html/body/div[3]/div[1]/div/div[1]/div[4]/p/text()')[0].strip()
            print("剧情简介:",text)

    同时,也是因为豆瓣的原因,导致一些一个区的,但是一些细节数据上的xpath也不尽相同,诶。导致很多数据有些能取到,有些取不到。

    最后写一个main

    if 'main':
        while 1:
                
            menu()
            try:
                print("要查询的编号")
                x = int(input())
                print("请输入要查询的内容")
                what = input()
                getUrl(x,what)
            except:
                print("请输入数字")

    就over啦

  • 相关阅读:
    wireshark 实用过滤表达式(针对ip、协议、端口、长度和内容)
    32:从1到n整数中1出现的次数
    31:连续子数组的最大和
    30:最小的K个数
    29:数组中出现次数超过一半的数字
    28:字符串的排列
    27:二叉搜索树与双向链表
    26:复杂链表的复制
    25:二叉树中和为某一个定值的路径
    24:二叉搜索树的后序遍历序列
  • 原文地址:https://www.cnblogs.com/afei123/p/11336056.html
Copyright © 2020-2023  润新知