爬虫学习(3):搭建自己的电影资源网(保姆式教学)

提醒: 本文所涉及的资源均采集自互联网,只作为学习使用,切勿用于盈利,支持正版,如有侵权,即刻删除。由于过长的篇幅影响观感,文中完整代码和涉及到的url可在从今天开始种树个人博客中查看,同时建议采集过程不要影响网站正常运行,完整代码拉至最后。

背景

随着版权意识的增强,以前在网上“广为流传”的资源版权均已被几大视频网站购买,有些时候不得不去开所有网站的会员才得以一睹芳容,甚至有些冷门和年代较老的电影还没有。想看还得靠双手来采。由于某些原因(自己体会),本文中不会出现这些网站的网址,如想完整了解学习,请移步从今天开始种树(都是小网站,估计只有一台服务器,尽量不要使用多线程采集,大家都是学习用途,多睡眠一会,不要影响网站正常运行,这是基本素养。

最终效果

实现了简单的web与查询功能:
在这里插入图片描述
在这里插入图片描述

思路与流程

流程如图
总体流程与涉及技术如上所示,选定的几个网站采集都很简单,属于baby级,主要还是找到这些网站。

选定目标

经过四处搜索,发现有几个网站资源均已某度网盘形式保存,故选定了这几家网站。有一个网站是以公众号回复方式跳转的,需要安装Fiddler来获取请求链接。

网站1

首页
布局为一页16部电影,跳转下一页方式也很简单:

https://XX.com/dy/page/2 #第2页
https://XX.com/dy/page/3 #第3页

元素审查中也能看到每部电影的链接,链接规律,只需使用正则表达式即可把12个链接提取出来,直接跳转相应页面:
在这里插入图片描述
到电影页面网盘链接与提取码也一目了然,直接正则获取:在这里插入图片描述
网站1框架大致如此,所需信息提取都极为简单。

网站2

网站2难度稍微比网站1大了一点点,通过公众号回复获取链接:
在这里插入图片描述
跳转后:
在这里插入图片描述
通过Fiddler查看返回的请求,发现每部电影跳转链接都很规律,获取a标签href的值加上域名即可跳转,与上个网站一样,正则表达式提取:

在这里插入图片描述

域名/bdy/1414.html #生化危机的跳转链接

跳转后也可用正则表达式直接提取盘url和提取码:
在这里插入图片描述

采集

两个网站采集工作都相对简单,不过为了扩展性,在编写代码时两个网站都继承自一个父类,有些通用的方法可先定义好,这样在后续可以减少重复代码,本文已网站1为例。

准备数据库

为了便于后续存储操作,这里定义了一个类用于数据库操作(篇幅有限,就不贴所有代码了,无关紧要的均已pass代替)

    #创建表与库
    def create(self, sql):
        try:
            with self.cursor as cursor:
                cursor.execute(sql)
        finally:
            self.close()

    def create_db(self, db):
        try:
            create_database = """CREATE DATABASE IF NOT EXISTS {} DEFAULT
                                CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci""".format(db)
            self.cursor.execute(create_database)
            print("数据库创建完成!")
        except Exception as e:
            print("创建数据库时出现错误!",e)

    #创建表,一共计划提取9个字段,根据字段名字可以大概知道代表的意思
    def create_table(self):
        create_table = """
                CREATE TABLE IF NOT EXISTS movie (

                movie_name varchar(30) NOT NULL,     
                release_date varchar(30) NOT NULL,     
                movie_type varchar(30) NOT NULL,     
                movie_country varchar(30) NOT NULL,     
                movie_url varchar(200),
                movie_info varchar(900),
                pan_url varchar(200),
                pan_code varchar(30),
                crawl_time DATETIME NOT NULL,
                PRIMARY KEY (movie_name)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"""

        self.create(create_table)
        print("表创建完成!")
   def insert(self,table,data_list):
          pass

   def select(self,table,data_list):
          pass

采集链接准备

接下来进入采集环节,首先准备url(url均可在从今天开始种树个人博客中查看复制):

class MovieSpider(SpiderBase):

    def __init__(self):
        super().__init__()
        #关键字url
        self.search_url = "https://xx.com/?s={}"
        #此网站域名
        self.base_url = "https://xx.com/"
        #cookie
        self.cookie = "PHPSESSID=xxx; wp_xh_session_xxx=a0174a03b718aea56c2e4e3979022b82%7C%7C1592400715%7C%7C1592397115%7C%7Cfb11ea82c76cfb9d5fa390xxa"
        #第几页url
        self.dy_url = "https://xx.com/dy/page/{}"
        self.flag_file = "flag.txt"
        self.db = MySql()

抓取函数

抓取函数对request.get和request.post做了一定的封装,完整代码可在从今天开始种树个人博客中查看复制

    def crawler(self, url):
        #download_page功能与request.get差不多,封装在SpiderBase类中
        #
        resp = self.download_page(url, cookies=self.cookie, headers=self.headers(),verify=False)
        return resp

提取函数

   def extract_data(self, html):
        text = html
        content_list = []
        #提取某部电影跳转链接
        pattern_index = "https://xxx.com/\d{1,6}.html"
        #re_exract为封装的一个正则表达式提取方法,与re.findall一样
        _match_index = self.re_exract(html_text=text, pattern=pattern_index)
        #网页中有一些重复的链接,去重
        match_index = list(set(_match_index))
        for mt in match_index:
            rd = random.randint(9,15)
            #redirect为跳转到某部电影详情也取提取百度云盘url和提取码
            ret_dict = self.redirect(mt)
            print("开始睡眠{}秒".format(rd))
            time.sleep(rd)
            if ret_dict:
                content_list.append(ret_dict)
        return content_list

入库

    def save_to_db(self,db_object):
        self.db.insert("movie",db_object)

总体调度

整体调度如下,流程为获取某页所有电影并提取每部电影详情链接,跳转到详情页,提取百度云盘地址和提取码

    def schedule(self):
        page = 1
        while True:
            try:
                if page +1 %6 == 0:
                    time.sleep(30)
                print("开始爬取第{}页".format(str(page)))
                #获取某页的所有电影
                url = self.dy_url.format(str(page))
                resp = self.crawler(url)
                if resp.status_code != 200:
                    print("爬取完毕")
                    break

                #提取数据
                content_list = self.extract_data(resp.text)
                print("第{}页内容:".format(str(page)))
                print(content_list)
                #存储数据
                self.save_to_db(content_list)
                print("数据存储成功")
                page += 1
            except Exception as e:
                with open(self.flag_file,'w',encoding='utf-8') as f:
                    f.writelines(str(page))
                print(e)

提取过程

下图为提取过程(隐去了域名,所有域名可在从今天开始种树继续查看)
提取过程
在这里插入图片描述
这下可以随意挑选电影看了。

WEB网站

安装Django

本文采用比较容易上手的Django,首先得安装django库,最好使用与本文中一样的版本:

pip install django==2.2.6

创建工程与应用

在pycharm中创建一个Django工程,点击File->New Project:
在这里插入图片描述
在刚刚创建的mv_web工程下SHIFT右键选择在此打开PowerShell窗口(后面迁移数据的时候也要再次打开这个窗口,或者就先别关闭):
输入以下命令:

python .\manage.py startapp movie

在这里插入图片描述
在my_web下创建一个名为apps和static的目录,apps用于保存所有的应用,将movie应用移动到apps下(即movie文件夹剪切到apps下),static用于保存css、js等静态文件,现在的目录结构如下:
在这里插入图片描述

setting文件配置

打开setting文件,修改以下内容:

#找到INSTALLED_APPS
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.movie'  #注册应用(添加这行)
]

