目录[-]

简单的爬虫程序实践:爬取豆瓣电影Top250榜单的网站数据

#作者:冯桂和
#功能:爬取豆瓣电影Top250榜单的网站数据
#网址:https://movie.douban.com/top250
#保存:将爬取的数据保存至DouBanMovieTop250.csv

from urllib import request
import re
import time
import random
import csv
from ua_info import ua_list

# 定义一个爬虫类
class DouBanSpider(object): 

    #初始化
    #定义初始页面url
    def __init__(self):
        self.url = "https://movie.douban.com/top250?start={}"
    #请求函数
    def get_html(self,url):
        headers = {'User-Agent':random.choice(ua_list)} #随机用户请求头
        req = request.Request(url=url,headers=headers)  #创建请求对应
        res = request.urlopen(req)                      #获取响应对象
        html = res.read().decode()                      #获取响应内容
        self.parse_html(html)                   #调用解析函数
    #解析函数
    def parse_html(self,html):
        #正则表达式
        re_bds = r'<span class="title">(.*?)</span>.*?<p class="">\n                            导演: (.*?)&nbsp;&nbsp;.*?<br>\n                            (.*?)&nbsp;/&nbsp;(.*?)&nbsp;/&nbsp;.*?property="v:average">(.*?)</span>.*?<span>(.*?)人评价</span>.*?<span class="inq">(.*?)</span>'
        #生成正则表达式对象
        pattern = re.compile(re_bds,re.S)
        #列表元组
        r_list=pattern.findall(html)
        self.save_html(r_list)                  #调用保存函数 
    #保存函数
    def save_html(self,r_list):
        #生成文件对象
        with open('DouBanMovieTop250.csv','a',newline='',encoding="utf-8") as f:
            #生成csv操作对象
            writer = csv.writer(f)
            #整理数据
            for r in r_list:
                name = r[0].strip()#电影名
                director=r[1].strip()#导演名
                year=r[2].strip()#年份
                area = r[3].strip()#地区
                mark=r[4].strip()#分数
                people=r[5].strip()#评价人数
                describe=r[6].strip()#描述
                L = [name,director,year,area,mark,people,describe]
                # 写入csv文件
                writer.writerow(L)
                print(name,mark)

    #主函数
    def run(self):
        #抓取每一页数据,共10页
        for offset in range(0,10):              #生成0~9序列
            url = self.url.format(offset*25)    #分页url拼接
            self.get_html(url)                  #url参数导入get_html函数
            #生成1-2之间的浮点数
            time.sleep(random.uniform(1,2))

# 以脚本方式启动
if __name__ == '__main__':
    #捕捉异常错误
    try:
        spider = DouBanSpider()
        spider.run()
    except Exception as e:
        print("错误:",e)

用户池

ua_list = [
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11',
    'User-Agent:Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11',
    'Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)',
    'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',
    'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0',
    'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1',
    'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1',
    'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1',
]