概念:什么是爬虫?
爬虫别名:网络蜘蛛;网络,可以形成一个网,这个很好理解,从我们的百度进入,可以联系到很多很多网站,其实,百度就是一个大型的爬虫,我们的网站都是放在服务器上的,所以,我们爬取的就是服务器上的信息,一个网站,里面不止一个文件,可以包含着很多很多html,图片,视频等等,但是,如果我们一个一个去找,那么就会浪费很多时间,重复的事情,最适合的就是计算器去操作,所以爬虫就诞生了,爬虫就是帮我们在网络里面,自动的提取我们想要的信息,那么能不能具体一点呢?比如说,这个网站的求职信息,我们需要全部拿出来做一个统计分析,比如说,这个网站的不定时消息发送,我们需要实时的盯住它,抓取出来,等等,都可以使用我们的自动爬取程序就解决,而让我们人类解脱;
哇,是不是感觉,爬虫的功能,真好,但是呢,这里也有一个缺点,如果这个爬虫无限制的去爬取,无限制的去访问我们的服务器,那么服务器岂不是要崩溃,所以,网站的创建者,自然要去识别这个请求信息,哪些是爬虫发出来的,这就是反爬虫技术,但是呢,道高一尺魔高一丈,我们也可以继续加深我们的爬虫程序,让这个程序更加像 一个人的操作;好的,废话不多说,我们开始我们的第一个爬虫程序!
1,python3里面自带有http协议请求模板,所以,我们可以直接导入python3的urllib模板进行操作(而Python2里面使用的是urllib2,所以这里,我们要区分一下;而,我们根据java web 的经验,我们知道这个网页的访问,实际上就是http协议,发送一个request 请求,同样,我们的urllib使用也是如此,导入它的request模板,使用它的urlopen方法,很形象是吗,打开,参数是什么,参数是url ,然后这个请求就发出了,发出去之后服务器会返回,同样也就返回到这个承接对象上,我们再用这个对象的read功能,就可以打印出来,也可以输入到文件里面;
from urllib import request
url='http://httpbin.org'
aa=request.urlopen(url)
print(aa.read())
返回结果:就是该页面的源代码,
1,数据的存入文件(网页下载)
from urllib import request
url='http://httpbin.org'
aa=request.urlopen(url)
bb=aa.read()
f=open('./baidu.html',"wb")
#第二种方法下载
request.urlretrieve('https://i.youkuaiyun.com/#/uc/profile','./csdn.html')
#第一种 手动下载;流输入
f.write(bb)
f.close()
print(aa.read())
2,文字的编码解码
from urllib import parse
from urllib.request import urlopen
values = {'username': '962457839@qq.com', 'password': '呼呼'}
data = parse.urlencode(values).encode('utf-8') # 提交类型不能为str,需要为byte类型
print(data)
mm=parse.parse_qs('username=962457839%40qq.com&password=%E5%91%BC%E5%91%BC')//解码
print(mm)
url = 'http://www.hello.world/你好世界'
url_encode = parse.quote(url);//编码
print(url_encode)
url_a=parse.unquote(url_encode)//解码
print(url_a)
urlencode 传进去的是key=value,返回的是字符串,中间带=这种,而,parse_qs传进去的string,返回的字典;而quote可以直接编码字符串,,而unquote可以解码;
3,解释器,分割
url = "https://docs.python.org/3.5/library/urllib.parse.html?highlight=parse#module-urllib.parse"
result = parse.urlparse(url)
print(result)
print(result.query) # 获取返回结果参数内容
print(parse.parse_qs(result.query)) # 结果转换成字典
print(parse.parse_qsl(result.query)) # 结果转换成列表
4,头信息的加入;
Request,参数加入,然后再使用urlopen打开,这个headers的取得,是通过浏览器,审查元素-》network-》然后找到一个请求,点开,找到headers,然后找到你们的信息,进行复制过来;
url = 'https://www.lagou.com/'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
data = None
req = request.Request(url, data, headers)
b= request.urlopen(req)
print(b.read())
5.实战,拉钩网爬取,解码显示:
url = 'https://www.lagou.com/jobs/list_Java?px=new&city=%E5%85%A8%E5%9B%BD#order'
headers = { 'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'
}
data = None
req = request.Request(url, data, headers)
b= request.urlopen(req)
print(b.read().decode('utf-8'))