1.Requests库
该第三方库提供了丰富的访问连接,爬取数据的方法,建立连接的基本方式:
import requests
from fake_useragent import UserAgent
# requests.get('',params='') # get方法用于发送get请求,有三个参数 url必填,param选项:get请求中的参数?,**kwargs选项:控制访问的参数
# 应用get()方法连接网站,抓取豆瓣top250页面代码的前380个字符
url = "https://movie.douban.com/top250" # 豆瓣电影top250
headers = {
"User-Agent": UserAgent().chrome
}
req = requests.get(url,headers=headers) # 更加简洁,不再需要Request构造一次请求,再传给urlopen
req.encoding = req.apparent_encoding
print(req.text[:380]) # 列表或者字典的截取方法: [a:b]表示截取从a到b-1,如果一项不写表示从头或从尾开始截取。
requests.text
爬取的数据作为文本通过该变量保存,可以打印该变量,text字符串类型可以通过[ ]中括号方式截取部分内容,[a:b]表示从a截取到b-1,比如[0:380]就是从0开始截取到379个字符。参数为0或为结尾时可以省略不写。
text = '123455678'
text[ :5]表示从头到4 ,text[2: ]则表示从2到结尾。
2.BeautifulSoup 4 (bs4) 库
在爬取了网页代码之后就需要数据解析,来查找我们需要的标签体以及里面的内容,类似JS的jQuery查询和操作DOM,python中也有专门解析、遍历标签的库模块BeautifulSoup简称bs4。BeautifulSoup 是 bs4库中的一个类,主要使用的类。
该模块提供两个方法:find 和 find_all , 一个只找第一个标签,另一个查找全部标签并返回一个列表。可以根据标签的名字,属性,内容进行查找。
find方法的参数
从左到右依次是:标签名name,标签属性attrs:字典类型,标签内容text。
使用步骤:
1.在网页开发者工具中,找到我们需要解析的标签名或属性名,反正是任何可以定位到该标签的内容都可以。下图中就是 div 和 class = “nowplaying”
2.在python中用bs4创建解析器对象,并用request建立连接
以
# bs4全名BeautifulSoup 4 专门用于解析、遍历、维护网页’标签‘的功能库,类似jQuery
# bs4的两个方法 find() 和 find_all(),可以根据html标签名,标签属性,标签内容查询,类比jQuery的Selector
# 导入 bs4 模块中的BeautifulSoup类 as 后可以起别名
from bs4 import BeautifulSoup as bs
from fake_useragent import UserAgent
import requests
url = "https://movie.douban.com/cinema/nowplaying/maoming/" # 豆瓣电影首页
headers = {
"User-Agent": UserAgent().chrome # 伪装成浏览器
}
req = requests.get(url,headers=headers) # 建立连接,修改请求头
html_data = req.text # 获取网页代码
# 开始解析网页代码
# 构建一个解析器
soup = bs(html_data, "html.parser")
nowplay1 = soup.find("ul",class_= "lists") # 解析区域 <ul class="lists"></ul>中的<li>列表
# 注意class为关键字,如果要作为匹配参数需要加个下划线
nowplay2 = nowplay1.find_all("li",class_ = "list-item") # 可以在上一次解析的结果上再次解析,解析ul标签下的li标签
print(nowplay2) # 输出后发现,电影名是li标签的data-title属性的值,所以之后遍历nowplay2只要取出data-title的值即可
3.遍历查询出的标签树,将数据装入一个字典列表(对象数组)
nowplay_list = [] # 用来装遍历的电影信息
for item in nowplay2: # 在nowplay2中 一个li标签作为一个item对象
nowplay_dict = {} # 用来装当此遍历结果的字典,键值对形式
nowplay_dict['id'] = item['id'] # 获得电影id
nowplay_dict['name'] = item['data-title'] # 获得电影名
nowplay_dict['img_src'] = item.find("img")['src'] # 解析li标签下的img图片标签的地址src
nowplay_list.append(nowplay_dict) # 将结果加入到外部的列表中
# nowplay_list.append(item['data-title']) # 也可以只加入电影名
print(nowplay_list)
完整的python程序:
# bs4全名BeautifulSoup 4 专门用于解析、遍历、维护网页’标签‘的功能库,类似jQuery
# bs4的两个方法 find() 和 find_all(),可以根据html标签名,标签属性,标签内容查询,类比jQuery的Selector
# 导入 bs4 模块中的BeautifulSoup类 as 后可以起别名
from bs4 import BeautifulSoup as bs
from fake_useragent import UserAgent
import requests
url = "https://movie.douban.com/cinema/nowplaying/maoming/" # 豆瓣电影首页
headers = {
"User-Agent": UserAgent().chrome # 伪装成浏览器
}
req = requests.get(url,headers=headers) # 建立连接,修改请求头
html_data = req.text # 获取网页代码
# 开始解析网页代码
# 构建一个解析器
soup = bs(html_data, "html.parser")
nowplay1 = soup.find("ul",class_= "lists") # 解析区域 <ul class="lists"></ul>中的<li>列表
# 注意class为关键字,如果要作为匹配参数需要加个下划线
nowplay2 = nowplay1.find_all("li",class_ = "list-item") # 可以在上一次解析的结果上再次解析,解析ul标签下的li标签
print(nowplay2) # 输出后发现,电影名是li标签的data-title属性的值,所以之后遍历nowplay2只要取出data-title的值即可
nowplay_list = [] # 用来装遍历的电影信息
for item in nowplay2: # 在nowplay2中 一个li标签作为一个item对象
nowplay_dict = {} # 用来装当此遍历结果的字典,键值对形式
nowplay_dict['id'] = item['id'] # 获得电影id
nowplay_dict['name'] = item['data-title'] # 获得电影名
nowplay_dict['img_src'] = item.find("img")['src'] # 解析li标签下的img图片标签的地址src
nowplay_list.append(nowplay_dict) # 将结果加入到外部的列表中
# nowplay_list.append(item['data-title']) # 也可以只加入电影名
print(nowplay_list)