在爬取网站之前,需要对网站规模和结构了解,常常会借助网站自身的robot.txt以及Sitemap文件,还有比如外部工具:Google搜索和WHOIS。

1. 检查robot.txt

    该文件可以让爬虫了解爬取该网站时存在哪些限制,以及一些网站结构线索,通常如下结构

        例1、禁止所有搜索引擎访问网站的任何部分

User-agent: *    Disallow: / 例2、允许所有的robot访问 User-agent: *    Disallow: (或者也可以建一个空文件 "/robots.txt" file) 例3、禁止某个搜索引擎的访问 User-agent: BadBot    Disallow: /        例4、允许某个搜索引擎的访问
User-agent: Baiduspider    Disallow:    User-agent: *    Disallow: / 例5、无论哪种代理,都应该在两次请求之间给予5秒抓取延迟,对于不允许链接/trap,会封禁ip。    User-agent: *    Crawl-delay:5    Disallow: /trap

2. 检查网站地图

    可以帮助定位网站最新内容。

3. 识别网站所用技术

    运用pip builtwith模块:

pip install builtwith

    builtwith将网站URL作为参数,下载对其分析,得到网站所用技术。

>>> import builtwith>>> builtwith.parse('https://www.csdn.net/'){'web-servers': ['OpenResty', 'Nginx'], 'programming-languages': ['Lua'], 'javascript-frameworks': ['Modernizr', 'jQuery'], 'web-frameworks': ['Twitter Bootstrap']}

4. 获取网站所用者

可以使用WHOTS协议查询域名注册者是谁,Python对该协议有对应的封装库,

pip install python-whois>>> whois.whois('https://www.csdn.net/'){'domain_name': 'CSDN.NET', 'registrar': 'NETWORK SOLUTIONS, LLC.', 'whois_server': 'whois.networksolutions.com', 'referral_url': None, 'updated_date': [datetime.datetime(2017, 3, 10, 0, 52, 46), datetime.datetime(2018, 2, 9, 1, 43, 52)], 'creation_date': datetime.datetime(1999, 3, 11, 5, 0), 'expiration_date': datetime.datetime(2020, 3, 11, 4, 0), 'name_servers': ['NS3.DNSV3.COM', 'NS4.DNSV3.COM'], 'status': 'clientTransferProhibited https://icann.org/epp#clientTransferProhibited', 'emails': ['abuse@web.com', 'Jiangtao@CSDN.NET'], 'dnssec': 'unsigned', 'name': 'Beijing Chuangxin Lezhi Co.ltd', 'org': 'Beijing Chuangxin Lezhi Co.ltd', 'address': 'B3-2-1 ZHaowei Industry Park', 'city': '等待的雨', 'state': 'Beijing', 'zipcode': '100016', 'country': 'CN'}


查看防火墙某个端口是否开放
firewall-cmd --query-port=80/tcp

开放防火墙端口80
firewall-cmd --zone=public --add-port=80/tcp --permanent

关闭80端口

firewall-cmd --zone=public --remove-port=80/tcp --permanent  

配置立即生效firewall-cmd --reload 

查看防火墙状态
systemctl status firewalld

关闭防火墙
systemctl stop firewalld

打开防火墙
systemctl start firewalld

开放一段端口
firewall-cmd --zone=public --add-port=8121-8124/tcp --permanent

查看开放的端口列表
firewall-cmd --zone=public --list-ports

firewall-cmd --zone=public --add-port=80/tcp --permanent


1、首先查找端口,会显示出所有的端口,比如说要找到端口为“8080”的PID

netstat -ano


2、还可以精确查找

netstat -aon|findstr "8080"


3、关闭对应的端口

taskkill /t /f /pid "9608"

4、使用任务管理器关闭

查看详细信息,根据查找到的pid找到对应的程序进行,结束任务


OK


在JavaScript中,有两种方式可以定义一个函数,一个是函数声明,一个是函数表达式。

一 函数声明

函数声明的语法如下:

function functionName(arg0, arg1, arg2) { //函数体}

函数声明的最重要的一个特征是函数声明提升,意思是在执行代码之前会先读取函数声明,所以函数声明可以放在调用函数语句之后。

sayHello();function sayHello(){    console.log("Hello");}


上述代码可以正常执行,不会报错。

二 函数表达式

函数表达式的语法形式如下:

var functionName = function(arg0, arg1, arg2) {    //函数体}

这种形式看起来像常规的变量赋值,先创建一个匿名函数,然后赋值给变量functionName。我们知道在JS中如果要想使用一个变量,必须先给这个变量赋值,所以函数表达式也不例外,在调用之前,必须先给它赋值。否则会报错。

sayHi(); //在这里调用会报错var sayHi = function(){console.log("Hi");}sayHi(); //Hi


函数声明和函数表达式都是用来定义一个函数的,区别就是函数声明存在函数声明,可以在声明前调用。而函数表达式则必须在赋值语句之后再调用。


1. 函数声明提升

func()function func () {}

上例不会报错,正是因为 ‘函数声明提升’,即将函数声明提升(整体)到作用域顶部(注意是函数声明,不包括函数表达式),实际提升后结果同下:

// 函数声明提升function func () {}func()

2. 变量声明提升(只有var声明的变量才有变量提升,let、const无;变量赋值无提升)

1. console.log(num) var num = 102. console.log(func) var func = function () { }

上两例均会打印出 'undefined',变量声明提升会将变量声明提升到作用域顶部,但只会提升声明部分,不会提升赋值部分,实际提升后结果如下:

1. var num console.log(num) num = 102. var func console.log(func) func = function () { }

3. 进阶举例(两者优先顺序、局部与全局变量):

var func = 10console.log(func && typeof(func))function func () {}-----console.log(func && typeof(func))function func () {}var func = 10

上两例将分别输出 ‘number’、'function',原因是 函数声明提升优先于变量提升,函数声明会被变量赋值影响,但不会被变量声明影响,实际提升后结果如下:

function func () {}var func = 10console.log(func && typeof(func))-----function func () {}var funcconsole.log(func && typeof(func))func = 10

    ②

num = 10function func () { window.num = 5 console.log(num) var num console.log(window.num)}func()

上例将会分别打印出 'undefined'、'5',第一处为局部变量,第二处为全局变量,实际提升后结果如下:

function func () { var num window.num = 5 console.log(num) console.log(window.num)}var numnum = 10func()