Python3 笔记 13 实战:原生爬虫

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库

个人博客:http://www.unconstraint.cn/

猜你喜欢

转载自blog.csdn.net/qq_36329973/article/details/81187233