LANGUAGE_CODE = 'zh-hans'  #找到这行,改为zh-hans
TIME_ZONE = 'Asia/Shanghai'#找到这行,Asia/Shanghai
USE_TZ = False #找到这行,False

#添加下面这行
STATICFILES_DIRS = [ os.path.join(BASE_DIR, 'static') ]

注册模型

模型即与数据有关,打开movie文件夹下的models.py文件,创建模型,类型于建表,可以将下面代码复制进去。

from django.db import models

# Create your models here.
class Movie(models.Model):
    movie_name = models.CharField(max_length=100,verbose_name="电影名")
    pan_url = models.CharField(max_length=100,verbose_name="云盘链接")
    movie_url = models.CharField(max_length=100,verbose_name="电影链接")
    movie_info = models.CharField(max_length=100,verbose_name="电影介绍")
    pan_code = models.CharField(max_length=100,verbose_name="云盘密码")
    release_date = models.CharField(max_length=100,verbose_name="电影发行时间")
    movie_type = models.CharField(max_length=30,verbose_name="电影类型")
    movie_country = models.CharField(max_length=30,verbose_name="电影国家")
    crawl_time = models.DateTimeField(auto_now_add=True,verbose_name="爬取时间")

    class Meta:
        db_table = "movie"
    def get_json(self):
        return {
            "movie_name": self.movie_name,
            "pan_url": self.pan_url,
            "movie_url": self.movie_url,
            "movie_info": self.movie_info,
            "pan_code": self.pan_code,
            "release_date": self.release_date,
            "movie_type": self.movie_type,
            "movie_country": self.movie_country,

        }

