Python 爬虫 案例

  • beautifulsoup4解析数据

简介
1. 前面已经可以获取到数据了,但是数据中有大量的无用的数据,因此如果想使用数据的话,就需
要进行解析了
2. 其实解析方式有很多的,比如正则、bs4、xml等都是可以的,这里面re的速度是最快的,但是
这个对正则表达式的书写能力有一定的要求
3. bs4也可以做解析,而且一种最简单的实现方式。
  • 通过bs4,可以将复杂的html文档,转化成一个树形结构,每个节点都是python对象。
  • bs4是一个第三方的库,可以执行命令进行安装:pip install beautifulsoup4
beautifulsoup4解析器

 

使用举例
测试字符串
# 待分析的字符串
html_doc = '''
<html>
    <head>
        <title>测试页面</title>
    </head>
<body>
        <p class="title aq">
            这是首页
        </p>
        <p class="story">
            你好北京
            <a href="http://www.baidu.com" class="sister" id="link1">百度</a>
            <a href="http://www.qq.com" class="sister" id="link2">QQ</a>
            and
            <a href="http://www.sina.com" class="sister" id="link3">新浪</a>
        </p>
        <p class="story">            
        ...
        </p>
    </body>
</html>
'''

输出第一个title标签的相关内容
from bs4 import BeautifulSoup
import bs4
# 待分析的字符串
html_doc = '''
<html>
    <head>
        <title>测试页面</title>
    </head>
    <body>
        <p class="title aq">
            这是首页
        </p>
        <p class="story">
            你好北京
            <a href="http://www.baidu.com" class="sister" id="link1">百度</a>
            <a href="http://www.qq.com" class="sister" id="link2">QQ</a>
            and
            <a href="http://www.sina.com" class="sister" id="link3">新浪</a>
        </p>
        <p class="story">
            ...
        </p>
    </body>
</html>
'''
# 创建 BeautifulSoup 对象
# 解析器为:html.parser
# from_encoding='utf-8'如果没有中文乱码,可以不指定
bs_obj = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8')

# 输出内容
print(f"第一个title标签:{bs_obj.title}")
print(f"第一个title标签的内容:{bs_obj.title.text}")
print(f"第一个title标签的内容:{bs_obj.title.string}")
print(f"第一个title标签的名字:{bs_obj.title.name}")
print(f"第一个title标签的父标签的名字:{bs_obj.title.parent.name}")
print(f"第一个title标签的子标签的名字:{bs_obj.title.children.name}")
输出第一个p标签的内容
from bs4 import BeautifulSoup
import bs4
# 待分析的字符串
html_doc = '''
<html>
    <head>
        <title>测试页面</title>
    </head>
    <body>
        <p class="title aq", id=5>
            这是首页
        </p>
        <p class="story">
            你好北京
            <a href="http://www.baidu.com" class="sister" id="link1">百度</a>
            <a href="http://www.qq.com" class="sister" id="link2">QQ</a>
            and
            <a href="http://www.sina.com" class="sister" id="link3">新浪</a>
        </p>
        <p class="story">
            ...
        </p>
    </body>
</html>
'''
# 创建 BeautifulSoup 对象
# 解析器为:html.parser
bs_obj = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8')
# 输出内容
print(f"第一个p标签:{bs_obj.p}")
print(f"第一个p标签的内容:{bs_obj.p.text}")
print(f"第一个p标签的class属性:{bs_obj.p['class']}")
对第一个p的字标签的进行遍历输出
from bs4 import BeautifulSoup
import bs4
# 待分析的字符串
html_doc = '''
<html>
    <head>
        <title>测试页面</title>
    </head>
    <body>
        <p class="title aq", id=5>
            这是首页
    </p>
        <p class="story">
            你好北京
            <a href="http://www.baidu.com" class="sister" id="link1">百度</a>
            <a href="http://www.qq.com" class="sister" id="link2">QQ</a>
            and
            <a href="http://www.sina.com" class="sister" id="link3">新浪</a>
        </p>
        <p class="story">
            ...
        </p>
    </body>
</html>
'''
# 创建 BeautifulSoup 对象
# 解析器为:html.parser
bs_obj = BeautifulSoup(html_doc, 'html.parser', from_encoding='utf-8')
n = 1
# 对p标签的子节点进行遍历
for child in bs_obj.p.children:
# child中保存的就是子标签
# 可以用child.name 获取子标签的名字 child.text 获取子标签的内容
print(f"第 {n} 个子节点是 {child}")

案例:用google去搜索 inurl.php?id=1 公司

import requests         # pip install requests -i

https://pypi.douban.com/simple
from requests.packages.urllib3.exceptions import InsecureRequestWarning

import urllib                 # 这个模块是用于实现url解码

from urllib import parse      # 这个模块是用于实现url解码

from bs4 import BeautifulSoup # pip install bs4 -i https://pypi.douban.com/simple

class SearchByGoogle(object):
    def __init__(self,url,header,data):
        self.url = url
        self.header = header
        self.data = data
        # 这个是用于解决 爬虫requests.exceptions.SSLError:HTTPSConnectionPool(host='XXX', port=443)问题
        # 在google刚开始进行请求是正常的,但是请求次数多了以后,就会禁止请求了,可以通过这种方法进行解决


        requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

    def searchMsg(self):
        # 发送请求

        resp = requests.get(url=self.url,headers=self.header,params=self.data)

        # 设置字符集为utf8,【如果没有出现中文乱码,可以省略】
        resp.encoding = "utf-8"

        # 接收返回结果
        resp_text = resp.text

        # print(resp_text)

        # 对返回结果进行url解码
        self.resp_decode = urllib.parse.unquote(resp_text)

    def getDestUlr(self):
        # 创建bs对象
        data = BeautifulSoup(self.resp_decode)

        # 定义a标签,所有符合条件的a标签,会返回一个列表
        atarA_list = data.select("div[class='P8ujBc v5yQqb jqWpsc'] > a")
        # a = soup.select("div[class=yuRUbf]>a")
        # print(a)

        # 遍历列表,获取href中的值
        for item in atarA_list:
            print(item['href']) # 获取a标签中的href属性的值


if __name__ == '__main__':
    # google搜索的url地址
    url = "http://144.24.32.107/search"
    # 设置请求头
    headers = {
        'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Mobile Safari/537.36',
    }


    # 设置请求参数,数据来源于payload
    data = {
        'q': 'inurl: .php?id=1 公司',
        'ei': 'tKhVZIaBK9uxqtsPrPesOA',
        'ved': '0ahUKEwiGq_3rwN_-AhXbmGoFHaw7CwcQ4dUDCBA',
        'oq': 'inurl: login.php 公司',
        'gs_lcp': 'Cgxnd3Mtd2l6LXNlcnAQDEoECEEYAFAAWABgAGgAcAB4AIABAIgBAJIBAJgBAA',
        'sclient': 'gws-wiz-serp'
      }



    # 实例化类
    obj = SearchByGoogle(url,headers,data)

    # 进行搜索
    obj.searchMsg()

    # 解析数据,并输出目标url
    obj.getDestUlr()




























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值