第13章 实战:原生爬虫

第13章所讲重点为:原生爬虫

13-1分析抓取目的确定抓取页面

# 13-1分析抓取目的确定抓取页面
# 13-2 整理爬虫常规思路

    爬虫前奏:
    明确目的
    找到数据对应的网页
    分析网页的结构找到数据所在的标签位置

    模拟HTTP请求,   向服务器发送这个请求,获取到服务区返回给我们的HTML
    用正则表达式提取我们需要的数据(名字,人气)
# 13-3 VSCode中调试代码
import re
from urllib import request  #通过Python内置的库来模仿HTTP请求获取要爬取的网页

class Spider():
    url = 'https://www.panda.tv/cate/lol'#保存要抓取的地址
    root_pattern = '
class="video-info">[\s\S]*?
' def __fetch_content(self):#获取网页的内容,实例方法需要加self r = request.urlopen(Spider.url)#通过request下面的方法来获取网页信息,并且将信息传递进来 htmls = r.read()#将网页内容读取出来 htmls = str(htmls,encoding = 'utf-8')#文本转换 return htmls def __analysis(self,htmls):#分析文本 root_html = re.findall(Spider.root_pattern,htmls) def go(self):#入口方法 htmls = self.__fetch_content() self.__analysis(htmls) spider = Spider() spider.go() # 13-4 HTML结构分析基本原则二条 就近原则 特定的标识符或者标签! # 13-4 HTML结构分析基本原则二条 尽量选择可以闭合的标签作为定位标签 # 13-6 正则分析HTML import re from urllib import request #通过Python内置的库来模仿HTTP请求获取要爬取的网页 import ssl ssl._create_default_https_context = ssl._create_unverified_context class Spider(): url = 'https://www.panda.tv/cate/lol'#保存要抓取的地址 root_pattern = '
([\s\S]*?)
'#注意用正则表达式分析我们所提取的内容 name_pattern = '([\s\S]*?)'#根据思维导图第二步,名字匹配 number_pattern = '([\s\S]*?)'#根据思维导图第二步,人数匹配 def __fetch_content(self):#获取网页的内容,实例方法需要加self r = request.urlopen(Spider.url)#通过request下面的方法来获取网页信息,并且将信息传递进来 htmls = r.read()#将网页内容读取出来 htmls = str(htmls,encoding = 'utf-8')#将字节码转换成文本方法 return htmls def __analysis(self,htmls):#定义一个实例方法。分析文本,进入网页分析页面信息 root_html = re.findall(Spider.root_pattern,htmls) anchors = []#定义一个anchors的列表 for html in root_html:#for循环遍历 name = re.findall(Spider.name_pattern,html) number = re.findall(Spider.number_pattern,html) anchor = {'name':name,'number':number}#打印成字典形式 anchors.append(anchor)#在列表中添加元素的方法 # print(root_html[0])#打印一个结果看看,进一步分析我们所需要的数据,如图5 # print(anchors[0]) return anchors def __refine(self,anchors):#爬虫里面最精炼的一个环节,精炼环节.去掉空格换行符 l = lambda anchor:{ 'name':anchor['name'][0].strip(), 'number':anchor['number'][0] }#lambda函数配合内置函数 return map(l,anchors) def __sort(self,anchors):#排序 anchors = sorted(anchors,key=self.__sort_seed,reverse = True)#使用sorted的注意事项,一定要指定key的值 return 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 __show(self,anchors):#展示打印结果 for rank in range(0,len(anchors)): # print(anchor['name'] + '-----' + anchor['number']) print('rank' + str(rank + 1) + ' : ' + anchors[rank]['name'] + ' ' + anchors[rank]['number']) def go(self):#入口方法。所有的方法都会经过go方法总控 htmls = self.__fetch_content() anchors = self.__analysis(htmls)#传入anchors anchors = list(self.__refine(anchors)) anchors = self.__sort(anchors) self.__show(anchors) spider = Spider() spider.go() # 总结如下: ''' beautifulsoup scrapy '''
image
image
image
image
image

打印效果如下:

image

在做爬虫的时候Python3中很有可能会出现如图1的情况:

image

解决办法如图2的红框部分,把红框上的代码添加上去以后问题即可解决

image

你可能感兴趣的:(第13章 实战:原生爬虫)