数据迁移

迁移

注册完模型,需要让这模型转为相对应的表和字段,就要做迁移操作,在mv_web工程下SHIFT右键选择在此打开PowerShell窗口:

python manage.py makemigrations #默认所有修改过的model层转为迁移文件

python manage.py migrate  # 默认将所有的迁移文件都执行,更新数据库

可以使用Navicat查看一下是否创建成功:
在这里插入图片描述
双击打开连接后应该就能看到movie表,这时候里面还没有数据,需要将前面采集保存在mysql中的数据导入到这个表中。

导出数据

右键选择mysql中的movie表,选择导出向导:
在这里插入图片描述

导入数据

导出的语句类似于下面这样,直接在sqlite数据库中执行即可保存。

INSERT INTO `movie`(`movie_name`, `release_date`, `movie_type`, `movie_country`, `movie_url`, `movie_info`, `pan_url`, `pan_code`, `crawl_time`) VALUES ('我在这里', '2019', '喜剧', '法国', 'https://xxx.com/47320.html', '导演: 艾里克·拉缇戈', 'https://pan.baidu.com/s/1DHrM4GePQ5H1J1V8gtoh4A', 'Love', '2020-06-21 22:12:38');

导入方法一:步骤为点击菜单中查询按钮,选择新建查询,将语句复制进去;方法二:选择导入向导,选择刚才导出的文件。两种都可以导入数据。

编写视图函数

逻辑处理部分,打开movie文件夹下的view.py文件,将下列代码写入:

from django.shortcuts import render
from django.views.generic import View
from django.http import JsonResponse, HttpResponseRedirect
from .models import Movie
# Create your views here.
class MovieView(View):
    def get(self,request):
        #index.html需要自己创建templates/movie/index.html
        return render(request,'movie/index.html')

    def post(self,request):
        data = {}
        movie_name = request.POST.get("movie_name","")
        if not movie_name:
            data["status"] = "error"
            return JsonResponse(data,safe=False)
        print(movie_name)
        mv_list = Movie.objects.filter(movie_name__icontains=movie_name)
        data["movie_list"] =[mv.get_json() for mv in mv_list]
        data["status"] = "success"
        print(data)
        return JsonResponse(data,safe=False)

配置URL

有两个文件需要配置:

my_web/urls.py

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    #添加这行
    url(r'',include('apps.movie.urls'),name="movie"),
]

movie/urls.py

将下列代码复制进去

from django.urls import path, include
from .views import   MovieView
app_name="mv"
urlpatterns = [
    path("",MovieView.as_view(),name="index")
]

HTML

将下列内容保存在templates/movie/index.html中,没有目录和文件的话要自己创建

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="../../static/css/style.css">
    <script src="../../static/js/jquery.min.js"></script>
    <title>Awesome Search Box</title>
</head>
<body>
<div class="main">
    <div class="search-box">

        <input class="search-txt" type="text" name="" placeholder="电影名称">
        {% csrf_token %}
        <a class="search-btn" href="#">
            <i class="fas fa-search"></i>
        </a>
    </div>
    <div id="display-box">

    </div>
</div>
<script type="text/javascript">
    $(function () {
        var csrf_token = $("input[name$='csrfmiddlewaretoken']").val()

        $('.search-btn').click(function () {
            var html = ""
            $("#display-box").html("")
            var movie_name = $('.search-txt').val()

            if (movie_name === ""){
                return false
            }
            $.ajax({
                url:"{% url 'mv:index' %}",
                data: {
                    "movie_name":movie_name,
                     "csrfmiddlewaretoken": csrf_token,
                },
                type: 'post',
                success:function (data,status) {
                    if (data["status"] == "success")
                    for (i = 0; i < data["movie_list"].length; i++){
                            html += "<p>"+data["movie_list"][i]["movie_name"]+"&nbsp"+'<a href="'+data["movie_list"][i]["pan_url"]+'">'+"百度网盘"+"</a>"+":"+data["movie_list"][i]["pan_code"]+"</p>"
                    }

                    $("#display-box").html(html)
                }
            })
        })
    })

</script>
</body>

CSS样式

此内容保存在static/css目录下:

body{
   margin: 0;
    padding: 0;
    /*background: #e84118;*/
    background: beige;
}
.search-box{
    position: absolute;
    top:40%;
    left:50%;
    transform: translate(-50%,-50%);
    background: #2f3640;
    height: 40px;
    border-radius: 40px;
    padding: 10px;
}
.search-box:hover>.search-txt{
    width: 240px;
    padding: 0 6px;
}
.search-box:hover>.search-btn{
   background: white;
}
.search-btn{
    color: #e84118;
    float:right ;
    width: 40px;
    height: 40px;
    border-radius: 50%;
    background: #2f3640;
    display: flex;
    justify-content: center;
    align-items: center;
}
.search-txt {
    border: none;
    background: none;
    outline: none;
    float: left;
    padding: 0;
    color: white;
    font-size: 16px;
    transition: 0.4s;
    line-height: 40px;
    width: 0px;
}

#display-box{
    position: absolute;
    top: 50%;
    left: 38%;
    background: white;
    width: 500px;
    height: auto;
    text-align: center;
}

运行

至此,所有所需要的工作均完成,点击下面的按钮即刻查看效果:
在这里插入图片描述
如果没有报错的话可以在浏览器中打开http://127.0.0.1:8000/链接,搜索一下试试:
在这里插入图片描述
上图展示了片名带有好字的所有电影,在写此文时电影还没有采集完,所以有些还找不到。这里实现了简单的web与查询功能,更多功能需要读者自己去完善,甚至可以部署到服务器上,参考这篇文章基于centos的Django+gunicorn+ngixn应用部署
在这里插入图片描述

完结,撒花

等等,这就撒花了吗?我们貌似只保存了网盘链接和提取码这些信息,要是哪一天此网站把这些链接全部取消了这些不白保存了?别急,下一篇就是介绍如何使用python自动保存资源到自己百度网盘中,马上推出,敬请期待。
更多内容请移步从今天开始种树,关注知识图谱与大数据公众号,获取更多内容,当然不关注也无所谓。
在这里插入图片描述

