分析

豆瓣网电影信息的抓取
豆瓣网电影信息的抓取
通过上面两张图片可以发现
第一页url:https://movie.douban.com/top250?start=0&filter=
第二页url:https://movie.douban.com/top250?start=25&filter=

由此类推
第n页url
https://movie.douban.com/top250?start= (n-1 × 25)&filter=

代码

import requests, csv
from lxml import etree
import multiprocessing		# 使用多进程抓取


class DoubanSpider:

    # 设置请求头
    def __init__(self):
        self.headers = {
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36'
        }


    # 定义一个发送请求并返回响应的实例方法,方便调用
    def get_response(self, url):
        try:
            response = requests.get(url, headers=self.headers)
            response.encoding = 'utf-8'
            assert response.status_code == 200              # 只有状态码是200才返回
            return response
        except:
            return None


    #  提取数据
    def get_data(self, url):
        response = self.get_response(url)
        html = etree.HTML(response.text)
        hrefs = html.xpath('//div[@class="hd"]/a/@href')                    # 电影url链接
        movies_name = html.xpath('//div[@class="hd"]/a/span[1]/text()')     # 电影名称
        score = html.xpath('//div[@class="bd"]//span[2]/text()')            # 电影评分
        for movie_name, movie_url, movie_score in zip(movies_name, hrefs, score):
            print('正在保存' + movie_name)
            self.save_local(movie_name, movie_url, movie_score)


    # 将数据保存到本地
    def save_local(self, movie_name, movie_url, movie_score):
        with open(r'C:\Users\thomas\Desktop' + '\\豆瓣排名.csv', 'a', encoding='utf-8') as f:
            w = csv.writer(f)
            w.writerow([movie_name, movie_url, movie_score])  # 每一条数据


if __name__ == '__main__':
    pool = multiprocessing.Pool(30)                                         # 30个进程
    url = "https://movie.douban.com/top250?start={}&filter="
    spider = DoubanSpider()
    pool.map(spider.get_data, [url.format(i * 25) for i in range(100)])     # 异步抓取99页

数据展示

豆瓣网电影信息的抓取

相关文章: