当前位置:   article > 正文

Python爬虫之基础篇_nvdb-cnvdb-2023812023

nvdb-cnvdb-2023812023

关于Python的基本语法就不多说了,这里直接从各个小的程序开始,本文会不断地进行更新,一步步来走进Python~

同时也希望各位可以给点好的建议哈~


一、在Kali Linux中安装sublime text 3:

先下载sublime text 3,然后到下载的目录中执行以下命令即可:

dpkg -i ./sublime-text_build-3126_amd64.deb


二、Socket模块:

在导入socket时有两种方式,一个是import socket,然后在调用socket()方法的时候需要在前面加上socket.,如果是from socket import socket则不需要添加,因为已经导入了socket模块socket方法;当然另一个方式可以更简单,即from socket import *,导入socket模块所有的方法。

Python支持的套接字:AF_UNIX,AF_NETLINK,AF-INET(常用的基于网络的套接字)。

socket.socket()函数用于创建套接字。

socket.bind()函数用于绑定地址(主机,端口)到套接字。

socket.listen()函数用于开始TCP监听。

socket.accept()函数用于等待接收客户端的连接。

socket.connect()函数用于主动进行TCP连接。

socket.recv()函数用于接收TCP数据。

socket.send()函数用于发送TCP数据。

socket.sendall()函数用于完整发送TCP数据。

socket.close()函数用于关闭套接字。

1、简单模拟C/S模型进行通信:

分为两部分,一个为server端的程序,另一个为client端的程序。

socketserver.py:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. from socket import *
  4. from time import ctime
  5. def main():
  6. s = socket(AF_INET,SOCK_STREAM)
  7. s.bind(('',1234))
  8. s.listen(5)
  9. while True:
  10. print 'Waiting for connection...'
  11. c,addr = s.accept()
  12. print '...connected from:',addr
  13. while True:
  14. data = c.recv(1024)
  15. if not data:
  16. break
  17. print 'Client '+data
  18. rdata = raw_input('Some words to send : ')
  19. if not rdata:
  20. break
  21. time = ctime().split(' ')[4]
  22. t = time.split(':')[0]+':'+time.split(':')[1]+':'+time.split(':')[2]
  23. text = t + ' : ' +rdata
  24. c.send(text)
  25. c.close()
  26. s.close()
  27. if __name__ == '__main__':
  28. main()

简单地说一下,bind()函数的参数是一个地址,是(IP,port)这种形式的,其中IP为空即指定为本机,后面的端口的类型记得是int型才可以,若是通过输入的方式获得则需要通过int()函数来进行类型的转换。其中调用了time库的ctime函数来获取当前时间,对其再调用split()函数来进行切割获得时:分:秒这种形式的显示。

socketclient.py:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. from socket import *
  4. import sys
  5. from time import ctime
  6. def main():
  7. try:
  8. url = sys.argv[1]
  9. port = int(sys.argv[2])
  10. addr = (url,port)
  11. c = socket(AF_INET,SOCK_STREAM)
  12. c.connect(addr)
  13. while True:
  14. text = raw_input('Some words to send : ')
  15. if not text :
  16. break
  17. time = ctime().split(' ')[4]
  18. t = time.split(':')[0]+':'+time.split(':')[1]+':'+time.split(':')[2]
  19. txt = t+' : '+text
  20. c.send(txt)
  21. data = c.recv(1024)
  22. if not data:
  23. break
  24. print 'Server '+data
  25. c.close()
  26. except:
  27. print 'Usage : ./socketclient.py [URL] [PORT] '
  28. if __name__ == '__main__':
  29. main()

这里的参数port的输入需要对其调用int()函数来转换类型。

运行结果:




2、接着可以进一步将程序改为实现简单的远程控制:

socketserver.py:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. from socket import *
  4. from time import ctime
  5. from subprocess import Popen,PIPE
  6. def main():
  7. s = socket(AF_INET,SOCK_STREAM)
  8. s.bind(('',1234))
  9. s.listen(5)
  10. while True:
  11. print 'Waiting for connection...'
  12. c,addr = s.accept()
  13. print '...connected from:',addr
  14. while True:
  15. data = c.recv(1024)
  16. if not data:
  17. break
  18. # print 'Client '+data
  19. # rdata = raw_input('Some words to send : ')
  20. # if not rdata:
  21. # break
  22. time = ctime().split(' ')[4]
  23. t = time.split(':')[0]+':'+time.split(':')[1]+':'+time.split(':')[2]
  24. cmd = Popen(['/bin/bash','-c',data],stdin=PIPE,stdout=PIPE)
  25. rdata = cmd.stdout.read()
  26. text = '[ ' + t + ' ] : ' +rdata
  27. c.send(text)
  28. c.close()
  29. s.close()
  30. if __name__ == '__main__':
  31. main()

