Python⼤数据分析之⽹络爬⾍⼀、字符串处理
⼆、正则表达式
\d匹配⼀个数字,\D匹配⼀个⾮数字,\w匹配⼀个字母或数字,.可以匹配任意⼀个字符,*表⽰任意字符,+表⽰⾄少⼀个字符表⽰0个或1个字符,{n}表⽰n个字符,⽤{n,m}表⽰n~m个字符。
(1)\d{3} 表⽰匹配3个数字
(2)\s+  表⽰⾄少匹配⼀个空格,\S 表⽰匹配任何⾮空⽩字符
[\s\S]* 可以包括换⾏符在内的任意字符
(3)\d{3,8}表⽰匹配3~8个数字
(4)[0-9a-zA-Z\_] 匹配⼀个数字、字母或者下划线
(5)A|B 匹配A或B
(6)^\d 表⽰匹配以数字开头
(7)\d$表⽰匹配以数字结尾
(8)match对象上⽤group()提取⼦串,group(0)是原始字符串,group(1)表⽰第⼀个⼦串……
>>> m.groups()
('010', '12345')
(9)正则匹配默认是贪婪匹配,加1个?表⽰采⽤⾮贪婪匹配
(10)如果⼀个正则表达式要重复使⽤,出于效率的考虑,可以预编译该正则表达式,接下来重复使⽤时就不需要编译了,直接匹配即可。
三、编码处理
a="我叫胡胡"
str_de('gb2312')  #将str转换为gb2312编码
str_utf8=str_gb2312.decode('gb2312').encode('utf-8')  #先解码在编码成utf-8
利⽤第三⽅库chardet判断编码格式
import chardet
det=chardet.detect(a)
四、获取⽹页源码
import requests
('www.nuc.edu')
print(type(content))
五、从源码中提取信息
beautifulsoup可以从HTML或XML⽂件中提取数据,主要功能就是从⽹页抓取数据。
⾸先安装该库:pip install beautifulsoup4,还要安装html解释器:pip install lxml,接上⾯的代码。
from bs4 import BeautifulSoup
soup=BeautifulSoup(content,'lxml')
print(soup.prettify())  #按html格式打印内容
#从⽂档中到所有<a>标签的链接
for a in soup.find_all('a'):
print('attrs: ',a.attrs)  #取a标签的属性
print('string: ',a.string) #取a标签的字符串
print('---------------')
# attrs参数定义⼀个字典参数来搜索包含特殊属性的tag
for tag in soup.find_all(attrs={'class':'menu-link','href':'#'}):
print('tag: ',tag.name)
print('attrs: ',tag.attrs)
print('string: ',tag.string)
print('---------------')
#出包含内容为教育部的标签
for tag in soup.find_all(name='a',text='教育部'):
print('tag: ',tag.name)
print('attrs: ',tag.attrs)
print('string: ',tag.string)
print('---------------')
import re
for tag in soup.find_all(attrs={'class':repile(r'\w{1,5}-\w{1,5}')}): print(tag)
print('---------------')
六、数据存储
(1)保存到csv⽂件
csv="""id,name,score
l,xiaohua,23
2,xiaoming,67
3,xiaogang,89"""
with open(r"d:/1.csv",'w') as f:
f.write(csv)
(2)保存到数据库
python正则表达式判断
七、数据挖掘
爬取⾖瓣电影top250数据。
import requests
from bs4 import BeautifulSoup
import re
#获取⽹页源码,⽣成soup对象
def getSoup(url,headers):
res = (url,headers=headers)
return ,'lxml')
#解析数据
def getData(soup):
data=[]
ol=soup.find('ol',attrs={'class':'grid_view'})
for li in ol.find_all('li'):
tep=[]
titles=[]
for span in li.find_all('span'):
if span.has_attr('class'):
if span.attrs['class'][0]=='title':
titles.append(span.string.strip())  #获取电影名
elif span.attrs['class'][0]=='rating_num':
tep.append(span.string.strip())    #获取评分
elif span.attrs['class'][0]=='inq':
tep.append(span.string.strip())    #获取评论
tep.insert(0,titles)
data.append(tep)
print(tep)
print("-------------")
print(data)
print("=============")
return data
#获取下⼀页链接
def nextUrl(soup):
a=soup.find('a',text=repile('^后页'))
if a:
return a.attrs['href']
else:
return None
if__name__ == '__main__':
headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36"}    url="movie.douban/top250"
soup=getSoup(url,headers)
data=getData(soup)
print(data)
nt=nextUrl(soup)
while nt:
soup=getSoup(url+nt,headers)
print(getData(soup))
nt=nextUrl(soup)