zoukankan      html  css  js  c++  java
  • python第一站

    python 第一站,豆瓣-美国末日评论小爬虫

    最近学习python,但是光是看书看视频学习,总是觉得掌握的不够扎实。所以就决定自己去写写爬虫,当带着目的性去学,也许更容易发现自己需要什么。这是酝酿多日之后的第一个作品,简单的不能再简单的一个小爬虫。

    使用工具:

    • python3 (windows环境)
    • re , urllib , urllib2 , json(这几个是python基本库中的,虽然json好像没用到— —!)
    • BeautifulSoup4(非python基本库,需要自己安装)

    思路:

    首先,使用urllib将url解析成html文本,然后用BeautifulSoup将html文本解析成BeautifulSoup类型的对象,然后去查看对应元素的值以及文本,通过python去分析这些数据,最后给出结果。

    代码:

    # -*- coding: utf-8 -*-
    import urllib , json , string , re
    from urllib import request
    from bs4 import BeautifulSoup as BS
    
    def UrlToHtml(url):
        a = urllib.request.urlopen(url)
        b = a.readlines()
        for i in range(0,len(b)):
            b[i] = b[i].decode('utf-8')
        b = ''.join(b)
        return b 
    
    def ToUrl(Page):
        Nums = int(Page)*20
        url = 'https://www.douban.com/game/25889245/comments?start='+str(Nums)+'&sort=score'
        return url
    
    page = 0
    while True:
        Url = ToUrl(page)
        Html = UrlToHtml(Url)
        soup = BS(Html,'html.parser')
        list_a = []
        list_b = []
        for Li in soup.findAll('li',class_='comment-item'):
            list_a.append(Li)
        for Li in list_a:
            star_f = Li.find(name = 'span', attrs = { 'class' : re.compile(r'allstar..')})
            if star_f == None:
                list_b.append('未打分')
            else:
                list_b.append(dict(star_f.attrs)['title'])
        for i in range(0,len(list_b)):
            if list_b[i] == str('未打分'):
                print('第{}页第{}楼,没有打分'.format(page+1,i+1))
            elif list_b[i] == str('推荐'):
                print('第{}页第{}楼,没有给5星评价'.format(page+1,i+1))
        page+=1
        if len(list_a) < 2 :
            break
    

    知识点:

    • from urllib import request , urllib.request.urlopen(url) , 将url解析成html文本 , 但是解析后类型为bytes,中文显示乱码 , 所以用html.decode('utf-8')将它的类型转化成str
    • soup = BeautifulSoup(Html,'html.parser')将html文本转化成BeautifulSoup对象
    • 使用soup.find 和 soup.findAll 以及正则表达式获取需要的数据
  • 相关阅读:
    (005)Linux 复制命令cp总提示是否覆盖的解决方法,在cp前加
    (030)Spring Boot之RestTemplate访问web服务案例
    Gym
    Gym
    Gym.102006:Syrian Collegiate Programming Contest(寒假自训第11场)
    BZOJ-5244 最大真因数(min25筛)
    HDU
    HDU 1272 小希的迷宫(并查集)
    HDU 3038 How Many Answers Are Wrong(带权并查集)
    POJ 1182 食物链(带权并查集)
  • 原文地址:https://www.cnblogs.com/wangjikun/p/5952463.html
Copyright © 2011-2022 走看看