urllib、requests网络请求包的使用、正则、xpath、bs4的语法和使用

1.urllib

发起请求
url:设置目标url
data=None:默认为None,标识发起的是一个get请求,反之,不为None,表示发起的是一个post请求
timeout:设置请求的超时时间(s)
cafile=None,设置证书文件(一般不用)
capath=None,设置证书文件路径(一般不用)
context=None,一般设置为一个ssl的对象(ssl._create_unverified_context())
忽略未认证CA证书(如果出现了ssl证书错误)

文件读写模式:
r:打开一个文件,只有可读权限
rb:以二进制的形式打开一个文件,有可读权限
r+:打开一个文件,有读写权限
rb+:以二进制形式打开一个文件,有读写权限
w:打开一个文件,有写入的权限
wb:以二进制的形式打开一个文件,有写入权限
w+:打开一个文件,有读写权限
wb+:以二进制形式打开一个文件,有读写权限
a:打开一个文件,有追加的权限
ab:以二进制的形式打开一个文件,有追加权限
a+:打开一个文件,有读写权限
ab+:以二进制形式打开一个文件,有读写权限

获取响应的状态码:
XXXX.status
获取响应的响应头:
XXXX.getheaders()
获取某一个响应头参数
XXXX.getheader('参数名')
获取当前请求的url地址
XXXX.url
获取请求的reason(如果成功返回的是OK)
XXXX.reason
注意:response.read()只可以读取一次

headers={}:设置请求头,传递一个字段类型的参数

2.bs4

bs4(python独有简单便捷和高效)
环境安装:pip install lxml bs4用到lxml库,如果没有安装过lxml库的时候,需要安装一下

代码使用流程:
核心思想:可以将html文档可以转换成BeautifulSoup对象,调用该对象中的属性和方法进行

1.导包
	from bs4 import BeautifulSoup
2.创建BeautifulSoup对象
	a.本地
		Beautiful('open('本地的html文件')','lxml')
	b.网络
		Beautiful('网络请求到的页面数据','lxml')

属性和方法:
1.根据标签名查找
	soup.a 只能找到第一个符合要求的标签
2.获取属性
	soup.a.attrs  获取a所有的属性和属性值,返回一个字典
	soup.a.attrs['href'] 获取href属性
	soup.a['href'] 也可简写为这种形式
3.获取内容
	soup.a.string  /text()
	soup.a.text    //text()
	soup.a.get_text()  //text()
	如果标签还是标签,那么string获取到的结果为none,而其他两个,可以获取文本内容
4.find:找到第一个符合要求的标签
	soup.find('a') 找到第一个符合要求的
	soup.find('a',title='xxx')
	soup.find('a',alt='xxx')
	soup.find('a',class='xxx')
	soup.find('a',id='xxx')
5.find_All:找到所有符合要求的标签
	soup.find_All('a')
	soup.find_All(['a','b']) 找到所有的a和b标签
	soup.find_All('a',limit=2) 限制前两个
6.根据选择器选择指定的内容
	select:soup.select('#feng')
	常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
	层级选择器:
		div .dudu #lala .name  .xixi  下面好多级  div//img
		div > p > a > .lala  只能是下面一级  div/img
	select选择器返回永远是列表,需要通过下标提取指定对象


 params参数,字典类型,用来存放get请求url地址?号后面的查询参数
无论是get请求还是post请求最终返回的都是Request对象
        """
        :param method:(设置请求方式) method for the new :class:`Request` object.
        :param url: (请求的URL地址)URL for the new :class:`Request` object.
        :param params: (get请求要传递的参数)(optional) Dictionary or bytes to be sent in the query string for the :class:`Request`.
        :param data:(post请求传递的参数) (optional) Dictionary or list of tuples ``[(key, value)]`` (will be form-encoded), bytes, or file-like object to send in the body of the :class:`Request`.
        :param json: (post请求传递的参数,json数据)(optional) json data to send in the body of the :class:`Request`.
        :param headers:(请求头,'User-Agent'、'Referer'、'Cookies') (optional) Dictionary of HTTP Headers to send with the :class:`Request`.
        :param cookies: (设置请求的cookies)(optional) Dict or CookieJar object 
        :timeout: 设置请求的超时时间 
        :param allow_redirects:是否允许重定向 (optional) Boolean. Enable/disable GET/OPTIONS/POST/PUT/PATCH/DELETE/HEAD redirection. Defaults to ``True``.
        :type allow_redirects: bool
        :param proxies:(设置代理) (optional) Dictionary mapping protocol to the URL of the proxy.
        :param verify: (用来忽略CA证书(ssl))(optional) Eithe
        """

        数据持久化
            将数据保存到本地json文件(注意添加线程锁)
            json.dumps():将python数据类型转json字符串
            json.loads():将json字符串转为python数据类型

             枷锁:线程安全,防止多个线程同时修改一份资源
             threadLock.acquire()

        requests.delete()
        requests.put()
        requests.patch()

