1、网络编程的目的是网络编程的目的是直接或间接直接或间接地通过地通过网络协网络协议议与其他计算机进行与其他计算机进行通信通信。本章将介绍。本章将介绍Python网网络通信基础及其网络应用。主要介绍络通信基础及其网络应用。主要介绍Python网络网络应用相关的主要模块、类及其使用方法。应用相关的主要模块、类及其使用方法。Python支持支持TCP和和UDP协议族协议族。TCP用于网络的用于网络的可靠的流可靠的流式输入式输入/输出输出。UDP支持更支持更简单的、快速的、点对简单的、快速的、点对点的数据报模式。点的数据报模式。学习重点或难点:学习重点或难点:网络通信基础网络通信基础 Socket编程编程
2、 电子邮件收发电子邮件收发 网络爬虫网络爬虫学习本章后将能了解到学习本章后将能了解到QQ、收发邮件等、收发邮件等Internet应用软件的实现原理,并有能力自己来应用软件的实现原理,并有能力自己来尝试编写有类似功能的网络应用软件。尝试编写有类似功能的网络应用软件。12.1 网络基础知识网络基础知识12.2 Socket编程编程12.3 电子邮件电子邮件12.4 urllib爬虫模块爬虫模块计算机网络是指通过各种通信设备计算机网络是指通过各种通信设备连接连接起来起来的、支持的、支持特定网络通信协议特定网络通信协议的、许许多多的计算的、许许多多的计算机或计算机系统的机或计算机系统的集合集合。IP地
3、址地址是计算机网络中任意一台计算机是计算机网络中任意一台计算机地址的地址的唯一标识唯一标识。域名地址域名地址是计算机网络中一台主机的是计算机网络中一台主机的标识名标识名,也可以看做是,也可以看做是IP地址的助记名。地址的助记名。端口端口是为了在一台主机上是为了在一台主机上标识多个进标识多个进程程而采取的一种而采取的一种手段手段。知道了网络中某一台主机的IP地址,就可以定位这台计算机。通过这种地址标识,网络中的计算机可以互相定位和通信。目前,IP地址有两种格式,即IPV4格式和IPV6格式。1)IPV4是由4个字节数组成,中间以小数点分隔。譬如:192.168.1.1。2)IPV6是由16个字节
4、组成,中间以冒号分隔。譬如:AD80:0000:0000:0000:ABAA:0000:00C2:0002 是一个合法的IPv6地址。在Internet上,一个域名地址可以有多个IP地址与之相对应,一个IP地址也可以对应多个域名。通过主机名到IP地址的解析,可以由主机名得到对应的IP地址。在访问网上资源时,一般只需记住服务器的主机名就可以了。因为网络中的域名解析服务器可以根据主机名查出对应的IP地址。有了服务器的IP地址,就可以访问这个网站了。一台主机上允许有多个进程,这些进程都可以和网络上的其他计算机进行通信。更准确地说,网络通信的主体不是主机,而是主机中运行的进程。主机名(或IP地址)和端
5、口的组合能唯一确定网络通信的主体进程。端口(port)是网络通信时同一主机上的不同进程的标识。网络编程是指编写运行在多个设备(计算机)的程序,网络编程是指编写运行在多个设备(计算机)的程序,这些设备都通过网络连接起来。这些设备都通过网络连接起来。网络连接中要使用到的网络协议:网络连接中要使用到的网络协议:(1)TCP(Transfer Control Protocol的简称)的简称)传输控传输控制协议制协议,是一种,是一种面向连接的、可以提供可靠传输面向连接的、可以提供可靠传输的协议。的协议。使用使用TCP协议传输数据,接收端得到的是一个和发送端发协议传输数据,接收端得到的是一个和发送端发出的
6、完全一样的数据流。通常用于互联网协议,被称出的完全一样的数据流。通常用于互联网协议,被称TCP/IP。(2)UDP(User Datagram Protocol的简称)的简称)用户数用户数据报协议据报协议,是一种,是一种无连接无连接的协议,它传输的是一种的协议,它传输的是一种独立的独立的数据报数据报(Datagram)。每个数据报都是一个独立的信息,)。每个数据报都是一个独立的信息,包括完整的源地址或目的地址。包括完整的源地址或目的地址。TCP协议协议 UDP协议协议必须建立发必须建立发送方和接收送方和接收方连接方连接无大小限制无大小限制有大小限制有大小限制不可靠的协不可靠的协议议无须建立发无
7、须建立发送方和接收送方和接收方连接方连接可靠的协议可靠的协议网络程序设计技术网络程序设计技术(1)URL编程技术:编程技术:URL表示了表示了Internet上某个资源的上某个资源的地址。地址。通过通过URL标识,可以直接使用各种通信协议获取远端标识,可以直接使用各种通信协议获取远端计算机上的资源信息,方便快捷地开发计算机上的资源信息,方便快捷地开发Internet应用程序应用程序。(2)TCP编程技术:编程技术:TCP是可靠的连接通信技术是可靠的连接通信技术,主要,主要使用套接字(使用套接字(Socket)机制。)机制。TCP通信是使用通信是使用TCP/IP协议、协议、建立在稳定连接基础上的
8、、以流传输数据的通信方式。建立在稳定连接基础上的、以流传输数据的通信方式。(3)UDP编程技术:编程技术:UDP是无连接的快速通信技术,是无连接的快速通信技术,数数据报通信不需要建立连接,通信时所传输的数据报能否到达据报通信不需要建立连接,通信时所传输的数据报能否到达目的地、到达的时间、到达的次序都不能准确知道。目的地、到达的时间、到达的次序都不能准确知道。Socket(套接字)(套接字)是操作系统内核中的一个是操作系统内核中的一个数据数据结构结构,它是网络中的节点进行相互通信的门户,它,它是网络中的节点进行相互通信的门户,它是网络进程的是网络进程的ID。网络通信,归根到底还是进程间。网络通信
9、,归根到底还是进程间的通信(不同计算机上的进程间通信,的通信(不同计算机上的进程间通信,IP协议进行的协议进行的主要是端到端通信)。主要是端到端通信)。Socket编程即是编程即是网络中节点间网络中节点间基于某种协议的多进程间的交互操作编程基于某种协议的多进程间的交互操作编程。1.Socket套接字的概念套接字的概念在网络中,每一个节点(计算机或路由)都有在网络中,每一个节点(计算机或路由)都有一个网络地址,也就是一个网络地址,也就是IP地址。两个进程通信时,地址。两个进程通信时,首先要确定各自所在的网络节点的网络地址。网络首先要确定各自所在的网络节点的网络地址。网络地址只能确定进程所在的计算
10、机,不能确定是和网地址只能确定进程所在的计算机,不能确定是和网络中的哪一个进程进行通信,因此套接字中还需要络中的哪一个进程进行通信,因此套接字中还需要包括其他的信息,也就是包括其他的信息,也就是端口号(端口号(PORT)。在一台计算机中,一个端口号一次只能分配给一个进程,也就是说,端口号和进程之间是一一对应关系。所以,使用端口号和网络地址的组合可以唯一的确定整个网络中的一个网络进程。端口号的范围从端口号的范围从065535,一类是由互联网指派名,一类是由互联网指派名字和号码公司字和号码公司ICANN负责分配给一些常用的应用程序固负责分配给一些常用的应用程序固定使用的定使用的“周知的端口周知的端
11、口”,其值一般为,其值一般为01023,用户,用户自定义端口号一般大于等于自定义端口号一般大于等于1024。每一个每一个Socket都用一个半相关描述都用一个半相关描述协议、本地地址协议、本地地址、本地端口、本地端口来表示;一个完整的套接字则用一个相关描来表示;一个完整的套接字则用一个相关描述述协议、本地地址、本地端口、远程地址、远程端口协议、本地地址、本地端口、远程地址、远程端口来表示。来表示。2、Socket类型类型Socket类型都定义在类型都定义在Socket模块中,调用方式模块中,调用方式socket.SOCK_XXXX。(1)流式流式Socket(SOCK_STREAM)用于用于T
12、CP通信通信(2)数据报数据报Socket(SOCK_DGRAM)用于用于UDP通信通信(3)原始套接字(原始套接字(SOCK_RAW)用于新的网络协用于新的网络协议(议(ICMP、IGMP、IPv4报文等)报文等)import socket,os,json#服务端程序服务端程序#客户端请求服务端的文件,服务端确认后将文件发送给客户端客户端请求服务端的文件,服务端确认后将文件发送给客户端sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)sock.bind(127.0.0.1,9999)sock.listen(1)def pack_msg_
13、header(header,header_size):#制作文件头部制作文件头部 bytes_header=bytes(json.dumps(header),encoding=utf-8)if len(bytes_header):).strip()if not cmd:continue sock.send(cmd.encode(utf-8)msg_header=sock.recv(300)#规定头文件的长度为规定头文件的长度为300 print(received:,msg_header.decode(gbk)header=json.loads(msg_header.decode(utf-8)i
14、f header.get(error):print(header.get(error)【例例12-1】基于基于TCP的套接字,实现的套接字,实现C/S通信。通信。else:filename=headerfilename;file_size=headersize f=open(filename,wb)received_size=0 while received_size file_size:if file_size-received_size:).strip()if not msg:continue udp_client.sendto(msg.encode(utf-8),ip_port)back
15、_msg,addr=udp_client.recvfrom(1024)print(back_msg.decode(utf-8),addr)【例【例12-2】基于UDP的套接字,实现C/S通信。UDP不需要建立连接,可以实现与不需要建立连接,可以实现与多个客户端多个客户端同时建立连接同时建立连接。相比于。相比于TCP,UDP是不可靠传输,是不可靠传输,但是速度快。但是速度快。在代码方面的区别,在代码方面的区别,TCP的的recv就相当于就相当于UDP的的recvfrom,TCP的的send就相当于就相当于UDP的的sendto,另,另外因为外因为 UDP不建立连接,所以发送消息的时候需要不建立连
16、接,所以发送消息的时候需要指定指定ip和端口号。和端口号。1、SMTP发送邮件发送邮件使用使用SMTP发送邮件发送邮件SMTP(Simple Mail Transfer Protocol)即简单邮件传)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规输协议,它是一组用于由源地址到目的地址传送邮件的规则,由它来控制信件的中转方式。则,由它来控制信件的中转方式。Python的的smtplib提供了一种很方便的途径发送电子邮提供了一种很方便的途径发送电子邮件。它对件。它对smtp协议进行了简单的封装。协议进行了简单的封装。Python创建创建 SMTP 对象语法如下:对象语法如下:im
17、port smtplibsmtpObj=smtplib.SMTP(host,port,local_hostname)参数说明:参数说明:1)host:SMTP 服务器主机服务器主机。你可以指定主机的。你可以指定主机的ip地址或者域名如地址或者域名如:,这个是可选参数。,这个是可选参数。2)port:如果提供了:如果提供了host参数,需要指定参数,需要指定SMTP服务使用的端口号,一般端口号为服务使用的端口号,一般端口号为25。3)local_hostname:如果:如果SMTP在本机上,在本机上,只需要指定服务器地址为只需要指定服务器地址为 localhost即可。即可。Python SMT
18、P对象使用对象使用sendmail方法发送邮件,方法发送邮件,语法如下:语法如下:SMTP.sendmail(from_addr,to_addrs,msg,mail_options,rcpt_options这里要注意第三个参数这里要注意第三个参数msg是字符串,表示邮件。是字符串,表示邮件。邮件一般由标题、发信人、收件人、邮件内容、附件等邮件一般由标题、发信人、收件人、邮件内容、附件等构成,要注意构成,要注意msg的格式,这个格式就是的格式,这个格式就是smtp协议中定协议中定义的格式。义的格式。参数说明:参数说明:1)from_addr:邮:邮件发送者地址;件发送者地址;2)to_addrs
19、:字符:字符串列表,邮件发送地址;串列表,邮件发送地址;3)msg:发送消息。发送消息。import smtplibfrom email.mime.text import MIMETextfrom email.header import Header sender=;receiver=#替换自己的邮箱替换自己的邮箱subject=python email test;smtpserver=username=;password=*#自己邮箱的秘密自己邮箱的秘密msg=MIMEText(aaaaaaaaaaadbbbbbbbbbbb6666666,text,utf-8)msgSubject=Head
20、er(subject,utf-8);msgTo=receiversmtp=smtplib.SMTP(smtpserver,25)smtp.set_debuglevel(1);smtp.helo(smtpserver);smtp.ehlo(smtpserver)smtp.login(username,password)smtp.sendmail(sender,receiver,msg.as_string()smtp.quit()【例例12-3】使用使用Python发送邮件简单示例。发送邮件简单示例。import smtplibfrom email.mime.text import MIMETex
21、tmailto_list=YYYYYY.com#YYY、XXX处应改写实际邮件相关信息处应改写实际邮件相关信息mail_host=smtp.XXX.com#设置服务器设置服务器mail_user=XXX#用户名用户名mail_pass=XXX#口令口令 mail_postfix=XXX.com#发件箱的后缀发件箱的后缀def send_mail(to_list,sub,content):#to_list:收件人;:收件人;sub:主题;:主题;content:邮件内容:邮件内容 me=hello+#这里的这里的hello可以任意设置可以任意设置 msg=MIMEText(content,_su
22、btype=html,_charset=gb2312)#设置为设置为html格式邮件格式邮件 【例【例12-412-4】使用使用PythonPython发送发送HTMLHTML格式邮件的示例。格式邮件的示例。使用使用Python发送发送HTML格式的邮件格式的邮件msgmsgSubject=sub#Subject=sub#设置主题设置主题 msgmsgFrom=meFrom=me msgmsgTo=;.join(To=;.join(to_listto_list)try:try:s=s=smtplib.SMTPsmtplib.SMTP()()s.connects.connect(mail_hos
23、tmail_host)#)#连接连接smtpsmtp服务器服务器 s.logins.login(mail_user,mail_passmail_user,mail_pass)#)#登陆服务器登陆服务器 s.sendmails.sendmail(me,(me,to_listto_list,msg.as_stringmsg.as_string()#()#发送邮件发送邮件 s.closes.close();return True();return True except Exception as e:except Exception as e:print(print(strstr(e);return
24、 False(e);return Falseif _name_=_main_:if _name_=_main_:if if send_mailsend_mail(mailto_list,hellomailto_list,hello,a,=http:/ smtplibimport smtplibmessage=From:From Person message=From:From Person To:To Person To:To Person MIME-Version:1.0MIME-Version:1.0Content-type:text/htmlContent-type:text/htmlS
25、ubject:SMTP HTML e-mail testSubject:SMTP HTML e-mail testThis is an e-mail message to be sent in HTML formatThis is an e-mail message to be sent in HTML formatThis is HTML message.This is headline.This is HTML message.This is headline.try:try:smtpObj=smtplib.SMTP(localhost)smtpObj=smtplib.SMTP(local
26、host)smtpObj.sendmail(sender,receivers,message)smtpObj.sendmail(sender,receivers,message)print(Successfully sent email)print(Successfully sent email)except SMTPException:print(Error:unable to send email)except SMTPException:print(Error:unable to send email)【例例12-4】使用使用Python发送发送HTML格式邮件的示例。格式邮件的示例。【
27、例例12-5】使用使用Python发送带附件的邮件。发送带附件的邮件。Python发送带附件的邮件。发送带附件的邮件。【例【例12-412-4】使用使用PythonPython发送发送HTMLHTML格式邮件的示例。格式邮件的示例。【例【例12-412-4】使用使用PythonPython发送发送HTMLHTML格式邮件的示例。格式邮件的示例。2、POP3POP3收取邮件收取邮件PythonPython内制了一个内制了一个poplibpoplib模块(实现模块(实现POP3POP3协协议)可以直接用来收邮件。议)可以直接用来收邮件。要把要把POP3POP3收取的文本变成可以阅读的邮件,收取的文
28、本变成可以阅读的邮件,还需要用还需要用emailemail模块提供的各种类来解析原始文本模块提供的各种类来解析原始文本,变成可阅读的邮件对象。,变成可阅读的邮件对象。所以,收取邮件分两步:所以,收取邮件分两步:1 1)用)用poplibpoplib把邮件把邮件的原始文本下载到本地;的原始文本下载到本地;2 2)用)用emailemail解析原始文解析原始文本,还原为邮件对象本,还原为邮件对象。POP3POP3协议:协议:POP3POP3全名为全名为“Post Post Office Protocol-Version 3”Office Protocol-Version 3”,收取邮件最常用的协议
29、是就是,收取邮件最常用的协议是就是POPPOP协议,目前版本号是协议,目前版本号是3 3因此为因此为POP3POP3。【例例12-612-6】Python POP3 Python POP3协议收取邮件。协议收取邮件。【例例12-712-7】通过通过POP3POP3下载邮件,来获取最新的一封邮件内容:下载邮件,来获取最新的一封邮件内容:resp,lines,octets=server.retr(index);#lines存储了邮件的原始文本的每一行存储了邮件的原始文本的每一行,可以获得整个邮件的原始文本可以获得整个邮件的原始文本:print(lines);msg_content=rn.join(
30、str(lines)msg=Parser().parsestr(msg_content)#稍后解析出邮件,稍后解析出邮件,Parser()功能需要自己补充功能需要自己补充#可以根据邮件索引号直接从服务器删除邮件:可以根据邮件索引号直接从服务器删除邮件:server.dele(index)server.quit()#关闭连接关闭连接【例例12-712-7】通过通过POP3POP3下载邮件,来获取最新的一封邮件内容:下载邮件,来获取最新的一封邮件内容:用用POP3POP3获取邮件其实很简单,获取邮件其实很简单,要获取所有邮件,只需要循环使用要获取所有邮件,只需要循环使用retrretr()()把每
31、一封邮件内容拿到即可把每一封邮件内容拿到即可。真正麻烦的是把邮件的原始内容。真正麻烦的是把邮件的原始内容解析为可以阅读的邮件对象。解析为可以阅读的邮件对象。什么是爬虫什么是爬虫所谓爬虫即网页抓取,是请求网站并且提所谓爬虫即网页抓取,是请求网站并且提取自己所需的数据的一个过程。此过程类似于取自己所需的数据的一个过程。此过程类似于使用使用IE浏览器,把浏览器,把URL作为作为HTTP请求的内容发送请求的内容发送到服务器端,然后读取服务器端的响应资源。到服务器端,然后读取服务器端的响应资源。通过通过Python程序,可以向服务器发送请求,然程序,可以向服务器发送请求,然后进行批量、大量的数据的下载并
32、保存。后进行批量、大量的数据的下载并保存。1、urllib抓取网页抓取网页用用urllib或或urllib2模块简单抓取网页模块简单抓取网页【例例12-812-8】在在Python 2.xPython 2.x用用urllib2urllib2抓取指定页面示例之一。抓取指定页面示例之一。可以打开百度主页,右击浏览器中选择查看源代码,会发现也是一样可以打开百度主页,右击浏览器中选择查看源代码,会发现也是一样的内容。也就是说上面这段代码将访问百度时浏览器收到的代码全部打印的内容。也就是说上面这段代码将访问百度时浏览器收到的代码全部打印了出来了出来。这就是一个最简单的这就是一个最简单的urllib2的例
33、子。除了的例子。除了“http:”,URL同样可同样可以使用以使用“ftp:”、“file:”等来替代。等来替代。HTTP是基于请求和应答机制的:客户端是基于请求和应答机制的:客户端提出请求,服务端提供应答提出请求,服务端提供应答。urllib2用一个用一个Request对象来映射你提出的对象来映射你提出的HTTP请求。在它最简单的使请求。在它最简单的使用形式中将要请求的地址创建一个用形式中将要请求的地址创建一个Request对象。通过调用对象。通过调用urlopen并传入并传入Request对象,将返回一个相关请求对象,将返回一个相关请求response对象,这个应答对象如同一个对象,这个应
34、答对象如同一个文件对象,所以可以在文件对象,所以可以在Response中调用中调用read()读取方法。读取方法。【例例12-812-8】在在Python 2.xPython 2.x用用urllib2urllib2抓取指定页面示例之二。抓取指定页面示例之二。可以看到输出的内容和上例可以看到输出的内容和上例urllib2_test01.py输出内容是一样的。输出内容是一样的。urllib2使用相同的接口处理所有的使用相同的接口处理所有的URL头。例如:可以像下面那样创头。例如:可以像下面那样创建一个建一个ftp请求:请求:req=urllib2.Request(ftp:/ 3.xPython 3
35、.x用用urllib.requesturllib.request抓取指定页面之三。抓取指定页面之三。使用的编辑器是使用的编辑器是Idle,在源程序文件中输入程序后,按,在源程序文件中输入程序后,按F5就能运行就能运行并显示结果。运行结果如图并显示结果。运行结果如图12-1所示。所示。图图12-1 Python12-1 Python抓取指定页面的程序与抓取到的内容抓取指定页面的程序与抓取到的内容urllib.requesturllib.request是一个隶属是一个隶属urlliburllib的库。代码中用到它的的库。代码中用到它的urlopenurlopen()()函数。函数。urllib.r
36、equest.urlopenurllib.request.urlopen(urlurl,data=None,timeout,data=None,timeout,*,cafilecafile=None,=None,capathcapath=None,=None,cadefaultcadefault=False)=False)这个函数返回一个这个函数返回一个 http.client.HTTPResponsehttp.client.HTTPResponse 对象,这个对象又有多种方法,比如对象,这个对象又有多种方法,比如read()read()方法,方法,这些方法都可以在控制台试运行。这些方法都可以
37、在控制台试运行。full_urlfull_url=http:/ response=response=urllib.request.urlopenurllib.request.urlopen(full_urlfull_url)type(response)#type(response)#response.geturlresponse.geturl()#http:/ response.info()response.info()#object at 0 x03272250 response.getcoderesponse.getcode()#200()#200 表示表示httphttp状态正常状态正常
38、发送发送data表单数据并抓取网页表单数据并抓取网页【例例12-1112-11】在在Python2.xPython2.x用用urllib2urllib2抓取指定页面之四(抓取指定页面之四(POSTPOST传送数据)。传送数据)。如果没有传送如果没有传送data参数,参数,urllib2使用使用GET方式的请求。方式的请求。发送发送data表单数据并抓取网页表单数据并抓取网页【例例12-1212-12】在在Python 2.xPython 2.x用用urllib2urllib2抓取指定页面之五(抓取指定页面之五(GetGet传送数据)。传送数据)。DataData同样可以通过在同样可以通过在Ge
39、tGet请求的请求的URLURL本身上面编码来传送本身上面编码来传送这样就实现了这样就实现了Data数据的数据的Get传送。传送。发送发送data表单数据并抓取网页表单数据并抓取网页【例例12-1312-13】在在Python 3.xPython 3.x用用urlliburllib抓取指定页面之六(抓取指定页面之六(GetGet传送数据)。传送数据)。用用PythonPython简单处理简单处理URLURL,抓取百度上面搜索关键词为,抓取百度上面搜索关键词为Python NotesPython Notes的网页:的网页:data是一个字典是一个字典,然后通过然后通过urllib.parse.u
40、rlencode()来将来将data转换转换为为 word=Python+Notes的字符串,最后和的字符串,最后和url合并为合并为full_url。设置设置Headers到到http请求请求import import urlliburllib,urllib2,urllib2urlurl=https:/ 5.5;Windows NT)=Mozilla/4.0(compatible;MSIE 5.5;Windows NT)headers=User-Agent:headers=User-Agent:user_agentuser_agent values=values=tntn:98741884_
41、hao_pg;data=:98741884_hao_pg;data=urllib.urlencodeurllib.urlencode(values)(values)reqreq=urllib2.Request(=urllib2.Request(urlurl,data,headers),data,headers)response=urllib2.urlopen(response=urllib2.urlopen(reqreq)the_pagethe_page=response.readresponse.read();print();print(the_pagethe_page)#读取反馈的内容并输
42、出读取反馈的内容并输出【例例12-1412-14】在在Python 2.xPython 2.x用用urllib2urllib2抓取指定页面之七(把自身模拟成抓取指定页面之七(把自身模拟成Internet ExplorerInternet Explorer)。)。对网页内容做简单处理对网页内容做简单处理import import urllib.requesturllib.request,re#,re#抓取指定页面之八抓取指定页面之八def def gethtmlgethtml(urlurl):):page=page=urllib.request.urlopenurllib.request.url
43、open(urlurl);html=);html=page.readpage.read();return();return htmlhtmldef def getimggetimg(html):(html):regreg=rsrcrsrc=(.+?.jpg)=(.+?.jpg)pic_extpic_ext imgreimgre=pile(regreg);html=);html=html.decodehtml.decode(utf-8)(utf-8)imglistimglist=re.findallre.findall(imgre,htmlimgre,html)return return img
44、listimglisthtml=html=gethtmlgethtml(http:/ 或或 https:/www.scrapy.org/)https:/www.scrapy.org/)。【例例12-1612-16】爬虫获取中国天气预报信息。从中国天气预报网站(如图爬虫获取中国天气预报信息。从中国天气预报网站(如图12-212-2所示所示)上,爬取)上,爬取7 7天天气预报信息,主要取日期、天气状况、最高气温、最低气温等信天天气预报信息,主要取日期、天气状况、最高气温、最低气温等信息,并输出结果到息,并输出结果到ExcelExcel表中。表中。运行结果情况如图运行结果情况如图12-312-3、图
45、、图12-412-4所示。所示。图图12-3 12-3 从中国从中国天气预报网站抓天气预报网站抓取内容的情况取内容的情况图图12-4 从中国从中国天气预报网站天气预报网站抓取内容输出抓取内容输出到到Excel的情况的情况 本章简单介绍学习本章后将能了解到本章简单介绍学习本章后将能了解到QQ、收、收发邮件等发邮件等Internet应用软件的实现原理,并有能应用软件的实现原理,并有能力自己来尝试编写有类似功能的网络应用软件。力自己来尝试编写有类似功能的网络应用软件。实践操作方面,要逐步掌握实践操作方面,要逐步掌握网络编程的网络编程的上机操作上机操作方法,对本章的示例程序能上机运行、熟悉与再方法,对本章的示例程序能上机运行、熟悉与再认识。认识。