一、读懂网页结构
1.什么是HTML (标记语言)
html是用来描述网页的一种语言
html指超文本标记语言
html使用标记标签来描述网页
html文档=网页
2.标签、元素、属性
1)标签:HTML标签由尖括号包围的关键字 eg:< html>
通常成对出现 eg:< b> 和< /b>
前一个称为开始标签,也叫开放标签;后一个为结束标签,也叫闭合标签
2)元素:指的是由开始标签到结束标签的所有代码
以开始标签起始,结束标签终止
某些html元素具有空内容
空元素以开始标签的结束而结束
3)属性:HTML标签可以拥有属性。属性提供了有关HTML元素更多的有关信息
属性总是以名称或值对的形式出现,eg:name=‘value’。
属性总是在html元素的开始标签中规定
3.头部信息和主体信息(两种特殊的标签)
< html> 下两大节点 < head> < body>
1)头部信息:< head >
2)主体信息:< body> 主题信息会显示在网页上,核心内容
4.基本标签
1)标题:< title>
- 标题是通过< h1>-< h6>进行定义的
- < h1>定义最大的标题,< h6>定义最小的标题
2)段落:< p>
- 段落是通过< p>标签定义的
3)样式:< style> 提供一种能改变所有HTML元素的样式的方法
4)链接:< a>
- 超链接可以是一个字,一个词,或一组词,一幅图像等,可以点击这些内容跳转到新得文档或当前文档中得某一部分
- 通过使用href属性—创建指向另一文档得链接
- 通过使用name属性—创建文档内得书签
5)图像:< img>
- 在html中,图像由< img> 标签定义
- 图像得属性中也可以加图片链接,通过src属性
6)列表:无序列表< ul> 有序列表< ol> 列表项 < li>
7)块:< div> < span>
- < div> 块级元素,用于组合其他HTML元素得容器
- < span> 内联元素,可用作文本得容器
8)脚本:< script> 用于定义客户端脚本,比如javaScript(高级语言)
二、页面解析及标签提取
1.用python访问网页
requests包:是python得一个http客户端库,向网页发送请求
import requests
u='https://book.douban.com/latest' #网址
r=requests.get(url=u)
r输出为 200 成功处理请求
404 未找到
r.text #查看网页源代码
2.解析数据
BeautifulSoup
from bs4 import BeautifulSoup
soup=BeautifulSoup(r.text,'lxml') 、
soup.h1 #查看一级标题
soup.find('h1') #同上 ,获取第一个h1
#获取所有标签,以列表格式呈现,以逗号隔开
soup.find_all('h2')
爬虫实例
1.访问网页 :使用requests去访问
import requests
u='https://book.douban.com/latest' #网址
r=requests.get(url=u)
r.text #访问网页的源代码
2.解析网页:使用BeautifulSoup解析网页
from bs4 import BeautifulSoup #pip安装此包 终端pip install bs4
soup=BeautifulSoup(r.text,'lxml') #lxml是一个HTML解析器
3.爬虫详解
soup.find('div',id='content')
soup.find('div',{'id':'content'}) #查找所有标签为div,类id为content的内容
soup.find('div',id='content').h1 #查看h1下的内容
soup.find('div',id='content').h1.text #数据采集文字信息
soup.find('ul',class_='cover-col-4 clearfix') #注:class_ #由于class是一个类,所以后面要加-,避免和class关键字重复
soup.find('ul',{'class':'cover-col-4 clearfix'}).li #查看第一本书的信息
#dic['星级数']=li0.find('span',class_="cur_star")['style'] #或者.attrs['style'],当信息在属性中时,采用本方法
#找到每本书的信息,并以列表形式存储
lis=soup.find('ul',class_='cover-col-4 clearfix').find_all('li')
#以一本书信息为例,采集数据
li1=lis[0]
lis[0].find_all('a')[0].find('img').get('src') #找到类a标签开头的第一个,img标签开头,用find中返回对象的get方法得到src
li1.h2.text.replace(' ','').replace('\n','') # .replace(' ','').replace('\n','') 表示替换格式,去除文本前后多余的空格
li1.find('p',class_='color-gray').get_text(strip=True) # get_text()返回纯文本格式,括号里面写 strip=True去除空格,效果同上
dic={} #以字典形式存储信息
dic['书名']=li1.h2.text.replace(' ','').replace('\n','')
dic['其他信息']=li1.find('p',class_='color-gray').get_text(strip=True)
#当信息为空时,无法提取text时
score_node=li1.find('span',class_='rating_nums')
try:
dic['评分']=li.find('span',class_='rating_nums').text
except AttributeError:
dic ['评分']='-'
#把每本书的信息写成DataFrame格式
dataset=[]
dataset.append(dic)
import pandas as pd
df=pd.DataFrame(dataset)
import requests
from bs4 import BeautifulSoup
n=0
for u in urllst:
r=requests.get(url=u)
soup=BeautifulSoup(r.text,'lxml')
lis=soup.find('ul',class_='subject-list').find_all('li')
for li in lis:
dic={}#创建空字典存储数据
dic['书名']=li.h2.text.replace(' ','').replace('\n','')
dic['其他信息']=li.find('div',class_='pub').get_text(strip=True)
score_node=li.find('span',class_='rating_nums')
#解决代码块信息为空的情况,也就是无法提取text时
try:
dic['评分']=li.find('span',class_='rating_nums').text
except AttributeError:
dic ['评分']='-'
print(dic)
dataset.append(dic)#将字典加入列表
n+=1
print('成功采集%i条数据'%n)