豆瓣 爬虫

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

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

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

豆瓣 爬虫

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

可以点击标签,观察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啦

 

上一篇:一篇文章搞懂unittest单元测试框架


下一篇:AntV F2