完整代码

db.py

import pymysql
import traceback
from spider.spider_base import BaseABC


class MySql(BaseABC):
    def __init__(self, **kwargs):
        self.connect(**kwargs)
        db = kwargs.pop("db", "")
        if not db:
            self.db = "movie"
        else:
            self.db = db
        self.create_db(self.db)
        self.create_table()

    def connect(self,**kwargs):
        if kwargs:
            self.conn = pymysql.connect(**kwargs)
            self.cursor = self.conn.cursor()
        else:
            self.conn = pymysql.connect(**self.setting.MYSQL)
            self.cursor = self.conn.cursor()


    def create(self, sql):
        try:
            with self.cursor as cursor:
                cursor.execute(sql)
        finally:
            self.close()

    def create_db(self, db):
        try:
            create_database = """CREATE DATABASE IF NOT EXISTS {} DEFAULT
                                CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci""".format(db)
            self.cursor.execute(create_database)
            print("数据库创建完成!")
        except Exception as e:
            print("创建数据库时出现错误!",e)


    def create_table(self):
        create_table = """
                CREATE TABLE IF NOT EXISTS movie (

                movie_name varchar(30) NOT NULL,     
                release_date varchar(30) NOT NULL,     
                movie_type varchar(30) NOT NULL,     
                movie_country varchar(30) NOT NULL,     
                movie_url varchar(200),
                movie_info varchar(900),
                pan_url varchar(200),
                pan_code varchar(30),
                crawl_time DATETIME NOT NULL,
                PRIMARY KEY (movie_name)
                ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"""

        self.create(create_table)
        print("表创建完成!")

    def insert(self,table,data_list):
        if len(data_list) > 0:
            data_list = [{k: v
                          for k, v in data.items() if v is not None}
                         for data in data_list]

            keys = ", ".join(data_list[0].keys())
            values = ", ".join(["%s"] * len(data_list[0]))
        sql = """INSERT INTO {table}({keys}) VALUES ({values}) ON
                    DUPLICATE KEY UPDATE""".format(table=table,
                                                   keys=keys,
                                                   values=values)
        update = ",".join([
            " {key} = values({key})".format(key=key)
            for key in data_list[0]
        ])
        sql += update
        print(sql)
        self.connect()
        try:
            ret = self.cursor.executemany(sql, [tuple(data.values()) for data in data_list])
            self.conn.commit()
        except Exception as e:
            self.conn.rollback()
            print("Error: ", e)
            traceback.print_exc()
        finally:
            self.close()


    def select(self):
        pass

    def close(self):
        self.cursor.close()
        self.conn.close()

采集文件

from spider.spider_base import SpiderBase
from spider.utils.db import MySql
from lxml import etree
import traceback
import re
import time
import random
import datetime
import requests
requests.packages.urllib3.disable_warnings()

