如何用python写爬虫来获取网页中所有的文章以及关键词
所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存到本地。
类似于使用程序模拟IE浏览器的功能,把URL作为HTTP请求的内容发送到服务器端, 然后读取服务器端的响应资源。
在Python中,我们使用urllib2这个组件来抓取网页。
urllib2是Python的一个获取URLs(Uniform Resource Locators)的组件。
它以urlopen函数的形式提供了一个非常简单的接口。
最简单的urllib2的应用代码只需要四行。
我们新建一个文件urllib2_test01py来感受一下urllib2的作用:
import urllib2
response = urllib2urlopen('http://wwwbaiducom/')
html = responseread()
print html
按下F5可以看到运行的结果:
我们可以打开百度主页,右击,选择查看源代码(火狐OR谷歌浏览器均可),会发现也是完全一样的内容。
也就是说,上面这四行代码将我们访问百度时浏览器收到的代码们全部打印了出来。
这就是一个最简单的urllib2的例子。
除了"http:",URL同样可以使用"ftp:","file:"等等来替代。
HTTP是基于请求和应答机制的:
客户端提出请求,服务端提供应答。
urllib2用一个Request对象来映射你提出的HTTP请求。
在它最简单的使用形式中你将用你要请求的地址创建一个Request对象,
通过调用urlopen并传入Request对象,将返回一个相关请求response对象,
这个应答对象如同一个文件对象,所以你可以在Response中调用read()。
我们新建一个文件urllib2_test02py来感受一下:
import urllib2
req = urllib2Request('http://wwwbaiducom')
response = urllib2urlopen(req)
the_page = responseread()
print the_page
可以看到输出的内容和test01是一样的。
urllib2使用相同的接口处理所有的URL头。例如你可以像下面那样创建一个ftp请求。
req = urllib2Request('ftp://examplecom/')
在HTTP请求时,允许你做额外的两件事。
1发送data表单数据
这个内容相信做过Web端的都不会陌生,
有时候你希望发送一些数据到URL(通常URL与CGI[通用网关接口]脚本,或其他WEB应用程序挂接)。
在HTTP中,这个经常使用熟知的POST请求发送。
这个通常在你提交一个HTML表单时由你的浏览器来做。
并不是所有的POSTs都来源于表单,你能够使用POST提交任意的数据到你自己的程序。
一般的HTML表单,data需要编码成标准形式。然后做为data参数传到Request对象。
编码工作使用urllib的函数而非urllib2。
我们新建一个文件urllib2_test03py来感受一下:
import urllib
import urllib2
url = 'http://wwwsomeservercom/registercgi'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
data = urlliburlencode(values) # 编码工作
req = urllib2Request(url, data) # 发送请求同时传data表单
response = urllib2urlopen(req) #接受反馈的信息
the_page = responseread() #读取反馈的内容
如果没有传送data参数,urllib2使用GET方式的请求。
GET和POST请求的不同之处是POST请求通常有"副作用",
它们会由于某种途径改变系统状态(例如提交成堆垃圾到你的门口)。
Data同样可以通过在Get请求的URL本身上面编码来传送。
import urllib2
import urllib
data = {}
data['name'] = 'WHY'
data['location'] = 'SDU'
data['language'] = 'Python'
url_values = urlliburlencode(data)
print url_values
name=Somebody+Here&language=Python&location=Northampton
url = 'http://wwwexamplecom/examplecgi'
full_url = url + '' + url_values
data = urllib2open(full_url)
这样就实现了Data数据的Get传送。
2设置Headers到http请求
有一些站点不喜欢被程序(非人为访问)访问,或者发送不同版本的内容到不同的浏览器。
默认的urllib2把自己作为“Python-urllib/xy”(x和y是Python主版本和次版本号,例如Python-urllib/27),
这个身份可能会让站点迷惑,或者干脆不工作。
浏览器确认自己身份是通过User-Agent头,当你创建了一个请求对象,你可以给他一个包含头数据的字典。
下面的例子发送跟上面一样的内容,但把自身模拟成Internet Explorer。
(多谢大家的提醒,现在这个Demo已经不可用了,不过原理还是那样的)。
import urllib
import urllib2
url = 'http://wwwsomeservercom/cgi-bin/registercgi'
user_agent = 'Mozilla/40 (compatible; MSIE 55; Windows NT)'
values = {'name' : 'WHY',
'location' : 'SDU',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
data = urlliburlencode(values)
req = urllib2Request(url, data, headers)
response = urllib2urlopen(req)
the_page = responseread()
以上就是python利用urllib2通过指定的URL抓取网页内容的全部内容,非常简单吧,希望对大家能有所帮助。
打开“我的电脑”属性菜单——设备管理器——网络适配器,看看是否存在当前网卡的驱动程序,有则说明网卡驱动正常,无或有叹号,则说明网卡识别不了或驱动安装出错,这种情况就要检查网卡是否坏了,集成的网卡出现这种故障时应更换一个独立网卡,独立的网卡可以拆出来清理插槽,再装回去。如果显示无法识别的网络设备,则用自由天空驱动安装包来安装网卡的正确驱动。
网卡驱动正常时,则查网上邻居的属性——本地连接属性——TCP/IP协议属性——选中自动获取IP和DNS。选中自动获取还是上不了网,则查路由器和网线是否接通良好。,
开始——运行CMD(打开命令提示符),输入IPCONFIG /ALL打开当前所有网卡驱动运行情况。找到信息齐全的当前本地连接信息,可知网卡工作情况。
在命令提示符窗口PING 当前IP(如PING 1921688103-t),出现长长的英文说明网卡工作正常;出现短短的英文,则说明网卡工作异常,需换网卡。
网卡工作正常还是上不了网,则是网络协议冲突或系统损坏,请删除多余的网络协议,通常只保留如图四个,再重启,或重装系统。
ping网关是否通,通则说明网卡到路由器的通讯正常,还上不了网则是路由器外面如模顿或外线服务器故障;不通则说明网卡到路由的线路不通或路由器已损坏。
以下为纯手打,下面给几个demos:
说明:
modules所在的目录在python里叫package, 下面是一个名为 IsDir的package(实际上就是一个目录), package下面有4个modules(A, B, C, D)和一个__init__py文件,目录结构如下:
IsDir/Apy Bpy Cpy Dpy __init__py
大体来讲,有两种方法可以调用某目录下(包括递归目录)的modules
一 __init__py为空时
11 以下为调用moduleA的代码:
#!/usr/bin/env pythonfrom IsDir import A
Asay()
输出:
This is module A!12 如果想调用moduleA,B,C,D呢?
方法1
#!/usr/bin/env pythonfrom IsDir import A
from IsDir import B
from IsDir import C
from IsDir import D
Asay()
Bsay()
Csay()
Dsay()
方法2
#!/usr/bin/env pythonimport IsDirA
import IsDirB
import IsDirC
import IsDirD
from IsDir import
Asay()
Bsay()
Csay()
Dsay()
错误示例1:
#!/usr/bin/env pythonimport IsDirA
Asay()
错误示例2:
#!/usr/bin/env pythonfrom IsDir import
Asay()
错误的原因:
IsDir/目录下__init__py 为空时,直接import IsDirA 或者from IsDir import 是无效的
从官方文档里可以看到,__init__py 里没有__all__ = [module1,module2,]时,
from IsDir import 只能保证IsDir被imported, 所以此时IsDir里的modules是无法被imported,
此时只有如我上面所写的代码所示才能正确执行,否则是错误的。官方解释为:import IsDirA并无任何意义,只有接着执行from IsDir import 后,import IsDirA语句里的module A才会被定义,所以完整的调用因改为: 1 import IsDirA 2 from IsDir import 。
二 __init__py用all=[]指定该package下可以被imported进去的module
__init__py里写入如下内容:
% cat IsDir/__init__py__all__ = ["A","B"]
然后使用之:
#!/usr/bin/env pythonfrom IsDir import
Asay()
Bsay()
结果:
% python testpyThis is module A!
This is module B!
错误实例:
#!/usr/bin/env pythonfrom IsDir import
Csay()
以上示例之所以错误,是因为C并没有在__all__ = ["A","B"]里制定,由此可见,package IsDir下面的__init__py里,__all__=[]具有隔离modules的作用。
补充:
module A, B, C,D里我分别只定义了一个method, 例如,以下为module A的code:
% cat IsDir/Apydef say():
print "This is module A!"
后记:
谢谢这位同学,回答你的问题感觉很有收获,顺便又把python温习了一遍。回头把这些总结贴到我的blog上以上为手写,望采纳,共勉。
=============================================================
老子写了这么多居然采用了另一个简陋的答案,mlgb的,枉我熬夜给你答题。这种白痴楼主就不配在这里问问题。
1python import模块时, 是在syspath里按顺序查找的;
2syspath是一个列表,里面以字符串的形式存储了许多路径;
3当你增加里新的放模块的目录时,可以from sys import path pathappend(r" 路径 ")。
电脑程序常见问题解决方法:
网络设置的问题:这种原因比较多出现在需要手动指定IP、网关、DNS服务器联网方式下,及使用代理服务器上网的。仔细检查计算机的网络设置。
网络协议和网卡驱动的问题:IE无法浏览,有可能是网络协议(特别是TCP/IP协议)或网卡驱动损坏导致,可尝试重新网卡驱动和网络协议。
Application Management服务的问题:出现只能上QQ不能开网页的情况,重新启动后就好了。不过就算重新启动,开7到8个网页后又不能开网页了,只能上QQ。有时电信往往会让你禁用Application Management服务,就能解决了。具体原因不明。
需要学习的python框架有:1、Django,它是一个高级的python web框架,以快速开发和使用简洁的设计闻名;2、CherryPy,它是历史最久的框架之一,运行非常稳定且快速;3、Web2Py,它是一个开源、免费的web框架。
常用的五大python框架:
(推荐教程:Python入门教程)
1、Django
Django是一个高级的Python Web框架,以快速开发和实用简洁的设计闻名。它由经验丰富的开发人员构建,解决了Web开发的麻烦,因此用户可以专注于编写应用程序,而不需要担心返工。并且它是开源和免费的。
特点:
安全系数高,能帮助开发者规避常见错误。
速度特别快,因为它的设计目的是使应用程序非常快地从概念阶段过渡到最终阶段。
扩展性好。
从21世纪初Django成为开源框架到现在,它一直是最佳的归档方式。
2、CherryPy
CherryPy是历史最久的框架之一,运行非常稳定且快速。该框架允许开发人员构建web应用程序,和以Python为对象的应用程序开发过程类似,因而可在更短的时间内开发更小的源代码。
从一开始,CherryPy就被证明是高效快速的,并被许多站点用于生产,无论是最简单的站点,还是有高要求的站点。
特点:
可以在27+、35+、Jython、Android和PyPy上运行。
内置覆盖、分析和测试支持。
容易快速运行多个HTTP服务器(例如,在多个端口上)。
是为部署人员和开发人员提供的最强大的配置系统之一。
灵活的插件系统。
3、Web2Py
Web2Py是一个开源、免费的web框架,用于敏捷开发,其中包括数据库驱动的web应用程序。它是用Python编写的,并可用于python编程。它是个全堆栈框架,由开发人员构建功能齐全的web应用程序所需的所有必要组件组成。
特点:
能够简化复杂大型应用的开发
支持MVC体系结构
符合Ni配置和安装要求
提供本地化和国际化支持
4、Bottle
Bottle是一个用于Python的简单、轻量级、快速的Web服务器网关接口(WSGI)微web框架。它是作为单个文件模块分发的,除了Python标准库之外没有其他依赖项。它被设计成轻量级,允许快速有效地开发web应用程序。
特点:
内置HTTP服务器。
允许用户访问表单数据、cookie、上传文件、header和其他http相关元数据。
一个可以同时运行Python 25x和35x的文件。
5、Flask
Flask是一个微框架,最适合简单的小项目。该框架基于Jinja 2和Werkzeug开发。这个框架的主要目的是开发一个强大的web应用程序库。
特点:
包含开发调试器和服务器
有丰富的文档
支持安全cookie
基于unicode
单元测试集成支持
0条评论