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_gb2312=a.encode('gb2312')  #将str转换为gb2312编码

str_utf8=str_gb2312.decode('gb2312').encode('utf-8')  #先解码在编码成utf-8

利用第三方库chardet判断编码格式

import chardet

det=chardet.detect(a)

四、获取网页源码

import requests
res=requests.get('http://www.nuc.edu.cn')
content=res.text
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':re.compile(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)保存到数据库

https://www.cnblogs.com/xiaohuhu/p/9387627.html 

七、数据挖掘

爬取豆瓣电影top250数据。

import requests
from bs4 import BeautifulSoup
import re

#获取网页源码,生成soup对象
def getSoup(url,headers):
    res = requests.get(url,headers=headers) 
    return BeautifulSoup(res.text,'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=re.compile('^后页'))
    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="https://movie.douban.com/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)
posted @ 2019-12-10 11:21  最萌小胡胡  阅读(1042)  评论(1编辑  收藏  举报