2018.12.28
1.Urllib库
Python内置请求库
- urllib.request 请求模块
- urllib.error 异常处理模块
- urllib.parse url解析模块
- urllib.robotparser robots.txt解析模块
抓取网页 from urllib不可省模块,可以非常方便地抓取URL内容,
也就是发送一个GET请求到指定的页面,然后返回HTTP的响应:
from urllib import request
response=request.urlopen("https://www.douban.com")
print(response.read())
urlopen一般常用的有三个参数,它的参数如下:urllib.requeset.urlopen(url,data,timeout)data是访问url时要传送的数据,二三可以不传送。read()方法返回获取到的网页内容。
Requests 是用python语言编写的第三方库,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库。它比 urllib 更加方便,完全满足 HTTP 测试需求,多用于接口测试
http协议有六种请求方法:get、head、put、delete、post、option
Response属性
响应状态(200表示成功、301表示跳转 )、响应头(如内容类型、内容长度、服务器信息、设置cookie等)、响应体(最主要的部分,包含了请求资源的内容,如网页HTML、图片二进制数据等)
- r.status_code http请求的返回状态,200表示连接成功,404表示连接失败
- r.text http响应内容的字符串形式,url对应的页面内容
- r.encoding 从HTTP header中猜测的响应内容编码方式
- r.apparent_encoding 从内容分析出的响应内容的编码方式(备选编码方式)
- r.content HTTP响应内容的二进制形式
- r.headers http响应内容的头部内容
爬虫:请求网站并提取数据的自动化程序
爬虫基本流程
- 发起请求,通过http库想目标站点发起请求,即发送一个request,请求可以包含额外的headers等信息,等待服务器响应
- 获取响应内容,如果服务器能正常响应,会得到一个response,response的内容便是所要获取的页面内容,类型可能有HTML,json字符串,二进制数据等类型
- 解析内容,得到的可能是HTML,可以用正则表达式、网页解析库进行解析。可能是json,可以直接转为json对象解析,可能是二进制数据,可以做保存或者进一步的处理
- 保存数据
2019.1.7
lxml是python的一个解析库,支持HTML和XML的解析,支持XPath解析方式
XPath的选择功能十分强大,它提供了非常简明的路径选择表达式,另外,它还提供了超过100个内建函数,用于字符串、数值、时间的匹配以及节点、序列的处理等,几乎所有我们想要定位的节点,都可以用XPath来选择
XPath常用规则
/ 从当前节点选取直接子节点
// 从当前节点选取子孙节点 eg://book选取所有book子元素,不管他们在文档中位置
. 选取当前节点 .. 选取当前节点的父节点
@ 选取属性eg://@lang选取名为lang的所有属* 通配符,选择所有元素节点与元素名
@* 选取所有属性 [@attrib] 选取具有给定属性的所有元素
[@attrib='value'] 选取给定属性具有给定值的所有元素
[tag] 选取所有具有指定元素的直接子节点
[tag='text'] 选取所有具有指定元素并且文本内容是text节点
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。JSON中的数据类型:字符串、数值、BOOL、对象、数组
JSON最常用的格式是对象的 键值对。例如这样{"firstName": "Brett", "lastName": "McLaughlin"}
json.dumps 用于将 Python 对象编码成 JSON 字符串
json.loads 用于解码 JSON 数据。该函数返回 Python 字段的数据类型
urllib的request
模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应
Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试.
Scrapy使用方式
- 交互式 -scrapy shell url
- 创建项目 -scrapy startproject projname
- 创建Spider -scrapy genspider spidername "starturl"
- 运行爬虫 -scrapy crawl spidername
交互式
scrapy shell "www.baidu.com"
resonse对象 -xpath()最灵活最好用 -css() -extract()提取具体内容 -re()正则表达式提取方式
response.xpath('//div')提取所有的div
2019.1.11
Scrapy框架中分两类爬虫,Spider类和CrawlSpider类。
CrawlSpider是Spider的派生类,CrawlSpider是爬取那些具有一定规则网站的。常用的爬虫Spider类的设计原则是只爬取start_url列表中的网页,而CrawlSpider类定义了一些规则(rule)来提供跟进link的方便的机制,从爬取的网页中获取link并继续爬取的工作更适合。最常用的spider,用于抓取普通的网页。增加了两个成员:rules:定义了一些抓取规则,连接怎么跟踪、使用哪一个parse函数解析此连接。parse_start_url(response)解析初始URL的相应。
Item 对象是种简单的容器,保存了爬取到得数据
解析方式
- 直接处理
- Json解析
- 正则表达式
- BeautifulSoup
- PyQuery
- XPath
怎么保存数据
1.文本,纯文本、Json、Xml等
2.关系型数据库,如MySQL、Oracle、SQL Server等具有结构化表结构形式存储
3.非关系型数据库
4.二进制文件
正则表达式
re.match(parttern,string,flags)方法用于尝试从字符串的起始位置匹配一个正则表达式,如果匹配成功则返回一个match对象,如果没有匹配成功,就返回None。pattern指的是匹配的正则表达式,string指的是用于匹配的字符串,flags是标志位,用于控制正则表达式的匹配方式.
group(0)用于返回匹配的整个字符串,span()方法用于以元祖形式返回匹配的起始位置和结束位置
r'T[io]+m',中间的 [io]+,[io]表示匹配的字符可以是中括号中的任意一个i或o,而后面跟着的+号表示可以对[io]匹配一次或多次。所以只要满足这一条件的字符串都是可以被匹配的
"、'都可表示字符串"""可将单引号双引号表示出来,或者加\转义字符
列表 list=[1,2,3]
字典 键值对,占容量较大,效率比较快,str(a)-打印字典
元组,元组不能修改a=(1,2)元组中只包含一个元素时,需要在元素后面添加逗号,否则括号会被当作运算符使用:
集合(set)是一个无序的不重复元素序列。
如果你需要遍历数字序列,可以使用内置range()函数。它会生成数列for i in range(2,20,2)
函数
def 函数名(参数列表):
函数体
print的值不能直接调用
lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数
map() 会根据提供的函数对指定序列做映射,map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
pandas/numpy
https://www.jianshu.com/p/d9774cf1fea5