3.xpath

xpath
安装:pip install lxml
引用:from lxml import etree

创建etree对象进行指定数据解析
1.本地
	etree = etree.parse('本地路径')
	etree.xpath('xpath表达式')
2.网络
	etree = etree.HTML('网络请求到页面的数据')
	etree.xpath('xpath表达式')

常用的xpath表达式:
1.属性定位:
	找到class属性值为song的div标签
	//div[@class='song']
2.层级索引定位
	找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
	//div[@class='tang']/ul/li[2]/a
3.逻辑运算
	找到href属性值为空且class属性值为du的a标签
	//a[@href='' and @class='du']
4.模糊匹配
	/表示获取某个标签下的文本内容   //div[@class='song']/p[1]/text()
	//表示获取某个标签下的文本内容和所有子标签下的文本内容   //div[@class='tang']//text()
5.取属性
	//div[@class='tang']//li[2]/a/@href

4.request请求方式

安装:pip3 install requests
使用流程:
	1.指定url
	2.使用requests模块发起请求
	3.获取响应的二进制数据
	4.进行持久化存储

requests包括五中请求:get,post,ajax的get请求,ajax的post请求,综合

import requests
# 1、指定url
url = 'https://www.sogou.com/'
# 2、发起get请求:get方法会返回请求成功的相应对象
response = requests.get(url=url)
# 3、获取响应中的数据值:text可以获取响应对象中字符串形式的页面数据
page_data = response.text
print(page_data)
# 4、持久化操作
with open('./sougou.html','w',encoding='utf-8') as fp:
fp.write(page_data)

requests对象中其他重要属性:
	text可以获取响应对象中字符串形式的页面数据
	content获取的是response对象中二进制(byte)类型的页面数据
	response.status返回一个响应状态码
	response.headers返回响应头信息

自定义请求头信息:
	from fake_useragent import UserAgent
	定制请求头
	headers ={
		"User-Agent":UserAgent().random
	}

封装get请求参数:
	params = {
		"变量名":"参数"
	}


使用requests发起一个post请求
import requests
from fake_useragent import UserAgent
def login():
# 1、指定POST请求的URL
url = "https://accounts.douban.com/j/mobile/login/basic"
# 封装post请求的参数
data = {
"ck": "",
"name": "16619983290",
"password": "wwy123456",
"remember": "false",
"ticket": ""
}
headers = {
"User-Agent": UserAgent().random
}
# 2、发起POST请求
response = requests.post(url=url, data=data, headers=headers)
# 3、获取响应回来的信息
print(response.text)

5.正则

正则 
单字符匹配
. 除换行符之外的任意字符
\d 表示数字
\D 匹配非数字
\w 匹配单词字符[a-z,A-Z,0-9]
\W 匹配非单词字符
\s 匹配空白字符,空格,\n   \t....
\S 匹配非空白字符
^  匹配以...开头
$  匹配以...结尾
[0-9] => \d 匹配0-9

多字符匹配(贪婪匹配)
* 匹配*前面的字符任意次数
+ 匹配+前面的字符至少一次
?匹配?前面的字符0-1次
{n,m}匹配{n,m}前面的字符n-m次

多字符匹配(非贪婪匹配)
*?
+?
??

其他
()分组
|逻辑或
\转义字符

re模块下的方法
re.compile():构建正则表达式对象
re.match():从起始位开始匹配,单次匹配,如果匹配到结果立即返回,反之,返回None
re.search():在整个字符串中进行匹配,单次匹配,如果匹配到结果立即返回,反之,返回None
re.findall():匹配出整个字符串中,所有符合正则规则的结果,返回一个列表
re.finditer():匹配出整个字符串中,所有符合正则规则的结果,返回的是一个可迭代对象
re.sub():根据正则表达式进行字符串替换
re.split():根据正则表达式进行分割

举个栗子!!!
如何使用正则爬取图片


from urllib.request import urlopen


def getPageHtml(url):  #获取网页的源码
    obj = urlopen(url)  
    return obj.read()

def getPagepic(text):  
#从网页的源码中获取到图片的网址,返回的是一个列表,列表里面存储的是当前网页的所有图片的地址
    pattern ='<img class="BDE_Image" .*?src="(http://.*?\.jpg)".*?>'
    return re.findall(pattern,text.decode('utf-8'))


url = "http://tieba.baidu.com/p/5904388543"
text = getPageHtml(url)  
picurl = getPagepic(text)  
#对存有图片地址的列表进行一个遍历,依次对图片的网址打开进行一个获取图片。
for i,v in enumerate(picurl):
    with open("img/img%d.jpg" %(i+1),"wb") as f:
        content = getPageHtml(v)
        print("正在爬取第%d张图片" %(i+1))
        f.write(content)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值