class PiPiXiaSpider(SpiderBase):

    def __init__(self):
        super().__init__()
        self.search_url = "https://yanghuanyu.com/?s={}"
        self.base_url = "https://yanghuanyu.com/"
        self.cookie = "你的"
        self.pipixia_url = "https://yanghuanyu.com/dy/page/{}"
        self.flag_file = "flag.txt"
        self.db = MySql()

    def search_crawler(self):
        search_key = "肖申克的救赎"
        resp = self.download_page(self.url(url=self.search_url, search_key=search_key), cookies=self.cookie,
                                  headers=self.headers(), verify=False)
        self.save_to_file(resp.text, filename="..//..//{}.html".format(search_key))
        return resp

    def crawler(self, url):
        resp = self.download_page(url, cookies=self.cookie, headers=self.headers(),verify=False)

        return resp

    def headers(self):
        headers = {
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.116 Safari/537.36 QBCore/4.0.1301.400 QQBrowser/9.0.2524.400 Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2875.116 Safari/537.36 NetType/WIFI MicroMessenger/7.0.5 WindowsWechat",
            "Referer": "https://yanghuanyu.com/?s=%E8%A1%8C%E5%B0%B8%E8%B5%B0%E8%82%89&show=wx",
        }

        return headers

    def _extract_data(self):
        search_key = "行尸走肉"
        resp = self.crawler()
        # match = self.re_exract(html_text=resp.text,pattern=pattern,filename="..//..//{}.html".format(search_key))

    def extract_data(self, html):
        text = html
        content_list = []
        pattern_index = "https://yanghuanyu.com/\d{1,6}.html"
        _match_index = self.re_exract(html_text=text, pattern=pattern_index)
        match_index = list(set(_match_index))
        for mt in match_index:
            rd = random.randint(9,15)
            ret_dict = self.redirect(mt)
            print("开始睡眠{}秒".format(rd))
            time.sleep(rd)
            if ret_dict:
                content_list.append(ret_dict)
        return content_list

    def redirect(self, url):
        code = ""
        html = self.crawler(url)
        text = html.text
        pattern_pan = "href=\"(https://pan.baidu.com/s/.*?)\""
        pattern_code = "[\u4e00-\u9fa5]{4}\uff1a\w{4}"
        content_dict = {
            "movie_name": "no",
            "pan_url": "no",
            "movie_url": "no",
            "movie_info": "no",
            "pan_code": "Love",
            "release_date": "no",
            "movie_type": "no",
            "movie_country": "no",
            "crawl_time": datetime.datetime.now()
        }
        match_pan = self.re_exract(html_text=text, pattern=pattern_pan)
        match_code = self.re_exract(html_text=text, pattern=pattern_code)
        etree_text = etree.HTML(text)
        _title = etree_text.xpath("//h1[@class='entry-title']/text()")
        title = _title[0] if _title else ""
        _info = etree_text.xpath("//div[@class='entry-content u-clearfix']/p/text()")
        info = _info[0] if _info else ""
        _content_dict = self.split_title(title)
        content_dict.update(_content_dict)
        if match_pan:
            content_dict.update({
                "pan_url":match_pan[0],
                "movie_url":url,
                "movie_info": info,
            })
            print("验证百度地址",content_dict)
            for mt in match_code:
                try:
                    if "提取密码" in mt:
                        code = mt.split(":")[1]

                        break
                except IndexError:
                    code = ""
            content_dict.update({
                "pan_code": code,
            })
            print("{}爬取结束".format(content_dict["movie_name"]))
            return content_dict
        else:
            print("{}爬取结束,没有百度云盘地址".format(content_dict["movie_name"]))
            return content_dict

    def split_title(self, title):

        title_list = title.split("]")
        title_dict = {
            "movie_name": title_list[0].replace("[", ""),
            "release_date": title_list[1].replace("[", ""),
            "movie_type": title_list[2].replace("[", ""),
            "movie_country": title_list[3].replace("[", ""),
        }
        return title_dict

    def schedule(self):
        page = 378
        while True:
            try:
                if page +1 %6 == 0:
                    time.sleep(30)
                print("开始爬取第{}页".format(str(page)))
                url = self.pipixia_url.format(str(page))
                resp = self.crawler(url)
                if resp.status_code != 200:
                    print("爬取完毕")
                    break

                content_list = self.extract_data(resp.text)
                print("第{}页内容:".format(str(page)))
                print(content_list)
                self.save_to_db(content_list)
                print("数据存储成功")
                page += 1
            except Exception as e:
                with open(self.flag_file,'w',encoding='utf-8') as f:
                    f.writelines(str(page))
                print(e)

    def save_to_db(self,db_object):
        self.db.insert("movie",db_object)

if __name__ == '__main__':
    ppx = PiPiXiaSpider()
    ppx.schedule()

spiderbase.py

import requests
from urllib import parse
import random
from spider import setting

