爬取豆瓣电影Top250

1.1 爬虫基本原理

  爬虫是模拟用户(User),向服务器(Server)发送请求(Request),获取响应(Response)的程序(Program)。

1.2 请求(Request)

  1.2.1请求方式

    请求常用的方式有get与post方式
    post常用于表单提交

  1.2.2请求头

    请求头包括提交请求的重要信息,常见字段有User-Agent,Refer, Proxy等

1.3 响应(Response)

获取响应的内容,解析以获取相应的信息。

  响应码

  • 200:响应成功
  • 404:用户访问错误
  • 500:服务器错误

1.4 代码演示(Demonstration)

import requests

url = 'https://blog.csdn.net/the_harder_to_love'  # 我的博客主页
response = requests.get(url)  # get method
# response = requests.get(url, data='夜是故乡明')  # 加上参数data, post method
html = response.text  # 获取网页内容
print(html)

1.5 正则表达式(Regular Expression)

  正则表达式是字符串匹配的语言,是解析信息的一种方式。
推荐资料
  廖雪峰-正则表达式
  菜鸟教程-正则表达式
  以及练习正则表达式的学习工具:正则表达式在线测试

1.6 爬取豆瓣电影Top250案例

  本人觉得用re解析html过于麻烦,所以使用PyQuery中CSS选择器完成信息解析,获取了 电影排名,电影名称,导演,主演,上映年份,国家,类型,评分,摘要信息,代码如下。

'''
爬取豆瓣电影Top 250
'''

import requests
from pyquery import PyQuery as pq
import time

BASE_URL = 'https://movie.douban.com/top250?start='


def get_movies():
    movies = []
    for i in range(0, 250, 25):
        url = BASE_URL + str(i)
        html = requests.get(url).text
        doc = pq(html)
        lis = doc('ol.grid_view li').items()
        for li in lis:
            # 电影排名
            rank = li('div.pic em').text()

            # 电影名称
            info = li('div.info')
            name = ''.join([item.text() for item in info('div.hd a span').items()])
            name = ''.join(name.split())  # 去除所有空格

            cnts = list(li('p').items())[0].text().split('\n')

            # 导演,演员
            humans = [item for item in cnts[0].split('\xa0') if item]

            if len(humans) < 2:
                director = humans[0]
                starring = ''
                director = director.replace('导演: ', '')
            else:
                director, starring = humans
                director = director.replace('导演: ', '')
                starring = starring.replace('主演: ', '')

            # 上映年份,国家,类型
            # 移除&nbsp空格符
            year, country, types = (cnts[1].replace('\xa0', '').split('/'))[-1:-4:-1]

            # 评星
            star = li('div.star span.rating_num').text()

            # 摘要
            quote = li('p.quote').text()

            # 电影排名,电影名称,导演,主演,上映年份,国家,类型,评分,摘要
            movie = (rank, name, director, starring, year, country, types, star, quote)
            print(movie)
            movies.append(movie)
        with open('douban_movies_top250.txt', 'w', encoding='utf-8') as f:
            f.writelines(','.join(movie)+'\n' for movie in movies)
    return movies




def count_spend_time(func):
    start_time = time.time()
    func()
    end_time = time.time()
    time_dif = (end_time - start_time)
    second = time_dif%60
    minute = (time_dif//60)%60
    hour = (time_dif//60)//60
    print('spend ' + str(hour) + 'hours,' + str(minute) + 'minutes,' + str(second) + 'seconds')


if __name__ == '__main__':
    count_spend_time(get_movies)

豆瓣电影Top 250 爬虫源代码

豆瓣电影Top 250 电影信息

1.7 爬取豆瓣电影Top250案例小结

  豆瓣电影相关信息可以访问详情页,获取更加完整,全面的信息。

上一篇:Python3 抓取豆瓣电影Top250


下一篇:Python爬虫——爬取豆瓣top250完整代码