如今大数据时代了,博主原来搞java开发的,再不整点新技术,怕是要被淘汰了。于是开始研究起了爬虫系列。一方面呢可以学习python,另一方面呢以后做大数据或者人工智能,都需要数据集吧,自己爬下也好,其次从头开始写,也方便一些人一起学习。
今天,我们正式从0到1,轻松学会 python 爬虫。
爬虫:是一段自动抓取互联网信息的程序;抓取互联网相关数据为自己所用。
我们的爬虫,首先会模拟请求,就好像你在浏览器输入网址,然后回车那样,爬虫可以用到一些 Http 库向指定的服务器偷偷摸摸的发起请求,这个时候爬虫可以假装自己是浏览器(添加一些header信息),大多数的服务器呢,就直接返回数据给爬虫了。这样就可以拿到很多数据了。
具体过程:(细品,你细品~)
1、调度器询问URL管理器,是否有待爬URL?URL管理器返回是/否? 2、如果是,调度器会从URL管理器中取出一个待爬URL; 3、调度器将URL传给下载器,下载网页内容后返回给调度器; 4、调度器再将返回的网页内容发送到解析器,解析URL内容,解析完成后返回有价值的数据和新的URL; 5、一方面,调度器将数据传递给应用进行数据的收集;另一方面,会将新的URL补充进URL管理器,若有URL管理器中含有新的URL,则重复上述步骤,直到爬取完所有的URL 6、最后,调度器会调动应用的方法,将价值数据输出到需要的格式。
定义:管理带抓取URL集合和已抓取URL集合, 作用:防止重复抓取、防止循环抓取
URL管理器功能:1、适合个人的:内存(计算机或服务器内存)
2、小型企业或个人:关系数据库(永久存储或内存不够用,如 MySQL)
3、大型互联网公司:缓存数据库(高性能,如支持 set() 的 redis)
将互联网上URL对应的网页下载到本地的工具。
作用:网页下载器类似于浏览器,会将互联网对应的网页以HTML的形式下载到本地,存储成本地文件或内存字符串,然后进行后续的分析。
(注意:python 3.x 以上版本把urllib2 和 urllib 整合到一起。所以引入模块变成一个,只有 import urllib,以后你在python2中看到的urllib2在python3中用urllib.request替换~ )
举例:
#py2 import urllib2 response = urllib2.urlopen(url) # 报错NameError: name 'urllib2' is not defined,要改为 # py3 import urllib.request response = urllib.request.urlopen(url) 个人觉得Urllib库不好用,requests库更好用。当然,虽然urllib2用的要少一些了,但是还是要了解一下的
方法1:给定url,使用urllib 模块的urlopen方法获取网页内容举例:
这里我用的python3.x版本的urllib库。 get请求:发送一个GET请求到指定的页面,然后返回HTTP的响应。
from urllib import request print('第一种方法get请求') url = 'http://www.baidu.com' # 直接请求 response = request.urlopen(url) # 获取状态码,如果是200表示成功 print(response.status) # 读取网页内容 print(response.read().decode('utf-8')因为read获取到的byte编码,改为decode(‘utf-8’)。
方法2:添加data,http header模拟浏览器发送GET请求,就需要使用Request对象,通过往Request对象添加HTTP头,我们就可以把请求伪装成浏览器进行访问:
User-Agent 有些 Server 或 Proxy 会检查该值,用来判断是否是浏览器发起的 Request .Content-Type
在使用 REST 接口时,Server 会检查该值,用来确定 HTTP Body 中的内容该怎样解析。
添加头信息举例: import urllib2 print "第二种方法" from urllib import request req = request.Request('http://www.baidu.com') req.add_header('User-Agent', 'Mozilla/6.0') response = request.urlopen(req) # 获取状态码,如果是200表示成功 print(response.status) # 读取网页内容 print(response.read().decode('utf-8')) 方法3:添加特殊情景的处理器模拟浏览器发送POST请求。
需要登录才能访问的网页,要添加cookie的处理。使用HTTPCookieProcessor; 需要代理才能访问的网页使用ProxyHandler; 需要HTTPS加密访问的网站使用HTTPSHandler; 有些URL存在相互自动跳转的关系使用HTTPRedirectHandler进行处理。
图示:
HTTPCookieProcessor的使用:
cookie中保存中我们常见的登录信息,有时候爬取网站需要携带cookie信息访问,这里用到了http.cookijar,用于获取cookie以及存储cookie,同时cookie可以写入到文件中保存,一般有两种方式http.cookiejar.MozillaCookieJar和http.cookiejar.LWPCookieJar()。举例:
import urllib2, cookielib print "第三种方法" # 创建cookie容器 cj = cookielib.CookieJar() # 创建1个opener opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj)) # 给urllib2安装opener urllib2.install_opener(opener) # 使用带有cookie的urllib2访问网页 response = urllib2.urlopen('http://www.baidu.com/')上面都是对urllib2模块来写的,但是实战中往往用requests,这个放到后面文章来说。 注意: python3用cookielib 模块改名为 http.cookiejar,带cookie的打印出来必须用opener.open(req).read().decode(‘utf-8’)来发送的请求才会带上cookie,如果用urllib.request.urlopen()是不带cookie的。
ProxyHandler代理的使用:
网站它会检测某一段时间某个IP 的访问次数,如果访问次数过多,它会禁止你的访问,所以这个时候需要通过设置代理来爬取数据
import urllib.request url = 'http://www.baidu.com' proxy_handler = urllib.request.ProxyHandler({ #代理服务器IP地址 'http': 'http://111.13.100.91:80', 'https': 'https://111.13.100.91:443' }) opener = urllib.request.build_opener(proxy_handler) response = opener.open(url) # 获取状态码,如果是200表示成功 print(response.status) # 读取网页内容 print(response.read().decode('utf-8'))网页解析器从HTML网页字符串中提取出价值数据和新URL对象
lxml (第三方解析器)
后面三种是以结构化解析的方式进行解析DOM(Document Object Model)树, 【也就是按照html的节点路径一级一级来解析的。】
下面挨个介绍一下最常用的两个。
bs4主要使用find()方法和find_all()方法来搜索文档。
find()用来搜索单一数据,find_all()用来搜索多个数据
它是Python第三方库,用于从HTML或XML中提取数据官网:https://www.crummy.com/software/BeautifulSoup/ 中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html需要安装和测试:
方法一,在cmd窗口中:
安装:pip install beautifulsoup4 测试:import bs4方法2:在pycharm中:File–settings–Project Interpreter–添加beautifulsoup4(简写bs4)
举个例子:
from bs4 import BeautifulSoup # 根据HTML网页字符串创建BeautifulSoup对象 soup = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8') # 搜索节点 查找所有标签为a的节点 soup.find_all('a') # 查找所有标签为a,连接符合/view/123.html形式的节点 soup.find_all('a', href='/view/123.html') soup.find_all('a', href=re.compile(r'/view/\d+\.html')) # 查找所有标签为div,class为abc,文字为Python的节点 soup.find_all('div', class_='abc', string='Python')访问节点信息
# 举例节点:<a href='1.html'>Python</a> # 获取查找到的节点的标签名称 node.name # 获取查找到的a节点的href属性 node['href'] # 获取查找到的a节点的链接文字 node.get_text()上面就是bs4在解析模块的相关使用,更多方式查看官方文档即可。
Xpath是一门在XML文档中查找信息的语言。Xpath可用来在XML文档中对元素和属性进行遍历。Xpath是W3C XSLT标准的主要元素,并且XQuery和XPointer都构建于XPath表达之上。 安装:
pip install lxml语法:
选取节点 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。
在使用 xpath之前,先导入 etree类,对原始的 html页面进行处理获得一个_Element对象 举个例子:
#导入 etree类 from lxml import etree # html文本 html = '''<div class="container"> <div class="row"> <div class="col"> <div class="card"> <div class="card-content"> <a href="#123333" class="box"> 好麻烦哟!!!~~~ </a> </div> </div> </div> </div> </div>''' #对 html文本进行处理 获得一个_Element对象 dom = etree.HTML(html) #获取 a标签下的文本 a_text = dom.xpath('//div/div/div/div/div/a/text()') print(a_text)我们通过 etree.HTML( )来生成一个_Element对象,etree.HTML() 会将传入的文本处理成一个 html文档节点。这样就能保证我们总是能获得一个包含文档节点的_Element对象。
哎呀我都懒得废话了,具体自己去看文档吧,后面我写个代码案例出来,有代码基础的一眼就知道啥意思了。(程序员还是要用代码来说话)
上述代码和说明就是整个简单的爬虫架构,对于后面的文章会开始采用这种模式来实战。
(说给之前学java的人) python的类类似于java,继承object python的返回值return和return None一样(None类似于java的null关键字)
参考地址: https://www.imooc.com/learn/563 https://www.jianshu.com/p/091c3aa0a73 电脑基础知识精选(硬件篇) 计算机语言知识精选(编程篇)