#from requests_toolbelt import SSLAdapter
class BaseClass(type):
    def __new__(cls, name, base, attrs):
        attrs["cw_func"] = []
        count = 0
        for k, v in attrs.items():
            if k.startswith("crawl_"):
                attrs["cw_func"].append(k)
                count += 1
        attrs["func_count"] = count
        if name == "BaseABC":
            attrs["setting"] = setting
            for key in dir(setting):
                if not key.startswith("__"):
                    attrs[key] = eval("setting.{}".format(key))

        return type.__new__(cls, name, base, attrs)



class BaseABC(metaclass=BaseClass):
    pass


class SpiderBase(BaseABC):
    def __init__(self):
        self.session = requests.Session()


    def download_page(self,url,**kwargs):
        cookies = kwargs.pop("cookies","")
        method = kwargs.pop("method","get")
        if not isinstance(cookies,dict):
            cookies = self.cookies(cookies)
        if method == "get":
            if cookies:
                resp = self.session.get(url,cookies=cookies,**kwargs)
            else:
                resp = self.session.get(url, **kwargs)
        elif method == "post":
            if cookies:
                resp = self.session.post(url,cookies=cookies,**kwargs)
            else:
                resp = self.session.post(url, **kwargs)
        return resp


    def _download_page(self,**kwargs):
        print(kwargs)

    def crawler(self,url):
        pass

    def extract_data(self,html):
        pass

    @property
    def headers(self):
        headers = {
            "User-Agent": random.choice(self.ua)
        }
        return headers


    def cookies(self,cookies):
        cookie_dict = {i.split("=")[0]: i.split("=")[-1] for i in cookies.split("; ")}
        return cookie_dict

    def url(self,**kargs):
        _url = kargs.pop("url","")
        search_key = kargs.pop("search_key","")
        if search_key:
            search_key = parse.quote(search_key)
            _url = _url.format(search_key)
        return _url

    def schedule(self):
        pass

    def re_exract(self, html_text,pattern,filename=None):
        import re
        if html_text:
            html = html_text
        elif filename:
            with open(filename, 'r', encoding='utf-8') as f:
                html = f.readlines()
            html = "".join(html)
        pat = re.compile(pattern)
        ret = pat.findall(html)
        return ret

    def save_to_file(self, text,filename):
        with open(filename, 'w', encoding='utf-8') as f:
            f.writelines(text)

    def save_to_db(self,db_object):
        pass

setting.py

ua = [
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36 OPR/26.0.1656.60",
    "Opera/8.0 (Windows NT 5.1; U; en)",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/534.57.2 (KHTML, like Gecko) Version/5.1.7 Safari/534.57.2",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36",
    "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36",
    "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko",
    "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.11 TaoBrowser/2.0 Safari/536.11",
    "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; LBBROWSER)"
]

deny=[]

MYSQL={
    "host":"localhost",
    "user":"root",
    "password":"root",
    "port":3306,
    "db":"movie",
    "charset":"utf8"
}

   转载规则


《爬虫学习(3):搭建自己的电影资源网(保姆式教学)》 罗华 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
爬虫学习(4):自动保存百度云盘资源 爬虫学习(4):自动保存百度云盘资源
完整代码移步从今天开始种树 开始在上一文中,我们保存了百度云盘的地址和提取码,但是这种分享链接很容易被屏蔽,最好的做法就是保存资源到自己的网盘,不过采集的链接有上万个,人肉保存并不现实,所以本文尝试了批量保存资源,如您还没看过上文,这里
下一篇 
MongoDB快速学习 MongoDB快速学习
前言这几天准备爬取某网站的一些评论数据,爬取代码都已写完,只剩下存储过程,思前想后还是考虑使用mongdb,毕竟比较适合这种非结构化的数据,以前作过一些了解,不过都基本忘完了,今天正好上官网跟着教程走一遍,记录一下。 创建与删除操作1.创建
2020-06-01
  目录