Scrapy 基础

Posted on 2020-01-30 19:07  郑幸福  阅读(210)  评论(0编辑  收藏  举报
1.requests 安装:
-pip install requests
确认requests是否安装成功
-import requests
eg :
-import requests
r = requests.get("htpp://www.baidu.com")# 获取百度
r.status_code #状态码
返回值 :200 说明 请求成功
t.encoding = 'utf-8'
t.text #打印百度的html网页的代码
--
html 代码
--
2.get方法:
r =requests.get(url)
request.get(url,params=None, **kwargs)
url: 拟获取页面的url的链接,
params: url中的额外参数,字典或字节流格式,可选
** kwargs 可选的

3.Response 对象:
-属性:
r.status_code:http请求的返回状态,200表示链接成功, 404表示连接失败
t.text; http响应内容的字符串形式, 即, url对应的页面内容\
r.encoding:从http header中猜测的响应内容编码方式,
r.apparent_encoding: 从内容分析出的响应内容编码方式(备选编码方式)
r.content :http响应内容的二进制形式

4.requests库的异常:
requests.ConnectionError:网络连接错误异常,如DNS查询失败,拒绝链接等
requests.HTTPError:HTTP错误异常
requests.URLRequired:URL缺失异常
requests.TooManyRedirects:超过最大重定向次数,产生重定向异常
requests.ConnectTimeout:链接远程服务器超时异常
requests.Timeout:请求URL超时, 产生超时异常
r.raise_for_status():如果是200, 产生异常requests.HTTPError
-爬取网页的通用代码的框架:
import requests
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()#如果状态不是200, 引发HTTPError异常
r.encoding = r.apparent_encoding
return r.text
except:
return "产生异常"

if __name__=="__main__":
url="http://www.baidu.com"
print(getHTMLText(url))

requests库的head()方法:
r=requests.head("http://httpbin.org/get")
r.headers
requests库的post()方法:
payload={'key1':'value1', 'key2':'value2'}
r = requests.post("http://httpbin.org/post", data=payload)
print(r.text)

5.Requests 库的7个方法:
requests.request():构造一个请求,支撑以下各个方法的计出方法
requests.get():获取HTML网页的主要方法, 对应HTTP的GET
requests.head():获取HTML网页头信息的方法, 对应于HTTP的HEAD
requests.post():向html网页提交post请求的方法, 对应HTTP的POST
requests.put():向html网页提交PUT请求的方法, 对应HTTP的PUT
requests.patch():向html网页提交局部修改请求, 对应HTTP的PATCH
requests.delete():向html页面提交删除请求,对应于HTTP的DELETE

requests.request(method, url, **kwargs)
-method:请求方式, 对应get/post/put等7种
-url:拟获取网页的url链接
**kwargs:控制访问的参数,共13个

-13个参数:
--params:字典或者序列, 作为参增加到url中
kv={'key1':'value1', 'key2':'value2'}
r = requests.request("GET", 'http://python123.io/ws', params=kv)
print(r.url)
返回值
----
>>>https://python123.io/we?key1=value1&key2=value2
-----
--data:字典, 字节序列或文件对象, 作为Request的内容
kv={'key1':'value1', 'key2':'value2'}
r = requests.request("GET", 'http://python123.io/ws', data=kv)
body='主体内容'
r = requests.request("POST", 'http://python123.io/ws', data=body)
--json:json格式数据,作为Request的内容
kv = {'key1':'value1'}
r=requests.request('POST', 'http://python123.io/ws', json=kv)
--headers:字典, http定制头
hd={'user-agent':'Chrome/10'}
r=requests.request('POST', 'http://python123.io/ws', headers=hd)
--cookies:字典或CookieJar, Request中的cookie
--auth:元组, 支持HTTP认证功能
--file:字典类型,传输文件
fs = {'file':open('data.xls','rb')}
r = requests.request('POST', 'http://python123.io/ws', file=fs)
--timeout:设定超时时间,秒为单位
r = requests.request('GET', 'http://python123.io/ws',timeout=10)
--proxies:字典类型, 设定访问代理服务器, 可以增加登录认证
pxs = {'http':'http://user:pass@10.10.10.1:1234'
'https://10.10.10.1:4321'
}
r=requests.request('GET','http://www.baidu.com', proxies=pxs)
--allow_redirects:True/False, 默认为True, 重定向开关
--stream:True/False, 默认为True, 获取内容立即下载开关
--verify:True/False, 默认为True, 认证SSL证书开关
--cert:本地SSL证书路径

Robots协议:
Robots Exclusion Standard 网络爬虫排除标准
作用:网站告知网络爬虫那些页面可以抓取, 那些不行
形式:在网站的根目录下
--Robots协议的使用:
网络爬虫:自动或人工识别robots.txt, 在进行内容爬取
--约束性:Robots协议是建议但非约束性, 网络爬虫可以不遵守, 但是存在法律风险

---图片下载与保存:

import requests
r=requests.get(url)
with open(path, 'wb') as f:
f.write(r.content)
=================================
IP地址的查询:------
-----------------------
import requests
url = 'http://m.ip138.com/ip.asp?ip='
try:
r = requests.get(url+'202.204.80.112')
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text)
except:
print('爬取失败!')

