爬虫库知识总结
注意事项:
1 对于爬虫的每一步都要考虑到可能出现的错误,增加代码的可靠性
2 爬虫需要分析后再写代码,保证网页在有一定的修改后依然能正确的运行
3 要增加代理保证爬虫不被限制
4 在有移动端的情况下,最好去模拟手机去爬取移动端
爬取步骤
1 获取网页内容:getHTMLText()
2 提取信息到合适的数据结构:fillUnivList()
3 利用数据结构展示内容:printUnivList()
爬虫模版
import requests
keyword="python"
headers = {
"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36",
}
try:
kv = {'wd': keyword}
r=requests.get('https://www.baidu.com/s',params=kv,headers=headers)
r.raise_for_status()
print(r.text)
except:
print("爬取失败")
Requests
构造一个请求
request(method,url,kwargs)
用get方法去请求
get(url,params,kwargs):
常用的参数与函数
params:url中额外的参数
kwargs:控制访问参数
headers:字典,http头信息
cookies:字典
auth:元组 http认证功能
timeout:单位秒
proxies:字典 设置代理,可增登录认证
pxs={'http':'[http://10.10.10.1:3214]'}
post():用post方法去请求
head():获取网页头信息
put():写数据
patch():局部修改
delete():删除
requests异常
ConnectionError:DSN查询失败,拒绝连接等
HTTPError:HTTP错误异常
URLRequired:url缺失
Timeout:请求超时
response属性
r.status_code:200成功 404(页面不存在) 500(服务器不存在)
r.text:相应的内容
r.encoding:从header中猜测的编码方式
r.apparent_encoding:从内容中分析出编码(已知要爬去的网页的编码格式,可不调用这个函数以此优化)
r.raise_for_status():如果不是200产生HTTPError错误
BeautifulSoup
-
soup.b获取子节点下第一个b标签 -
tag对象tag['class']获取标签的class属性值tag.attrs全部属性 -
NavigableStringtag.string如果tag里面只有内容没有其他子标签,可以这样获得内容 -
find_all( name , attrs , recursive , text , **kwargs )name标签名字attrs属性名字limit=3限制搜索的个数recursive如果只想搜索tag的直接子节点,可以使用参数recursive=False -
from bs4 import BeautifulSoupsoup=BeautifulSoup(open(index.html) -
demo=soup.text#获取节点内全部文本内容 -
[soup.b.parent.parent.name]#查看祖父节点名字 -
没有返回说明是空信息
-
soup.b.contents#查看这个节点的内容 返回列表类型 转义字符等也算节点内容len(soup.b.contents)#查看子节点的个数soup.b.contents[0]#看第一个子节点 -
soup.p.next_sibling#下一个平行标签soup.previous_next_sibling#上一个平行标签 -
soup.p.prettify()#给每一个标签加一个‘\n’
tag = soup.b #获取标签
tag['class'] #查看标签类名
tag.attrs #查看标签属性
tag['class'] = 'verybold'
tag['id'] = 1 #如果属性不存在。将创建一个属性
del tag['class']
del tag['id']
css_soup = BeautifulSoup('<p class="body strikeout"></p>')
css_soup.p['class']
for child in soup.body.children: #遍历子节点
print(child)
for child in soup.body.descendants: #遍历子孙节点
print(child)
for parent in soup.p.parents: #遍历p的全部上级标签
if parent is None:
print(prrent) #父标签不存在就不能打印了
else:
print([prrent.name])
for sibling in soup.p.next_siblings: #遍历p的全部前面标签
print(sibling)
for sibling in soup.p.previous_next_siblings: #遍历p的全部后面标签
print(sibling)
for link in soup.find_all('a'): #返回列表类型
print(link.get('href'))
soup.find_all() #查找a和b标签
soup.find_all(['a','b'],'course','asdasd') #查找a标签属性为course的标签
soup.find_all(id='box') #查找id=box的标签
divs=soup.findAll('div',{'class':'gl-i-wrap'})
divs=soup.findAll('div',class_='gl-i-wrap')

浙公网安备 33010602011771号