这里主要用到了一个subprocess库的Popen和PIPE方法,其中subprocess是用来启动一个新的进程并且与之通信,其最简单的用法就是调用shell命令,它定义了一个类: Popen,用来创建进程并与进程进行复杂的交互。调用Popen函数的先是到/bin/bash路径下即bash shell中通过-c参数来说明是传递一条命令进去执行,其中的参数stdin、stdout都设置为管道PIPE,然后再通过调用stdout的read()函数来读取命令执行后的数据,从而整个地实现从后台来执行进程。

socketclient.py:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. from socket import *
  4. import sys
  5. # from time import ctime
  6. def main():
  7. try:
  8. url = sys.argv[1]
  9. port = int(sys.argv[2])
  10. addr = (url,port)
  11. c = socket(AF_INET,SOCK_STREAM)
  12. c.connect(addr)
  13. while True:
  14. text = raw_input('Please enter a command : ')
  15. if not text :
  16. break
  17. # time = ctime().split(' ')[4]
  18. # t = time.split(':')[0]+':'+time.split(':')[1]+':'+time.split(':')[2]
  19. # txt = t+' : '+text
  20. c.send(text)
  21. data = c.recv(1024)
  22. if not data:
  23. break
  24. # print 'Server '+data
  25. print data
  26. c.close()
  27. except:
  28. print 'Usage : ./socketclient.py [URL] [PORT] '
  29. if __name__ == '__main__':
  30. main()

运行结果:



三、Requests模块:

该模块没有默认安装,需要输入:pip install requests

发送网络请求:

>>>r = requests.get('http://www.abc.com')

>>>r = requests.post('http://www.abc.com')

>>>r = requests.put('http://www.abc.com')

>>>r = requests.delete('http://www.abc.com')

>>>r = requests.head('http://www.abc.com')

>>>r = requests.options('http://www.abc.com')

为URL传递参数:

>>>payload = {'key1':'value1','key2':'value2'}

>>>r = requests.get('http://www.abc.com',params=payload)

响应内容:

>>>r = requests.get('http://www.abc.com')

>>>r.text

>>>r.encoding 'utf-8'

二进制响应内容:

>>>r = requests.get('http://www.abc.com')

>>>r.content

定制请求头:

>>>url = 'http://www.abc.com'

>>>headers = {'User-Agent':'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'}

>>>r = requests.get(url,headers=headers)

复杂的POST请求:

>>>payload = {'key1':'value1','key2':'value2'}

>>>r = requests.post('http://www.abc.com',data=payload)

响应状态码:

>>>r = requests.get('http://www.abc.com')

>>>r.status_code

响应头:

>>>r = requests.get('http://www.abc.com')

>>>r.headers

Cookies:

>>>r.cookies

>>>r.cookies['cookie name']

超时:

