写点Python
首发于写点Python

Python爬虫(3):爬取豆瓣电影TOP250

爬虫(3):爬取豆瓣电影TOP250

前两次我们学习了python里面requests库和xpath语法,来请求网页和解析文本,现在就用这两个工具来完成“豆瓣电影TOP250排行榜”的爬虫程序。

豆瓣电影TOP250


请求网页内容

直接上代码


import requests 

url = 'https://movie.douban.com/top250' 
con = requests.get(url).content

返回网页源代码,下一步提取文本。


提取信息



我们暂时先把这些信息取下来:影片名称,导演演员信息,评分,评论人数,上映日期,制片国家。


# coding:utf-8 
import requests 
from lxml import html 

url = 'https://movie.douban.com/top250' 
con = requests.get(url).content 
sel = html.fromstring(con) 

# 所有的信息都在class属性为info的div标签里,可以先把这个节点取出来 
for i in sel.xpath('//div[@class="info"]'): 
    # 影片名称 
    title = i.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0] 
    info = i.xpath('div[@class="bd"]/p[1]/text()') 

    # 导演演员信息 
    info_1 = info[0].replace(" ", "").replace("\n", "") 
    # 上映日期 
    date = info[1].replace(" ", "").replace("\n", "").split("/")[0] 
    # 制片国家 
    country = info[1].replace(" ", "").replace("\n", "").split("/")[1] 
    # 影片类型 
    geners = info[1].replace(" ", "").replace("\n", "").split("/")[2] 
    # 评分 
    rate = i.xpath('//span[@class="rating_num"]/text()')[0] 
    # 评论人数 
    comCount = i.xpath('//div[@class="star"]/span[4]/text()')[0] 
    # 打印结果看看 
    print title, info_1, rate, date, country, geners, comCount



得到这个初步结果就表达爬取成功,第一页总共25记录,下面来看看如何获取剩下的分页。


获取分页

点击排行榜的下一页链接,网站的URL变成下面这个样子,翻多两页你再看看,是不是发现规律了。



URL中“start”元素的值等于当前页列表第一位的TOP序号,当然是加一之后。OK,一共十页,一页25项。分页请求的写法用一个for循环来完成:


for i in range(10): 
    url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25)

保存文件

这里我们把结果写入到本地txt文件,也可以使用python的csv模块写入到csv文件中,关于csv我们下次再介绍,这里说说如何写入到txt文件。

python读写文件方法很简单,我们这里再加上with-as语法


with open(filename, mode) as f: 
    do something

mode是文件读写模式

w:以写方式打开,
a:以追加模式打开 (从 EOF 开始, 必要时创建新文件)
r+:以读写模式打开
w+:以读写模式打开 (参见 w )
a+:以读写模式打开 (参见 a )
rb:以二进制读模式打开
wb:以二进制写模式打开 (参见 w )
ab:以二进制追加模式打开 (参见 a )
rb+:以二进制读写模式打开 (参见 r+ )
wb+:以二进制读写模式打开 (参见 w+ )
ab+:以二进制读写模式打开 (参见 a+ )

这里读写的模式用a就可以了


完整程序

综合上述


# coding:utf-8 
import requests from lxml import html 
import sys 
reload(sys) 
sys.setdefaultencoding( "utf-8" ) 

k = 1 
for i in range(10): 
    url = 'https://movie.douban.com/top250?start={}&filter='.format(i*25) 
    con = requests.get(url).content 
    sel = html.fromstring(con) 

    # 所有的信息都在class属性为info的div标签里,可以先把这个节点取出来 
    for i in sel.xpath('//div[@class="info"]'): 

        # 影片名称 
        title = i.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0] 
    
        info = i.xpath('div[@class="bd"]/p[1]/text()') 
        # 导演演员信息 
        info_1 = info[0].replace(" ", "").replace("\n", "") 
        # 上映日期 
        date = info[1].replace(" ", "").replace("\n", "").split("/")[0] 
        # 制片国家 
        country = info[1].replace(" ", "").replace("\n", "").split("/")[1] 
        # 影片类型 
        geners = info[1].replace(" ", "").replace("\n", "").split("/")[2] 
        # 评分 
        rate = i.xpath('//span[@class="rating_num"]/text()')[0] 
        # 评论人数 
        comCount = i.xpath('//div[@class="star"]/span[4]/text()')[0] 

        # 打印结果看看 
        print "TOP%s" % str(k) 
        print title, info_1, rate, date, country, geners, comCount 

        # 写入文件 
        with open("top250.txt", "a") as f: 
            f.write("TOP%s\n影片名称:%s\n评分:%s %s\n上映日期:%s\n上映国家:%s\n%s\n" % (k, title, rate, comCount, date, country, info_1)) 

            f.write("==========================\n") 
    
        k += 1

得到txt文件



写在最后

每个电影的链接都可以进去到电影详细页面,获取电影简介等更加丰富内容,那这个要怎么实现呢?先留给大家去思考吧。

Python爬虫(1):Requests

Python爬虫(2):XPath语法

更多详情: 写点Python - 知乎专栏

编辑于 2017-04-11

文章被以下专栏收录