一、爬取目标:
爬虫的爬取网址:斗鱼直播_英雄联盟
抓取三份数据:1 直播标题 title 2 主播名 name 3主播人气 number
二、网页分析
右键单击 审查元素/检查,或者快捷键F12 ,可以看到下面网页的右边部分,同时找到了title name number的对应部分,网页分析完毕。
三、三种数据爬取方法分析对比
1 request库:请求HTTP网址 + beautifulsoup库之select函数:抓取数据。
request库请求HTTP网址,获取网址的标签信息。
class Spider():
url='https://www.douyu.com/g_LOL'
def _fetch_content(self):
headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36'}
#添加头信息 防止反爬虫文件识别
r=requests.get(Spider.url,headers=headers)
htmls=r.text
return htmls
获取每位主播的title、name、number信息。
def _analysis(self,htmls): #分析字符串文本
soup=BeautifulSoup(htmls,'html.parser')
all_articles=soup.select("#listAll > div.layout-Module-container.layout-Cover.ListContent > ul > li")
anchors=[]
for article in all_articles:
title=article.select("div > a.DyListCover-wrap > div.DyListCover-content > div:nth-child(1) > h3")[0].get_text()
name=article.select("div > a.DyListCover-wrap > div.DyListCover-content > div:nth-child(2) > h2")[0].get_text()
number=article.select("div > a.DyListCover-wrap > div.DyListCover-content > div:nth-child(2) > span")[0].get_text()
anchor={'title':title,'name':name,'number':number}
anchors.append(anchor)
return anchors
根据主播人气进行降序排列;针对人气中以“万”单位的人气值,sortseed函数处理成整数形式。
def _sort(self,anchors):
anchors=sorted(anchors,key=self._sortseed,reverse=True) #sorted()列表中元素的排序 key可传输函数 实现自定义类型的排序 返回某列参数
return anchors
def _sortseed(self,anchor):
r=re.findall('\d*',anchor['number']) #\d匹配数字
number=float(r[0]) #r为列表,取第一个元素
if '万' in anchor['number']:
number=number*10000
return number
总控方法:分别驱动每一个函数有序运行。
def go(self): #总控方法
htmls=self._fetch_content()
anchors=self._analysis(htmls)
#anchors=self._refine(anchors)
anchors=self._sort(anchors)
df=pd.DataFrame(anchors)
df.to_csv("results.csv",encoding='utf_8_sig', index=False)
运行结果如下,数据并导入csv文件。
2 urllib库:请求HTTP网址+re正则表达式:抓取数据。
request库请求HTTP网址,获取网址的标签信息。
class Spider():
url='https://www.douyu.com/g_dance'
root_pattern='div class="DyListCover-info"><span class="DyListCover-hot is-template">([\S\s]*?)</div>'
name_pattern='xlink:href="#icon-user_c95acf8"></use></svg>([\s\S]*?)</h2>'
number_pattern='xlink:href="#icon-hot_8a57f0b"></use></svg>([\s\S]*?)</span><h2'
def _fetch_content(self):
r=request.urlopen(Spider.url)
#bytes
htmls=r.read()
buff = BytesIO(htmls)
f = gzip.GzipFile(fileobj=buff)
htmls = f.read().decode('utf-8')
return htmls
获取每位主播的title、name、number信息。
def _analysis(self,htmls):
root_html=re.findall(Spider.root_pattern,htmls)
#print(root_html[1:5])
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
根据主播人气进行降序排列;针对人气中以“万”单位的人气值,sortseed函数处理成整数形式。
def _sort(self,anchors):
anchors=sorted(anchors,key=self._sortseed,reverse=True) #sorted()列表中元素的排序 key可传输函数 实现自定义类型的排序 返回某列参数
return anchors
def _sortseed(self,anchor):
r=re.findall('\d*',anchor['number']) #\d匹配数字
number=float(r[0]) #r为列表,取第一个元素
if '万' in anchor['number']:
number=number*10000
return number
总控方法:分别驱动每一个函数有序运行,同时导出至CSV文件,数据一致。
def go(self): #总控方法
htmls=self._fetch_content()
anchors=self._analysis(htmls)
anchors=self._sort(anchors)
df=pd.DataFrame(anchors)
df.to_csv("results.csv",encoding='utf_8_sig', index=False)
3 request库:请求HTTP网址+beautifulsoup之find函数。
此方法与第一个方法类似,由于find的函数的attrs部分需要自己根据数据的定位逐个找寻,十分麻烦!同时在尝试了几次后代码时钟放错及其浪费时间,因此放弃了第三种方法。
四、总结
urllib+正则表达式:可以抓取数据,但是效率较底下,每次抓取数据需要自己按照标签信息逐条填写正则表达式的str部分。
request库+beautifulsoup的select函数:效率最高,抓取效果也很好,个人十分推荐!!!
request库+beautifulsoup的find函数:效率低下,抓取数据的准确率不高,取决于网页标签的数据分布类型,个人不太推荐!
结语:
本次的信息抓取完毕,同时笔者的编程能力不是很好,欢迎志同道合的朋友一起学习进步。
同时上述的只摘取了程序的部分代码,对完整代码有兴趣的朋友欢迎关注我,个人微信上分享给你代码部分。