>>>requests.get(‘http://www.sina.com’,timeout=0.001)

错误和异常:

遇到网络问题(如DNS查询失败、拒绝连接等)时,Request会抛出一个ConnectionError异常;

遇到罕见的无效HTTP响应时,Requests则会抛出一个HTTPError异常;

若请求超时,则抛出一个timeout异常。

1、简单模拟HTTP的GET请求:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import requests
  4. import sys
  5. from time import time
  6. def saveFile(name,data):
  7. f = open(name,'w')
  8. f.write(data)
  9. f.close()
  10. def resetsys():
  11. reload(sys)
  12. sys.setdefaultencoding('utf-8')
  13. def main():
  14. try:
  15. url = sys.argv[1]
  16. resetsys()
  17. r = requests.get(url)
  18. text = r.text
  19. filename = str(time())
  20. saveFile(filename,text)
  21. print 'Save successfully. '
  22. except:
  23. print 'Usage : ./get.py [URL]'
  24. if __name__ == '__main__':
  25. main()

这里将GET请求的内容保存到以时间命名的文件中,因为时间值为int型需要通过str()函数将其转换为字符串的形式,其中会出现错误需要定义一个resetsys()函数来reload重新加载sys库,再将其默认的编码形式改为utf-8即可。

运行结果:



2、简单地通过GET请求获取服务器的信息:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import requests
  4. import sys
  5. def main():
  6. try:
  7. url = sys.argv[1]
  8. r = requests.get(url)
  9. print 'Server : '+r.headers.get('Server')
  10. print 'X-Powered-By : '+str(r.headers.get('X-Powered-By'))
  11. except:
  12. print 'Usage : ./getBSCInfo.py [URL]'
  13. if __name__ == '__main__':
  14. main()

这里通过Requests的get方法的headers的get()函数来实现获取相关的信息,其中获取Lang信息是需要添加str()函数进行转换类型,因为当查询的网页没有对应的值时该返回值为空会报错,而调用该函数后则会输出None而不是出错。

运行结果:



四、OS模块:

os.name():判断现在正在实用的平台,Windows 返回 ‘nt'; Linux 返回’posix'

os.getcwd():得到当前工作的目录

os.listdir():指定所有目录下所有的文件和目录名

os.remove():删除指定文件

os.rmdir():删除指定目录

os.mkdir():创建目录

os.path.isfile():判断指定对象是否为文件。是返回True,否则False

os.path.isdir():判断指定对象是否为目录。是True,否则False

os.path.exists():检验指定的对象是否存在。是True,否则False

os.path.split():返回路径的目录和文件名

os.getcwd():获得当前工作的目录(get current work dir)

os.system():执行shell命令

os.chdir():改变目录到指定目录

os.path.getsize():获得文件的大小,如果为目录,返回0

os.path.abspath():获得绝对路径

os.path.join(path, name):连接目录和文件名

os.path.basename(path):返回文件名

os.path.dirname(path):返回文件路径

到指定路径执行指定脚本文件:

chdir(getcwd() + ‘\\test’)

system(‘./test.py’)

1、通过ssh连接到指定目录指定指定脚本:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. from os import *
  4. import sys
  5. def main():
  6. try:
  7. path = sys.argv[1]
  8. filename = sys.argv[2]
  9. chdir(path)
  10. system('./'+filename)
  11. except:
  12. print 'Usage : ./sshOS.py [File Path] [Filename] '
  13. if __name__ == '__main__':
  14. main()

在system()函数中运行Python文件时需要在前面加上“./”来表示运行即可。

先在BT5上开启ssh服务:service ssh start

然后在Kali通过命令ssh连接到BT5上,然后直接运行该脚本并指定参数说明到哪个目录下运行哪个文件,如下:



五、多线程:

线程与进程:进程是程序的一次执行;所有的线程运行在同一个进程中,共享相同的运行环境。

Python多线程的模块有三个,即thread、threading和Queue。

1、thread模块简单实现局域网主机发现ping扫描:

thread模块通过调用start_new_thread(function,args kwargs=None),产生一个新的线程,但缺点是控制不了线程数。

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import thread
  4. from subprocess import Popen,PIPE
  5. import time
  6. def hostscan(ip):
  7. cmd = Popen(['/bin/bash','-c','ping -c 3 '+ip],stdin=PIPE,stdout=PIPE)
  8. txt = cmd.stdout.read()
  9. if 'ttl' in txt:
  10. print ip+' is UP. '
  11. def main():
  12. for i in xrange(1,255):
  13. ip = '10.10.10.'+str(i)
  14. thread.start_new_thread(hostscan,(ip,))
  15. time.sleep(0.1)
  16. if __name__ == '__main__':
  17. main()

主要是通过subprocess模块来运行ping命令实现功能的,其中通过判断返回得到数据中是否有ttl即time-to-live值来判断主机是否存活,当然可以将命令换成任意的扫描命令都可以,甚至可以各种命令组合来提高扫描的准确度。需要注意的点就是在调用多线程时需要一个time模块sleep()函数来进行延迟。

运行结果:



2、threading模块简单实现局域网主机发现arping扫描:

该模块有两种方式来创建线程:一种是通过继承Thread类,重写其run方法;另一种是创建一个threading.Thread对象,在其初始化函数中将可调用对象作为参数传入。

下面应用threading.Thread对象,其有两个参数,一个为target指定执行的函数,另一个为args指定输入的参数,主要参数输入外部要添加括号。在创建完对象之后还需要调用start()函数来开始线程运行。

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import threading
  4. from subprocess import Popen,PIPE
  5. import time
  6. def hostscan(ip):
  7. cmd = Popen(['/bin/bash','-c','arping -c 3 '+ip],stdin=PIPE,stdout=PIPE)
  8. txt = cmd.stdout.read()
  9. if 'bytes from' in txt:
  10. print ip+' is UP. '
  11. def main():
  12. for i in xrange(1,255):
  13. ip = '10.10.10.'+str(i)
  14. t = threading.Thread(target=hostscan,args=(ip,))
  15. t.start()
  16. time.sleep(0.1)
  17. if __name__ == '__main__':
  18. main()

这里将ping命令换成arping命令,即从三层的主机扫描换为二层的主机扫描,其中因为回复的内容不一样,“ttl”需要换为“bytes from”,从结果比较可以看到,不同层次的主机扫描的发现结果是不太一样的。

运行结果:



3、Queue模块实现nmap主机发现扫描:

Queue模块主要可以解决生产者-消费者问题,简单地说可以实现队列,即有序地进行线程。

其中Queue模块的一些函数:qsize()、empty()、full()、put()、get()

下面使用Queue模块结合threading模块来实现nmap主机发现扫描,其中需要写一个nmapscan类,对里面的初始化方法__init__和run方法进行重写;在主函数中一个线程数组、线程数和Queue对象,并将nmapscan类调用每个Queue对象的值添加到线程数组中,再通过start()和join()函数来开始并加入队列线程,这样程序就能有序地执行。

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import threading
  4. from subprocess import Popen,PIPE
  5. import Queue
  6. class nmapscan(threading.Thread):
  7. def __init__(self,queue):
  8. threading.Thread.__init__(self)
  9. self._queue = queue
  10. def run(self):
  11. while not self._queue.empty():
  12. ip = self._queue.get()
  13. cmd = Popen(['/bin/bash','-c','nmap -sn '+ip],stdin=PIPE,stdout=PIPE)
  14. txt = cmd.stdout.read()
  15. if 'Host is up' in txt:
  16. print txt
  17. def main():
  18. threads = []
  19. threads_count = 10
  20. queue = Queue.Queue()
  21. for i in xrange(1,255):
  22. ip = '10.10.10.'+str(i)
  23. queue.put(ip)
  24. for i in range(threads_count):
  25. threads.append(nmapscan(queue))
  26. for i in threads:
  27. i.start()
  28. for i in threads:
  29. i.join()
  30. if __name__ == '__main__':
  31. main()

这里直接调用nmap命令-sn参数,即只进行主机发现而不进行端口扫描,从结果可见nmap扫描结果比上面两个命令都准确一些。

运行结果:



六、MySQLdb模块:

该模块没有默认安装,先下载安装MySQLdb模块:https://sourceforge.net/projects/mysql-python/?source=typ_redirect

tar –xfz MySQL−python−1.2.1.tar.gz

cd MySQL-python-1.2.1

apt-get install python-setuptools

apt-get install python-dev

apt-get install libmysqlclient-dev或apt-get install libmariadbclient-dev

python setup.py install


数据库连接对象connection,创建方法:MySQLdb.Connect(参数),其中参数有:

host:MySQL服务器地址,默认是本地主机

use:用户名,默认是当前用户

passwd:密码,默认为空

db:数据库名

port:MySQL服务器端口,默认是3306

charset:连接编码


Connection对象支持的方法:

cursor():使用该连接创建并返回游标

commit():提交当前事务

rollback():回滚当前事务

close():关闭数据库连接


Cursor对象支持的方法:execute(op[,args])、fetchone()、fetchmanv(size)、fetchall()、rowcount、close()


如果忘记了MySQL的用户密码,可以重设:

mysql

use mysql

update user set password=PASSWORD('admin') where User='root';

flush privileges;

service mysql start

1、简单实现连接本地MySQL数据库并执行SQL语句:

  1. #!/usr/bin/python
  2. #coding=utf-8
  3. import MySQLdb
  4. from sys import argv
  5. def main():
  6. try:
  7. conn = MySQLdb.connect(
  8. host = argv[1],
  9. port = 3306,
  10. user = argv[2],
  11. passwd = argv[3],
  12. )
  13. cus = conn.cursor()
  14. sql = 'select concat_ws(char(32,58,32),user(),version(),@@global.version_compile_os)'
  15. cus.execute(sql)
  16. print cus.fetchone()
  17. cus.close()
  18. conn.close()
  19. except:
  20. print '
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/582452
推荐阅读
相关标签
  

闽ICP备14008679号