python数据分析与可视化(二)第一篇是python基础 代码比较多 用于学过一定python基础的人练习
链接:https://blog.csdn.net/qq_43636709/article/details/109538588
这一边是简单的爬虫 很基础的
首先爬虫之前也写过一点正则表达式和urllib(自带)这两点,今天主要来说requests这个库爬虫。
先温习一下上面链接的用urllib自带库来爬百度贴吧的剑来吧:
1.引入urllib.request组件
2.爬取百度贴吧的基本步骤 :(1)编写loadPage(surl)方法爬取指定url地址的网页,并返回内容 (2)编写爬虫的方法tiebaSprider(surl,startPage,endPage),传三个参数 (3)编写保存爬取到的html文件的方法writeFilePage(htmltxt,page),传递给loadPage方法返回html文件,并保持存到文件中 (4)编写主方法,从键盘输入要爬取的贴吧名称,起始终止的页数,并用urlencode进行编码和拼接地址
******爬取出来的结果就不上了吧 还会有几页html的文件
import os
import time
import urllib.request
#爬取指定url网页
def loadPage(surl):
header = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.101 Safari/537.36'}
request = urllib.request.Request(surl,headers = header)#伪装成浏览器访问方式
html = urllib.request.urlopen(request)#打开请求信息所得数据
htmltxt = html.read()#读取网页数据 转换成字符串类型
#print(type(htmltxt))
#print(htmltxt)
return htmltxt.decode("utf-8")
def tiebaSprider(surl,startPage,endPage):
print("贴吧地址:",surl)
print("起始与终止页数:",startPage,endPage)
#计算爬取的页数
for page in range(startPage,endPage+1):
#计算pin记录数
pin = (page - 1)
urlful = surl + "&pin=" + str(pin)#打开网页观察页数变化
print(urlful)
print("************第",str(page),"页************")
htmltxt = loadPage(urlful)
writeFilePage(htmltxt,page)
time.sleep(4)#等待4秒继续爬取
def writeFilePage(htmltxt,page):
fname = "第"+str(page)+"页.html"#文件名
f = open(fname,"w",encoding='utf-8')
f.write(htmltxt)
f.close()
if __name__=='__main__':
surl = "https://tieba.baidu.com/f?"
#从键盘输入要访问的贴吧名称
tname = input("请输入要访问的贴吧名称:")
#包装为字典
dic = {"kw":tname}
#将字典转化为要搜索的字符串
searchString = urllib.parse.urlencode(dic)
print("要搜索的贴吧名称转换后的字符串:",searchString)
#打印要搜索的拼接后的字符串
fullurl = surl + searchString
print(fullurl)
startPage = int(input("请输入起始页数:"))
endPage = int(input("请输入终止页数:"))
#调用爬虫方法
tiebaSprider(fullurl,startPage,endPage)
loadPage(fullurl)
requests库抓取数据的四个步骤:[需要自己安装pip requests,可自行百度]
#请求
import requests
url = 'https://movie.douban.com/typerank?type_name=%E5%89%A7%E6%83%85&type=11&interval_id=10:0&action='#网址
headers = {user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36'}#请求头,用于伪装成浏览器用户访问
html = requests.get(url=url,headers=headers)#发出一个请求
#响应
print(html.text)#将请求所得数据转换成字符串数据,与urllib库的html.read()作用相同
解析要用到BeautifulSoup这个库,它的用法大家可以参考大佬博主的这篇博文:https://blog.csdn.net/weixin_43930694/article/details/90142678?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
简:BeautifulSoup介绍:【主要用于对标签元素的内容与属性进行解析】 (1)通过urllib或者requests爬取页面信息 (2)NavigableSring 作用:获取标签内部的文字直译:可遍历的字符串。使用方法:soup.p.string。对象类型:; Tag:标签对象;利用 soup加标签名轻松地获取这些标签的内容。它查找的是在所有内容中的第一个符合要求的标签。这些对象的类型是 Tag对象的两个重要属性:name:输出标签的标签类型名 rttrs:字典形式获取标签属性 BeautifulSoup:文档对象,也就是整个文档的内容,可以当做是一个Tag对象。 comment:Coment对象是一个特殊类型的NavigableString对象。如果标签内部的内容是注释,例如:。那么该NavigableSring对象会转换成Comment对象,并且会把注释符号去掉。
#解析-》基础的简单的该库的方法,详细的参考上面给出的博文或者自行查看
from bs4 import BeautifulSoup
soup = BeautifulSoup(html.text,'html.parser')#soup是个BeautifulSoup对象,参数第二个是python自带的解析库,也可以用第三方库,自行csdn
items = soup.find('ul',class_ = 'nav nav-list').find('ul').find_all('li') #一层一层往下爬
for item in items:
kind = item.find('a')
print('分类:'+kind.text.strip())
简单说一下:find(‘标签’,class_=‘属性’)是一个查找方法,里面参数是网页标签名字与对应属性,找第一个并返回标签(tag),find_all(‘标签’,class_=‘属性’)查找所有并返回标签对象,可遍历查看。可以在网页上一层一层往下爬。爬到自己想要的数据。
#保存就可以保存成文件
import os
filename = 'test'
f = open(filename,"w",encoding='utf-8')
data = kind.text.strip()
f.write(data)
f.close()