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 以及正则表达式获取需要的数据

posted on 2016-10-12 13:37  胡欣欣  阅读(211)  评论(0编辑  收藏  举报