13-1 分析抓取目的确定抓取页面
爬取熊猫TV某个分类下面主播的人气排行 分析网站结构
13-2 整理爬虫常规思路
F12查看HTML信息,Ctrl+Shift+C鼠标选取后找到对应的HTML。 文本分析并提取信息——正则表达式。
前奏: 1、明确目的 2、找到数据对应网页 3、分析网页的结构,找到数据所在标签的位置 执行: 4、模拟HTTP请求,向服务器发送请求,获取到服务器返回给我们的HTML 5、用正则表达式提取我们要的数据 ......
13-3 VSCode中调试代码
断点调试:F5启动,F10单步,F5跳断点,F11进内部
13-4 HTML结构分析基本原则二条
寻找到标签、标识符,使之能够定位要抓取的信息。 1、尽量选取具有唯一性的标签 2、尽量选取最接近于数据的标签
13-5 数据提取层级分析及原则三
可以把两个数据看成是一组数据并再次寻找标签。 尽量选取可以闭合的标签(父级标签),并包裹其需要的数据。
htmls->video-info->video-nickname/video-number->提取数据
13-6 正则分析HTML
把中间内容用圆括号括起来,用组来去掉两边的定界字符。 root_pattern = '<div class="video-info">([\s\S]*?)</div>'
13-7 正则分析获取名字和人数
name_pattern = '</i>([\s\S]*?)</span>' number_pattern = '<span class="video-number">([\s\S]*?)</span>'
13-8 数据精炼
去除字符串中的空格等:strip()
13-9 sorted 排序
def __sort_seed(self,anchor): r = re.findall('\d*',anchor['number']) #提取数字 number = float(r[0]) if '万' in anchor['number']: #处理'万' number *= 10000 return number
def __sort(self,anchors): anchors = sorted(anchors,key = self.__sort_seed,reverse = True) #key确定比较对象 #sorted()默认升序排列,reverse = True 降序 #不能用str排序,要用int,并且要处理'万' return anchors
13-10 案例总结
Beautiful Soup Scrapy
ctrl+shift+O:查找函数名 ''' This is a spider '''
from urllib import request import re
class Spider(): ''' This is a spider class ''' url = 'https://www.panda.tv/cate/lol' root_pattern = '<div class="video-info">([\s\S]*?)</div>' #注意单双引号 #[\w\W] [\s\S] . 匹配所有字符 #* 匹配0次或者无限多次 #? 非贪婪模式,匹配到第一个遇到的</div> name_pattern = '</i>([\s\S]*?)</span>' number_pattern = '<span class="video-number">([\s\S]*?)</span>' def __fetch_content(self): ''' 私有方法,获取网页内容 ''' r = request.urlopen(Spider.url) htmls = r.read() htmls = str(htmls,encoding = 'utf-8')
return htmls
def __analysis(self,htmls): ''' 正则表达式来提取数据 ''' root_html = re.findall(Spider.root_pattern,htmls) anchors = []
for html in root_html: name = re.findall(Spider.name_pattern,html) number = re.findall(Spider.number_pattern,html) anchor = {'name':name,'number':number} anchors.append(anchor) return anchors
def __refine(self,anchors): l = lambda anchor:{ 'name':anchor['name'][0].strip(), 'number':anchor['number'][0] #列表转化为单一的字符串 } return map(l,anchors)
def __sort_seed(self,anchor): r = re.findall('\d*',anchor['number']) #提取数字 number = float(r[0]) if '万' in anchor['number']: #处理'万' number *= 10000
return number
def __sort(self,anchors): ''' key确定比较对象 sorted()默认升序排列,reverse = True 降序 不能用str排序,要用int,并且要处理'万' ''' anchors = sorted(anchors,key = self.__sort_seed,reverse = True) return anchors
def __show(self,anchors): for rank in range(0,len(anchors)): print('rank ' + str(rank + 1) + ':' + ' ' + anchors[rank]['name'] + '————' + anchors[rank]['number'])
def go(self): #Spider的入口方法 htmls = self.__fetch_content() anchors = self.__analysis(htmls) anchors = list(self.__refine(anchors)) anchors = self.__sort(anchors) self.__show(anchors)
spider = Spider() spider.go()
ip被封寻找代理ip库
|