python学习笔记-爬虫基础知识
一、爬虫介绍
1、场景分类
定向 指爬取指定网站
非定向 指从所有网站爬取
2、下载页面
常用的开源框架,requests&beautisoup
#1.requests response=requests.get('http://') response.text #2.beautisoup模块 soup=BeautiSoup(response.text,parser="html.parser") target=soup.find(id='') print(target)
3、示例,获取汽车新闻
import requests from bs4 import BeautifulSoup response=requests.get(url='http://www.autohome.com.cn/news/') response.encoding=response.apparent_encoding soup=BeautifulSoup(response.text,features='html.parser') target=soup.find(id='auto-channel-lazyload-article') li_list=target.find_all('li') for i in li_list: a=i.find('a') if a: print(a.attrs.get('href')) txt=a.find('h3') print(txt)
二、requsts和beautifulsoup
示例:爬取并下载图片
import requests from bs4 import BeautifulSoup response=requests.get(url='http://www.autohome.com.cn/news/') response.encoding=response.apparent_encoding #使用自动获取的编码 soup=BeautifulSoup(response.text,features='html.parser') #自带的html.parser. target=soup.find(id='auto-channel-lazyload-article') li_list=target.find_all('li') for i in li_list: a=i.find('a') if a: print(a.attrs.get('href')) txt=a.find('h3').text print(txt) img_url=a.find('img').attrs.get('src') print(img_url) img_response=requests.get(url=img_url) import uuid file_name=str(uuid.uuid4())+'.jpg' with open(file_name,'wb') as f: f.write(img_response.content)
1、requests基本用法
response=requests.get('url')
response.text
response.content
response.encoding
response.apparent_encoding
response.status_code
2、beautifulsoup基本用法
soup=beautifulsoup('<html>...</html>',features='html.parser') 得到的是一个特殊对象
v1=soup.find('div') 得到的是一个对象
v1=soup.find(id='il') 通过id找指定元素
v1=soup.find('div',id='il')
v2=soup.find_all('div') 返回的是一个列表
v2=soup.find_all(id='il')
v2=soup.find_all('div',id='il')
obj=v1
obj.text 标签对象的文本
obj.attrs 标签对象的属性
3、示例:略
登录获取cookie的方法
response=requests.post(url,data=post_dict)
print(response.text)
cookie_dict=response.cookies.get_dict()
print(cookie_dict)
三、模块的详细介绍
1、request详细用法
支持的方法
requests.get
requests.post
requests.put
requests.delete
requests.request(
'get'
)
可传参数
requests.request可传以下参数
method:
url:
params: 在url传递的数据
data: 在请求体中传递的数据,可以传字典,字符串,文件对象:如
data={'k1':'v1','k2':'v2'}
data='user=steven&pwd=123'
json: 参数是字典里面嵌套字典,不能在data里传递,只能用json
#json参数在请求体里格式 "{'user':'steven','pwd':'123'}"
headers: 请求头
Referer: 记录的上一次访问的网站
User-Agent:浏览器标识
cookies:
file:
requests.post(
url='xxx',
files={
'f1':open('s1.py','rb'), #发送文件
'f2':('aaa.py',open('s1.py','rb')) #发送文件,定制文件名
})
auth: 基本认证,(在headers中加入加密的用户名和密码),一般用得少这种简单加密的
timeout: 请求和响应的超时时间
allow_redirects: 是否允许重定向
proxies: 代理
proxys={
'http':'http://4.19.128.5:8099'
}
stream: 流
cert: 证书文件
verify: 是否忽略证书,False忽略证书
其他方法:
session=requests.session() #这里的session,用于保存客户端历史访问信息
理解:相当于把一次请求的获取的cookie放在全集变量,再访问又放到全局变量,可以自动帮助管理cookie,发请求不用带cookie了
2、BeautifulSoup详细用法
找到标签
soup=BeautifulSoup(html_doc,features='lxml')
tag=soup.find('a')
标签对象方法
name 标签名
attr 标签的属性(格式是字典)
attrs=tag.attrs #获取属性,是字典
tag.attrs={'ik':123} #可以修改获取到的属性
attrs['k2']=235
del attrs['k2']
children
tags=soup.find('body').children #子标签,可迭代对象里有换行等字符串。
#只找标签时,判断type是不是bs4.element.Tag对象
descendants #找所有后代标签
clear #将标签的所有子标签删除(保留标签名)
decompose #递归删除所有子标签(不保留标签名)
extract #递归删除所有的标签,并获取删除的标签
decode #转换为字符串(含当前标签),decode_contents(不含当前标签)
encode #转换为字节(含当前标签),encode_contents(不含当前标签)
find #获取匹配到的第一个标签
tag=soup.find(name='a',attrs={'class':True},recursive=True,text='lacie') #通过多个条件查找,recursive表示递归
tag=soup.find(name='a',class_='sister',recursive=True,text='lacie') #class是关键字,加_
find_all
v=soup.find_all(href=['link1','link2']) #列表多个条件时,是或的关系
#find_all 支持正则
rep=re.compile('sister.*')
v=soup.find_all(class_=rep)
print(v)
has_attr #检查是否具有该属性,tag.has_attr("id")
get_text #获取标签内部文本内容,tag.get_text()
get #获取标签的某个属性,tag.get('id')
index #检查标签在某标签的索引位置
is_empty_element #是否是空标签或者自闭合标签,br,hr,input,img,meta,space,link,frame,base
关联标签
(next,next_element,next_elements,next_sibling,next_siblings,previous)
查找关联标签(find_next,...)
select 按css,js选择器的方式查找
#举例 soup.select("body > a") soup.select("#link1 +.sister") soup.select(".sister") soup.select("[class~=sister]") soup.select("#link1") soup.select("a#link2") soup.select("a[href]")
string 标签内容,tag.string='new content'
tag.stripped_strings #递归内部获取所有标签的文本
append #在当前标签内部追加一个标签
insert #指定位置插入一个标签
insert_after,insert_before
replace_with #在当前标签替换为指定标签
wrap #将标签包裹起来
unwrap