爬虫---使用BeautifulSoup解析网页

 

1.使用BeautifulSoup+requests解析网页

1)BeautifulSoup

  • Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库。主要作用是将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。
  • BeautifulSoup()的构造方法需要传入两个参数,如下图所示:
    a. 一段网页代码或一个网页文件;
    b. 另一个是解析网页的库,这里使用lxml库.

    BeautifulSoup

2)requests

  • 服务器和本地的交换机制,如下图

     

    request and response procedure

  • 向服务区发起request 请求常用方式:post 和 get,其中get方法可以提交要访问的URL,浏览器和用户信息等内容
  • 服务器将请求的内容以response返回,包括:状态(status_code: 200/404)和网页元素等
  • 线上网页中的问题和思路
    a. 页面乱码
    b. select返回为空列表
    c. soup.select()选择标签问题
    d. soup.select()尽量不使用完整selector
    e. 反抓取:模拟浏览器headers里面的User-Agent 和 Cookieget一起请求
    f. stripped_strings获得父标签下子标签的所有文本信息
    g. 通过获取元素的CSS样式中的参数信息,如href中的URL或者判断DIV

2. 描述要爬取的东西在页面中的路径

  • 页面元素的位置可以通过页面的tag或者CSS

    CSS Selector and XPath

     

  • lxml库通过元素的CSS样式获取元素的位置,即浏览器调试中审查元素的CSS Selector

  • 元素的CSS Selector不一定需要写最长的,只要能够保证唯一定位元素即可,甚至可以采用标签的属性来定位如'img[weight="100"]'

3. 从标签中获取需要的信息,并以一定的数据结构存储

4. 例子:抓取链家-杭州二手房部分信息

# 导入相关库 
from bs4 import BeautifulSoup
import time
import requests

url_lianjia = 'https://hz.lianjia.com/ershoufang/'
headers = {#模拟浏览器请求,可以用 cookie模拟登陆状态
    'User-Agent':'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.84 Safari/537.36',
}
time.sleep(4)  #延时请求

wb_data = requests.get(url_lianjia, headers=headers)  #使用requests向服务器发起get请求,通过header模拟浏览器行为
soup    = BeautifulSoup(wb_data.text, 'lxml')  #将服务器返回的对象使用BeautifulSoup解析,wb_data为response对象,需要文本化
# 确定要抓取的元素位置
titles = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.title > a') #返回值类型为list
imgs = soup.select('body > div.content > div.leftContent > ul > li > a > img')
total_prices = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.priceInfo > div.totalPrice > span')
unit_prices = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.priceInfo > div.unitPrice > span')
tags   = soup.select('body > div.content > div.leftContent > ul > li > div.info.clear > div.tag')
# 数据格式化,最终放到字典中
for title, img, total_price, unit_price, tag in zip(titles, imgs, total_prices, unit_prices, tags):
    data = {
        'title': title.get_text(),
        'img': img.get('src'),
        'total_price': total_price.get_text(),
        'unit_price': unit_price.get_text(),
        'tag': list(tag.stripped_strings)
    }
    print(data)

5. 异步加载数据的抓取

  • 什么是异步加载:由JS控制,不断加载的数据
  • 动态数据查看方法
    -- 使用浏览器的调试窗口,查看network->XHR,查看相关信息:Headers(向服务器发起的请求)和Response(服务器返回信息)等
    -- 知道动态加载的内容在页面代码中的位置和页面的动态链接生成规则
    -- 其余参考以上

转自:https://www.jianshu.com/p/f9a38e3d45fb

官方文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id10

  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值