1.Requests库

该第三方库提供了丰富的访问连接,爬取数据的方法,建立连接的基本方式:

  1. import requests
  2. from fake_useragent import UserAgent
  3. # requests.get('',params='') # get方法用于发送get请求,有三个参数 url必填,param选项:get请求中的参数?,**kwargs选项:控制访问的参数
  4. # 应用get()方法连接网站,抓取豆瓣top250页面代码的前380个字符
  5. url = "https://movie.douban.com/top250" # 豆瓣电影top250
  6. headers = {
  7. "User-Agent": UserAgent().chrome
  8. }
  9. req = requests.get(url,headers=headers) # 更加简洁,不再需要Request构造一次请求,再传给urlopen
  10. req.encoding = req.apparent_encoding
  11. print(req.text[:380]) # 列表或者字典的截取方法: [a:b]表示截取从a到b-1,如果一项不写表示从头或从尾开始截取。

requests.text

爬取的数据作为文本通过该变量保存,可以打印该变量,text字符串类型可以通过[ ]中括号方式截取部分内容,[a:b]表示从a截取到b-1,比如[0:380]就是从0开始截取到379个字符。参数为0或为结尾时可以省略不写。

  1. text = '123455678'
  2. text[ :5]表示从头到4 text[2: ]则表示从2到结尾。

2.BeautifulSoup 4 (bs4) 库

在爬取了网页代码之后就需要数据解析,来查找我们需要的标签体以及里面的内容,类似JS的jQuery查询和操作DOM,python中也有专门解析、遍历标签的库模块BeautifulSoup简称bs4。BeautifulSoup 是 bs4库中的一个类,主要使用的类。
该模块提供两个方法:find find_all , 一个只找第一个标签,另一个查找全部标签并返回一个列表。可以根据标签的名字,属性,内容进行查找。

find方法的参数

image.png
从左到右依次是:标签名name,标签属性attrs:字典类型,标签内容text。

使用步骤:

1.在网页开发者工具中,找到我们需要解析的标签名或属性名,反正是任何可以定位到该标签的内容都可以。下图中就是 div 和 class = “nowplaying”
image.png
2.在python中用bs4创建解析器对象,并用request建立连接

    为例,爬取正在热映的电影列表

    1. # bs4全名BeautifulSoup 4 专门用于解析、遍历、维护网页’标签‘的功能库,类似jQuery
    2. # bs4的两个方法 find() 和 find_all(),可以根据html标签名,标签属性,标签内容查询,类比jQuery的Selector
    3. # 导入 bs4 模块中的BeautifulSoup类 as 后可以起别名
    4. from bs4 import BeautifulSoup as bs
    5. from fake_useragent import UserAgent
    6. import requests
    7. url = "https://movie.douban.com/cinema/nowplaying/maoming/" # 豆瓣电影首页
    8. headers = {
    9. "User-Agent": UserAgent().chrome # 伪装成浏览器
    10. }
    11. req = requests.get(url,headers=headers) # 建立连接,修改请求头
    12. html_data = req.text # 获取网页代码
    13. # 开始解析网页代码
    14. # 构建一个解析器
    15. soup = bs(html_data, "html.parser")
    16. nowplay1 = soup.find("ul",class_= "lists") # 解析区域 <ul class="lists"></ul>中的<li>列表
    17. # 注意class为关键字,如果要作为匹配参数需要加个下划线
    18. nowplay2 = nowplay1.find_all("li",class_ = "list-item") # 可以在上一次解析的结果上再次解析,解析ul标签下的li标签
    19. print(nowplay2) # 输出后发现,电影名是li标签的data-title属性的值,所以之后遍历nowplay2只要取出data-title的值即可

    3.遍历查询出的标签树,将数据装入一个字典列表(对象数组)

    1. nowplay_list = [] # 用来装遍历的电影信息
    2. for item in nowplay2: # 在nowplay2中 一个li标签作为一个item对象
    3. nowplay_dict = {} # 用来装当此遍历结果的字典,键值对形式
    4. nowplay_dict['id'] = item['id'] # 获得电影id
    5. nowplay_dict['name'] = item['data-title'] # 获得电影名
    6. nowplay_dict['img_src'] = item.find("img")['src'] # 解析li标签下的img图片标签的地址src
    7. nowplay_list.append(nowplay_dict) # 将结果加入到外部的列表中
    8. # nowplay_list.append(item['data-title']) # 也可以只加入电影名
    9. print(nowplay_list)

    完整的python程序:

    1. # bs4全名BeautifulSoup 4 专门用于解析、遍历、维护网页’标签‘的功能库,类似jQuery
    2. # bs4的两个方法 find() 和 find_all(),可以根据html标签名,标签属性,标签内容查询,类比jQuery的Selector
    3. # 导入 bs4 模块中的BeautifulSoup类 as 后可以起别名
    4. from bs4 import BeautifulSoup as bs
    5. from fake_useragent import UserAgent
    6. import requests
    7. url = "https://movie.douban.com/cinema/nowplaying/maoming/" # 豆瓣电影首页
    8. headers = {
    9. "User-Agent": UserAgent().chrome # 伪装成浏览器
    10. }
    11. req = requests.get(url,headers=headers) # 建立连接,修改请求头
    12. html_data = req.text # 获取网页代码
    13. # 开始解析网页代码
    14. # 构建一个解析器
    15. soup = bs(html_data, "html.parser")
    16. nowplay1 = soup.find("ul",class_= "lists") # 解析区域 <ul class="lists"></ul>中的<li>列表
    17. # 注意class为关键字,如果要作为匹配参数需要加个下划线
    18. nowplay2 = nowplay1.find_all("li",class_ = "list-item") # 可以在上一次解析的结果上再次解析,解析ul标签下的li标签
    19. print(nowplay2) # 输出后发现,电影名是li标签的data-title属性的值,所以之后遍历nowplay2只要取出data-title的值即可
    20. nowplay_list = [] # 用来装遍历的电影信息
    21. for item in nowplay2: # 在nowplay2中 一个li标签作为一个item对象
    22. nowplay_dict = {} # 用来装当此遍历结果的字典,键值对形式
    23. nowplay_dict['id'] = item['id'] # 获得电影id
    24. nowplay_dict['name'] = item['data-title'] # 获得电影名
    25. nowplay_dict['img_src'] = item.find("img")['src'] # 解析li标签下的img图片标签的地址src
    26. nowplay_list.append(nowplay_dict) # 将结果加入到外部的列表中
    27. # nowplay_list.append(item['data-title']) # 也可以只加入电影名
    28. print(nowplay_list)