(1)CSS=Cascading Style Sheetsjavascript
(2)样式定义如何显示HTML元素css
(3)想一想为何不直接使用属性设置元素html
(4)CSS与JSjava
(1)CSS规则:选择器,以及一条或者多条的声明node
selector {declaration1;....;desclarationN}python
(2)每条声明由一个属性和一个值组成 web
property:value正则表达式
(3)例子数据库
h1{color:red;font-size:14px}npm
(4)元素选择器
直接选择文档元素
好比head,p
(5)类选择器
元素的class属性,好比<h1 class="important">
类名就是Important
.important选择全部有这个属性的元素
能够结合元素选择器,好比p.important
(6)ID选择器
元素的id属性,好比<h1 id="intro">
id就是intro
#intro用于选择id=intro的元素
能够结合元素选择器,好比p.#intro
与类选择器的异同
ID一个文档只出现一次
ID选择器不能使用单词列表
与类选择器同样,都区分大小写
(7)属性选择器
选择有某个属性的元素,而不管是什么
*[title]选择包含title属性的元素
a[href]选择全部带有href属性的锚元素
还能够选择多个属性,好比:a[href][title],注意这里是要同时知足的
限定值:a[href="www.so.com"]
(8)后代选择器
选择某个元素的后代元素
选择h1元素的em元素:h1 em
(9)子元素选择器
范围限制在子元素
选择h1元素的子元素strong:h1>strong
<h1> <em>.....</em> <body> <em></em> </body> </h1>
(9)子代元素选择器
范围限制在子元素
选择h1元素的子元素strong:h1>stong
(1)使用路径表达式在XML文档中进行导航
(2)包含一个标准数据库
(3)是XSLT的主要元素
(4)是一个W3C标准
(1)谓语
嵌在[]中用来查找某个特定节点或包含某个特定值的节点
/bookstore/book[1]第一个book元素
/bookstore/book[last()]最后一个book元素
/bookstore/book[position()<3]选择前2个元素
//title[@lang]选择所拥有有名为lang的属性的title元素
/bookstore/book[price>35.00] 条件过滤
(2)七种基本节点
元素、属性、文本
命名空间、处理指令、注释以及根节点
(3)节点之间的关系
父、子、同胞(兄弟)、先辈、后代
(4)路径表达式
nodename选取此节点的全部子节点
/从根节点选取
//从匹配的当前节点选择文档中的节点,而不考虑他们的位置
.选取当前节点
..选取当前节点的父节点
@选取属性
在DOM树,以路径的方式查询节点,经过@符号来选取属性
<a rel="nofollow" class="external text" href="http://google.ac">google<wbr/>.ac</a>
rel class ref 都是属性,均可以经过"//*[@class='external text']"来选取对应元素
=符号要求属性彻底匹配,能够用contains方法来部分匹配,例如
"//*[contains(@class,'external')]"能够进行匹配,而"//*[@class='external']"则不能进行匹配
import lxml from lxml import etree s='<a class="hask">Yes</a>' tr=etree.HTML(s) tr.xpath('//a') tr.xpath('//p') tr.xpath('//a')[0] tr.xpath('//a')[0].attrib tr.xpath('//*@class="hask"')[0].attrib
tr.xpath('//*[@class="hask"]')[0].attrib
#
s='<a class="hask" href="http://www.tabobao.com">Yes</a>'
tr=etree.HTML(s)
tr.xpath('//a')[0].attrib #打印出attrib属性,这个地方能够打印出两个属性
一个是链接,另一个是类属性{'class': 'hask', 'href': 'http://www.taobao.com'}
>>> tr.xpath('//*[@href="http://www.taobao.com"]')[0].attrib
{'class': 'hask', 'href': 'http://www.taobao.com'}
>>> tr.xpath('//*[@href="http://www.taobao.com"]')[0]
<Element a at 0x2cc5108>
<bookstore> <book> <title lang="eng">Harry Potter</title> <price>29.99</price> </book> <book> <title lang="eng">Learn XML</title> <price>75</price> </book> </bookstore>
(5)运算符
and和or运算符
选择p或者span或者h1标签的元素
soup=tree.xpath('//td[@class="editor bbsDetailContainer"]*[self::p or self::span or self::h1]')
选择class 为editor或者tag的元素,经过or将3中标签所有提取出来
soup=tree.xpath('//td[@class="editor" or @class="tag"]')
(1)正则表达式是对字符串操做的一种逻辑公式,就是事先定义好的一些特定字符串、以及这些特定的字符串的组合,组成一个"规律字符串"买这个"规律字符串"用来表达对字符窜的一种过滤逻辑
(2)在爬虫的解析中,常常讲正则表达式与Dom选择器结合使用。正则表达死适用于字符串特征比较明显的状况,可是一样的正则表达式可能在HTML源码里出现屡次;而DOM选择器能够经过class一级id来精确找到DOM块,从而缩小查找范围
(3)正则表达式经常使用规则
\转义字符 例如\?
^字符串起始
$字符串结束
*匹配前面子表达式0次或者屡次
+匹配前面子表达式1次或者屡次
?匹配前面子表达式0次或者1次
{n,m}至少匹配n次,最多m次
.匹配除\n以外的单个字符串
(pattern)匹配并获取这个匹配,例如匹配ab(cd)e正则表达式只返回cd
[xyz]字符集合,匹配任意集合里的字符,[abc]既能匹配a,也能匹配b,也能够匹配c
[^xyz]排除集合中的字符,不能进行任何的匹配
\d匹配一个数字,等价[0-9]
(4)获取标签下的文本:'<th[^>]*>(.*?)</th>' //[^>]不包含>符号 *表示匹配0-n次 <th href ="....">匹配的限制条件 (.*?)中间这个是咱们须要取到的内容
(5)查找特定类别的链接,例如/wiki/不包含Category目录:
'<a href="/wiki"/(?!Category:)[^/>]*>(.*?)<'
(6)
eg:https://item.jd.com/27394669614.html
正则表达式:https://item.jd.com/\d{7}.html \d{7}重复匹配7次数字
(7)查找淘宝的商品信息,'或者"开始及结尾
'href=[\"\']{1}(//detail.taobao.com/item.html[^>\"\'\s]+?)"'
(8)贪婪模式以及非贪婪模式
?该字符紧跟在任何一个其余限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。
非贪婪模式尽量少的匹配所搜索的字符串,而默认的贪婪模式尽量多的匹配所搜索的字符串
一、Json=JavaScript Object Notation
2.相似于XML,可是比XML更小、更快、更易于解析。
3.使用json库处理json,编码与解码
import json obj={'one':1,'two':2,'three':[1,2,3]} encoded=json.dumps(obj) print(encoded)
#
{"one": 1, "two": 2, "three": [1, 2, 3]}#字典不保证元素的顺序的
(1)进入www.mafengwo.cn/robots.txt
(2)进入http://www.mafengwo.cn/sitemapIndex.xml
<sitemap>标签里面包含了全部的文章以及上一次的更新时间
(3)进入http://www.mafengwo.cn/article-0.xml
这里包含每篇文章更新的时间和频率以及优先级
(4)进入http://www.mafengwo.cn/i/11026746.html
<a class="pi" href="/yj/12141/1-0-2.html" title="第2页">2</a>
www.mafengwo.cn/yj/12121/1-0-2.html获取到第二页的页面
(5)有效率抓取特定内容
直接对.html进行抓取
对网站结构进行分析:
大多数网站都会存在明确的top-down的分类目录结构,咱们能够进入特定的目录进行抓取。对于www.mafengwo.cn这个网站,全部游记都位于www.mafengwo.cn/mdd下面,按照城市进行了分类,每一个城市的游记都位于城市的首页
城市的首页:/travel-scenic-spot/mafengwo/10774.html
游记的分页格式:/yj/10774/1-0-01.html
游记的页面:/i/3522264.html
1.动态网页的使用场景
(1)单页模式
单页模式是指不须要外部跳转的网页,例如我的设置中心常常就是单页模式
(2)页面交互多的场景
一部分网页上,有不少的用户交互接口,例如去哪儿买机票的选择网页,用户能够反复查询的参数
(3)内容以及模块丰富的网页
有一些的网页内容很丰富,一次加载完成对服务器压力很大,并且这种方式延时也会不好,用户每每也不会查看全部的内容
(4)对于爬虫:简单下载HTML已经不行了,必需要有一个WEB容器来运行HTML的脚本;
增长了爬取的时间;增长了计算机的CPI、内存的资源消耗;增长了爬取的不肯定性
(5)对于网站:为了配合搜索引擎的爬取,与搜索相关的信息会采用静态的方式;与搜索无关的信息,例如商品的价格、评论,仍然会采用动态的形式进行加载
2.抓取动态网页---分析:打打开网页后,直接右键点击,只保存HTML
3.Python Web引擎
(1)PyQt PySide:基于QT的python web引擎,须要图形界面的支持,须要安装大量的依赖,安装配置比较=复杂,尤为是安装图形系统,对于服务器来讲代价很大
(2)Selenium:一个自动化的Web测试工具,能够支持包括Firefox,chrom,PhatomJS,IE等多种浏览器的安装与测试
(3)PhantonJs:一个机遇Webkit的Headless的web引擎,支持JavaScript。相比于PyQt等方案,phamtoms能够部署在没有UI的服务器上
(4)PhantomJS+Selenium网页自动化的测试。
(5)Selenium安装:pip install selenium
(6)PhantomJS安装:
先安装nodejs yum install nodejs
为了加速,将NPM的源改成国内的淘宝
$npm install -g cnpm --registry=https://registry.npm.taobao.org
利用NPM的Package Manager安装 phantomjs
$npm -g install phantomjs-prebuilt
(7)使用PhantomJS来加载动态页面
#import webdriver from selenium from selenium import webdriver #load PhantomJS driver driver=webdriver.PhantomJS(service_args=['ignore-ssl-errors=true']) #set window size,better to fit the whole page in order to #avoid dynamically loading data driver.set_window_size(1280,2400)#optional设置网页大小 #data page content driver.get(cur_url)#下载网页 #use page_source to get html content content=driver.page_source#获得渲染完后的html网页
其中set_window_size
对于动态网页,有可能存在大量的数据是根据视图来进行加载的,PhantomJS容许客户端设置用来模拟渲染页面窗口的尺寸,这个尺寸若是设置比较小,咱们就不得不用javascript的scroll命令来模拟页面往下滑动的效果显示更多的内容,因此咱们设置一个相对大的窗口高度来渲染
driver.set_window_size(1280,2400) #optional
Selenium实现了一系列的相似于xpath选择器的方法,使得咱们能够直接调用driver.find_element()来进行元素的选择,可是这些都是基于python的实现,执行效率很是低,所以不建议使用built-in选择器,而是lxml或者re对driver.apgr-source(html文本进行操做)
find_element(self,by='id',value=None)
find_element_by_class_name(self,name)
find_element_by_id(self,id_)
find element_by_css_selector(self,css_selector)
一些有用的方法和属性 Selenium经过浏览驱动,支持大量的HTML以及JavaScript的操做,经常使用的能够包括 page_source:获取的当前页的html文本 title:HTML的title current_url:当前页的url get_cookie()&get_cookies():获取当前的cookie delete_cookie()&delete_all_coolies():删除全部的cookie add_cookie():添加一段cookie set_page_load_timeout():设置当前网页超时 execute_script():同步设置一段javascript命令 execute_async_script():异步执行javascript命令
(8)Close and Clear
Selenium经过内嵌的浏览器driver与浏览器进程进行通讯,所以在退出的时候必须调用driver.close()以及driver.quit()来退出PhantomJS,不然PhantomJS会一直运行在后台并占据系统资源。
(9)提取动态数据
1.加载的过程,根据网络环境的优劣,会存在一些延时,所以要屡次尝试提取,提取不到不意味着数据不存在或者网络出现错误
2.动态页面的元素,所用的id或者class常常不止一个,例如京东一件商品的"好评率",class包括了rate和percent-con两种,所以须要对两种状况进行尝试。
(10)网页内,href后面的连接能够有这三种:
href="http://career.taobao.com" http://是完整的URL,直接转跳
href="\\detail.taobao.com\iuslkjsd"
//是协议相关的绝对路径,若是如今是https://xxx则须要在//rtail.tabobao.com前面加上,https:前面的协议也能够是file://
href="\i\8444444.html" \是网站的相对路径,须要在前面指明当前的url协议以及domain
(11)HhantomJS配置
--ignore-ssl-errors=[true|false]
一些证书没有得到CA受权,浏览器会报出证书不受信任,这种状况须要用户交互操做,使用这个命令以后,能自动忽略这列错误
--load-images=[true|false] 将其设置为false,图片就不会进行加载,对于抓取的速度性能就会比较高
--disk-cache=[true|false] 将经过磁盘来进行缓存设置为true
--config=/path/to/config.json