网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动的抓取万维网信息的程序或者脚本。
网络爬虫必备知识点
1. Python基础知识
2. Python中urllib和urllib2库的用法
3. Python正则表达式的使用
4. python Beautiful Soup的用法
5. Python爬虫框架Scrapy
网站浏览网页的过程
网页实质是由 HTML 代码构成的,爬虫爬来的便是这些内容,通过分析和过滤这些 HTML 代码,实现对图片、文字等资源的获取
URL
资源定位符,也就是我们说的网址,统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它
URL的格式由三部分组成:
①第一部分是协议(或称为服务方式)。
②第二部分是存有该资源的主机IP地址(有时也包括端口号)。
③第三部分是主机资源的具体地址,如目录和文件名等。
爬虫爬取数据时必须要有一个目标的URL才可以获取数据,因此,它是爬虫获取数据的基本依据.
urllib,Urllib2库的基本使用
在python中,抓取网页的库是urllib2
# 例子,爬取百度主页的html代码
import urllib2
response = urllib2.urlopen('http://www.baidu.com/')
html = response.read()
print (html)
# urlopen的用法
urlopen(url, data=None, timeout=socket._GLOBAL_DEFAULT_TIMEOUT,cafile=None, capath=None, cadefault=False, context=None):
第一个参数为url,第二个为要发送的数据,第三个是超时时间。其余的一般不用
# 构造一个Request类,作为参数传入urlopen中,使Request类中就包含url,data,timeout等内容
import urllib2
request = urllib2.Request('http://www.baidu.com/')
response = urllib2.urlopen(request)
print (response.read())
POST和GET数据传送解析
数据传送分为POST和GET两种方式。
区别是GET方式是直接以链接形式访问,链接中包含了所有的参数,当然如果包含了密码的话是一种不安全的选择,不过你可以直观地看到自己提交了什么内容。POST则不会在网址上显示所有的参数
1. post 方式
# 例子,实现了POST方式的传送
import urllib
import urllib2 values = {"username":"1337047412@qq.com","password":"123456"}
data = urllib.urlencode(values)
url = "http://mail.163.com/"
request = urllib2.Request(url,data)
response = urllib2.urlopen(request)
print (response.read())
2. get 方式
GET方式可以直接把参数写到网址上面,直接构建一个带参数的URL
# 例子
import urllib
import urllib2 values = {}
values["username"] = "1337047412@qq.com"
values["password"] = "123456"
data = urllib.urlencode(values)
url = "http://mail.163.com/"
geturl = url + "?" + data
print (geturl)
# http://mail.163.com/?username=1337047412%40qq.com&password=123456
request = urllib2.Request(geturl)
response = urllib2.urlopen(request)
print (response.read())
设置headers属性,完全模拟浏览器工作
# 构建headers属性
headers = { 'User-Agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)', 'Referer':'http://mail.163.com/' }
Proxy(代理)的设置
urllib2 默认会使用环境变量 http_proxy 来设置 HTTP Proxy
# 例子
import urllib2
enable_proxy = True
proxy_handler = urllib2.ProxyHandler({"http":"http://some-proxy.com:8080"})
null_proxy_handler = urllib2.ProxyHandler({})
if enable_proxy:
opener = urllib2.build_opener(proxy_handler)
else:
opener = urllib2.build_opener(null_proxy_handler)
urllib2.install_opener(opener)
timeout 设置
# imeout的设置,可以设置等待多久超时,为了解决一些网站实在响应过慢而造成的影响
import urllib2
response = urllib2.urlopen("http://www.baidu.com",timeout=10)
HTTP 的 PUT 和 DELETE 方法
# http协议有六种请求方法,get,head,put,delete,post,options
PUT和POST极为相似,都是向服务器发送数据,但它们之间有一个重要区别,PUT通常指定了资源的存放位置,而POST则没有,POST的数据存放位置由服务器自己决定
DELETE:删除某一个资源
# 例子
import urllib2
request = urllib2.Request(url,data=data)
request.get_method = lambda:"PUT" # or "DELETE"
response = urllib2.urlopen(request)