indicator:
网页也是文件,只是路径是 url 形式,内容是html——打开则需要使用urlopen,而 urlopen 则是返回一个类文件对象
想要找到文件指定内容——正则表达式匹配,或者其他技术
URL 管理器——
功能:区别URL爬取 / 未爬取,避免重复爬取统一个URL
使用内存实现——两组set():已爬取URL/未爬取URL,使用set() 数据结构可以直接取出重复元素
使用关系数据库——建立一个url 表,两个关键字:已爬取/未爬取
缓存数据库——高性能,redis 也支持set
网页下载器——
1.直接获取所有——只需要参数 url
import urllib2
url = 'xxxx.com'
response = urllib2.urlopen(url) # 请求
print response.getcode() # 状态码——200:success
print response.read() # 读取网页内容
2.交互——需要三个参数
header:向服务器提交 http 头信息
date:向服务器提交需要用户输入的数据
url
将三个参数构建一个request 对象(使用 urllib2.Request 构建),然后使用 urllib2.urlopen(request),以 request 为参数发送网页请求
a. 后面补充data和header
# -*- coding: utf-8 -*-
import urllib2
import urllib
url = 'http://xxxxsoft.org/jira/login.jsp'
request = urllib2.Request(url) # build Request object
# add data
data = urllib.urlencode({
'os_username' : '23333',
'os_password' : '23333',
.....
'login' : 'Log In'
})
request.add_data(data) #request.add_data('psw','xxxx') # key is 'psw', value is 'xxx'
# add header
header = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
request.add_header('User-Agent',header) #request.add_header(header) take 3 parameters (2 given)
response = urllib2.urlopen(request)
print response.read()
b.一开始就构建好带有header 和 data的request
import urllib2
import urllib
url = 'http://hdc-tomcat-jira150.ubisoft.org/jira/login.jsp'
data = urllib.urlencode({
#'os_username' : '23333',
'os_password' : '23333',
'os_destination' : '',
'user_role' : '',
'atl_token' : '',
'login' : 'Log In'
})
header = "User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36"
header = {'User-Agent' : header}
request = urllib2.Request(url) # build Request object
request = urllib2.Request(url = url, headers = header, data = data)
response = urllib2.urlopen(request)
print response.read()
3. 添加特殊的处理器
常见的处理器有:HTTPCookieProcessor(处理cookie信息),ProxyHandler(对于有些需要代理处理的网页),HTTPSHandler(对于https加密的网页),HTTPRedirectHandler(url相互自动跳转的网页),HTTPBasicAuthHandler。
将上述的 Handler 通过 build_opener() 方法创建对象:opener - urllib2.build_opener(xxxhandler) ——> urllib2 安装这些opener:urllib2.install_opener(opener),使得urllib2具有处理相应场景的能力,最后使用 urlopen() 参数可以为 request 或者 url 均可,urlopen调用的就是自定义的opener
import urllib2,cookielib
cj = cookielib.CookieJar() # build one cookie container
opener = urllib2.build_opener( urllib2.HTTPCookieProcessor(cj) )
urllib2.install_opener(opener) # install one opener
reponse = urllib2.urlopen('http://www.baidu.com/') # use stronger urlopen to open webside
urlopen返回的是一堆 html 格式的代码,当你想要知道是否爬取了正确的网页,可以将 response.read() 的内容拷贝出来,构建一个html 文件打开看可以大致的比较一下。当然也可以查看目标网页源文件与其比较。
网页解析器——
正则表达式
BeautifulSoup 第三方插件——处理HTML
ScrapeNFeed——RSS feed进行分析