===============
-------------------------
beautifulsoup4的安装:
-pip install beautifulsoup4
BeautifulSoup测试:
-----------------------
import requests
r=requests.get('http://python123.io/ws/demo.html')
print(r.text)
demo=r.text
from bs import BeautifulSoup
soup = BeautifulSoup(demo, 'html.parser')
print(soup.prettify())
=======================
6. BeautifulSoup 库的理解
=======================
--解析,遍历,维护,"标签树"的功能库
==Beautiful Soup 类的基本元素
--Tag:标签, 最基本的信息组织单元, 分别用<>和</>标明开头和结尾
--Name:标签的名字,<p>……</p>的名字是'p', 格式:<tag>.name
--Attributes:标签的属性, 字典形式组织, 格式:<tag>.attrs
--NavigableString:标签内非常属性字符串,<>…</>中字符串吗格式:<tag>.string
--Comment:标签内字符串的注释部分, 一种特殊的Comment类型
==标签树的下行遍历
.content:子节点的列表, 将<tag>所有儿子节点存入列表
.children:子节点的迭代类型,与.content类似, 用于循环遍历儿子节点
.descendants:子孙节点的迭代类型,包含所有的子孙节点,用于循环遍历
==标签树的上行遍历
.parent:节点的父亲标签
.parents:节点先辈标签的迭代类型,用于循环遍历先辈节点
==标签树的平行遍历
.next_sibling:返回按照HTML文本顺序的下一个平行节点标签
.previous_sibling:返回按照HTML文本顺序的上一个平行节点标签
.next_siblings:迭代类型, 返回按照HTML文本顺序的后续所有平行的节点
.previous_siblings:迭代类型,返回按照HTML文本顺序的前续所有平行节点标签

========
.prettify()

========

--信息标记的三种形式:
--信息的标记:
--标记后的信息可形成信息组织结构,增加信息维度
--标记后的信息可用于通信、存储或展示
--标记的结构与信息一样具有重要的价值,
--标记的信息更利于程序的理解胡运用
=====
HTML知识: …………
Xml 信息标记语言
json:有类型的键值对 (key:value)
YAML:无类型的键值对 (没有双引号"")
--"|" 表达整块数据 # 表注释

=====
信息提取的一般方法:
方法一:
完整解析信息的标记形式,在提取关键信息
XML JOSN YAML
需要标记解析器, 例如:bs4的标签树的遍历
方法二:
五十标记形式, 直接搜索关键信息
搜索
---对信息的文本查找函数即可,
优点:提取过程简洁,速度较快
缺点,提取结果准确性与信息内容相关
========
代码: =
========================================================
import requests
r=requests.get('http://python123.io/ws/demo.html')
print(r.text)
demo=r.text
from bs4 import BeautifulSoup
soup = BeautifulSoup(demo, "hrml.parser")
for link in soup.find_all('a'):
print(link.get('href'))
=========================================================
-- <>.find_all(name, attrs,recursive, string, **kwargs)
返回一个列表类型, 存储查找结果,
--name:对标签名称的检索字符串。
--attrs:对标签属性值的检索字符串,可标注属性检索。
--recursive:是否对子孙全部检索,默认True
--string:<>…</>中字符串区域的检索字符串

=========================================================
url:http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html
功能描述:
-输入:大学的URL链接
-输出:大学排名信息的屏幕输出(排名, 大学名称, 总分)
-技术路线:requests-bs4
-定向爬虫:仅对输入url进行爬取, 不扩展爬取
程序的结构设计:
-步骤1:从网络上获取大学排名网页内容
-- getHTMLText()
-步骤2:提取网页内容中信息到合适的数据结构
-- fillUnivList()
-步骤3:利用数据结构战术输出结果
--:printUnivList()

代码:
=========================================================================
import requests
import bs4
from bs4 import BeautifulSoup

def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""

def fillUnivList(ulist, html):
soup = BeautifulSoup(html, "html.parser")
for tr in soup.find('tbody').children:
if isinstance(tr, bs4.element.Tag):
tds = tr('td')
ulist.append([tds[0].string, tds[1].string, tds[3].string])

def printUnivList(ulist, num):
print("{:^10}\t{:^6}\t{:^10}".format("排名", "学校", "评分"))
for i in range(num):
u = ulist[i]
print("{:^10}\t{:^6}\t{:^10}".format(u[0], u[1], u[2]))

def main():
uinfo = []
url = "http://www.zuihaodaxue.cn/zuihaodaxuepaiming2016.html"
html = getHTMLText(url)
fillUnivList(uinfo, html)
printUnivList(uinfo, 20)

if __name__ == '__main__':
main()
=========================================================================
中文对齐问题的解决:
采用中文字符的空格填充 chr(12288)
========================================
def printUnivList(ulist, num):
tplt = "{0:^10}\t{1:{3}^10}\t{2:^10}"
print(tplt.format("排名", "学校", "总分", chr(12288)))
for i in range(num):
u = ulist[i]
print(tplt.format(u[0], u[1], u[2], chr(12288) ))
=========================================================
7.正则表达式:
regular expresson regex RE
正则表达式是用来简洁表达一组字符串的表达式
-通过的字符串表达框架
-简洁表达一组字符串的表达式
-针对字符串表达“简洁”和“特征”思想的工具
-判断某字符串的特征归属

正则表达式在文本处理中十分常用
-表达文本类型的特征(病毒、入侵等)
-同时查找或替换一组字符串
-匹配字符串的全部或部分

正则表达式的使用
-编译:将符合正则表达式语法的字符串转换成正则表达式特征

正则表达式的语法:
正则表达式语由字符和操作符构成

RE库的介绍:
RE库是Python的标准库, 主要用于字符串匹配。
调用方式: import re

正则表达式的表示类型
-raw string类型(原生字符串类型--- 不包含转义符的字符串)
* re库采用raw string类型表示正则表达式, 表示为“r.text”
* string 类型, 更繁琐
RE库主要的功能函数:
-re.search():在一个字符串中搜索匹配正则表达式的第一个位置, 返回match对象
*re.search(pattern, string, flags=0)
-pattern: 正则表达式的字符串或原生字符串表示
-string:待匹配的字符串
-flags:正则表达式使用时的控制标记
-re.match():从一个字符串的开始位置起匹配正则表达式, 返回match对象
*re.match(pattern, string, flags=0)
-pattern: 正则表达式的字符串或原生字符串表示
-string:待匹配的字符串
-flags:正则表达式使用时的控制标记
-re.findall():搜索字符串, 以列表类型返回全部能匹配的子串
*re.findall(pattern, string, flags=0)
-pattern: 正则表达式的字符串或原生字符串表示
-string:待匹配的字符串
-flags:正则表达式使用时的控制标记
-re.split():将一个字符串按照正则表达式匹配结果进行分割, 返回列表类型
*re.split(pattern, string,maxslplit=0, flags=0)
-pattern: 正则表达式的字符串或原生字符串表示
-string:待匹配的字符串
-maxslplit:最大分割数, 剩余部分作为最后一个元素输出
-flags:正则表达式使用时的控制标记
-re.finditer():搜索字符串, 返回一个匹配结果的迭代类型,每个迭代元素是match对象
*re.finditer(pattern, string, flags=0)
-pattern: 正则表达式的字符串或原生字符串表示
-string:待匹配的字符串
-flags:正则表达式使用时的控制标记
-re.sub():在一个字符串中替换所有匹配正则表达式的字串, 返回替换后的字符串
*re.sub(pattern, replstring, coount=0,flags=0)
-pattern: 正则表达式的字符串或原生字符串表示
-repl:替换匹配字符串的字符串
-string:待匹配的字符串
-count:匹配的最大替换次数
-flags:正则表达式使用时的控制标记
=================================================================
======淘宝商品比价定向爬虫 示例编写
=================================================================
功能描述:
*目标:获取淘宝搜索页面的信息,提取其中的商品名称和价格。
*理解:淘宝的搜索接口。
-翻页的处理:
*定向爬虫可行性
robots.txt
程序的结构设计
步骤1:提交商品搜索的请求,循环获取页面。
步骤2:对于每个页面, 提取商品名称和价格信息
步骤3:将信息输出到屏幕上