DW-办公自动化05(爬虫入门与综合应用)

本文介绍了Python爬虫的基础知识,包括使用Request库发起HTTP请求,解析HTML页面,以及利用BeautifulSoup提取数据。通过实践项目展示了如何抓取自如公寓的数据并保存到CSV,以及爬取36Kr信息并通过邮件发送。文中详细讲解了请求、响应的处理,HTML解析技巧,并提到了防止反爬策略和邮件发送的实现。
摘要由CSDN通过智能技术生成

1 Request简介

  • Requests库:Requests是一款目前非常流行的http请求库,使用python编写,能非常方便的对网页Requests进行爬取,也是爬虫最常用的发起请求第三方库。

    • 安装:
    pip install requests
    或者conda安装
    conda install requests
    
  • 常用指令:

    re.status_code 响应的HTTP状态码
    re.text 响应内容的字符串形式
    rs.content 响应内容的二进制形式
    rs.encoding 响应内容的编码
    
  • 访问百度

    import requests
    # 发出http请求
    re=requests.get("https://www.baidu.com")
    # 查看响应状态
    print(re.status_code)
    #输出:200
    #200就是响应的状态码,表示请求成功
    #我们可以通过res.status_code的值来判断请求是否成功。
    

    res.text 返回的是服务器响应内容的字符串形式,也就是文本内容

  • 下载txt文件

    import requests
    # 发出http请求
    re = requests.get('https://apiv3.shanbay.com/codetime/articles/mnvdu')
    # 查看响应状态
    print('网页的状态码为%s'%re.status_code)
    with open('鲁迅文章.txt', 'w') as file:
      # 将数据的字符串形式写入文件中
      print('正在爬取小说')
      file.write(re.text)
    

    在这里插入图片描述

    re.txt就是网页中的内容,将内容保存到txt文件中

  • 下载图片

    • re.text用于文本内容的获取、下载 re.content用于图片、视频、音频等内容的获取、下载
    import requests
    # 发出http请求
    #下载图片
    re=requests.get('https://img-blog.csdnimg.cn/20210424184053989.PNG')
    print('网页的状态码为%s'%re.status_code)
    # 以二进制写入的方式打开一个名为 info.jpg 的文件
    with open('datawhale.png','wb') as ff:
        # 将数据的二进制形式写入文件中
        ff.write(res.content
    

    re.encoding 爬取内容的编码形似,常见的编码方式有 ASCII、GBK、UTF-8 等。如果用和文件编码不同的方式去解码,我们就会得到一些乱码。


2 HTML解析和提取

  • 浏览器工作原理:向浏览器中输入某个网址,浏览器回向服务器发出请求,然后服务器就会作出响应。其实,服务器返回给浏览器的这个结果就是HTML代码,浏览器会根据这个HTML代码将网页解析成平时我们看到的那样
  • 提取HTML:
    import requests
    res=requests.get('https://baidu.com')
    print(res.text)
    
    会看到很多带有标签的信息

3 BeautifulSoup简介

  • BeautifulSoup库的作用:最主要的功能是从网页抓取数据
    • 安装:pip install bs4
  • 解析网页:豆瓣读书 Top250
    import io
    import sys
    import requests
    from bs4 import BeautifulSoup
    ###运行出现乱码时可以修改编码方式
    #sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
    ###
    headers = {
         
      'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
    }
    res = requests.get('https://book.douban.com/top250', headers=headers)
    soup = BeautifulSoup(res.text, 'lxml')
    print(soup)
    
    • 思路:
      • python 打印信息时会有限制 我们将打印的编码改成gb18030
      • headers表示我们的请求网页的头,对于没有headers的请求可能会被服务器判定为爬虫而拒绝提供服务
      • 通过 from bs4 import BeautifulSoup 语句导入 BeautifulSoup
      • 然后使用 BeautifulSoup(res.text, lxmlr’) 语句将网页源代码的字符串形式解析成了 BeautifulSoup 对象
      • 解析成了 BeautifulSoup 对象可以较为方便的提取我们需要的信息
  • 提取信息:
    • find():返回符合条件的首个数据
    • find_all():返回符合条件的所有条件
    import io
    import sys
    import requests
    from bs4 import BeautifulSoup
    #如果出现了乱码报错,可以修改编码形式
    #sys.stdout = io.TextIOWrapper(sys.stdout.buffer,encoding='gb18030')
    #
    headers = {
         
      'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'
    }
    res = requests.get('https://book.douban.com/top250', headers=headers)
    soup = BeautifulSoup(res.text, 'lxml')
    print(soup.find('a'))
    #<a class="nav-login" href="https://accounts.douban.com/passport/login?source=book" rel="nofollow">登录/注册</a>
    print(soup.find_all('a'))
    #返回一个列表 包含了所有的<a>标签
    
  • 除了传入 HTML 标签名称外,BeautifulSoup 还支持熟悉的定位:
    # 定位div开头 同时id为'doubanapp-tip的标签
    soup.find('div', id='doubanapp-tip')
    # 定位a抬头 同时class为rating_nums的标签
    soup.find_all('span', class_='rating_nums')
    #class是python中定义类的关键字,因此用class_表示HTML中的class
    

4 实践项目1:自如公寓数据抓取

  • 思路:
    • 自如公寓官网:https://wh.ziroom.com/z/z/,第1页的网页为:https://wh.ziroom.com/z/p1/,第2页的网页为:https://wh.ziroom.com/z/p2/,…第50页的网页为:https://wh.ziroom.com/z/p50/
    • 房屋的信息网页为类似于:https://wh.ziroom.com/x/741955798.html,即:https://wh.ziroom.com/x/XXXX.html。有了思路,通过访问自如公寓的网站,获取每个房间后面的数字号 然后通过数字号访问房屋的直接信息,然后抓取房屋的信息保存在excel中
    • 观察房屋的网页,找出需要的信息:
      房屋的名称,房屋的面积,房屋的朝向,房屋的户型,房屋的位置,房屋的楼层,是否有电梯,房屋的年代,门锁情况,绿化情况
    • 不知道这些信息的标签信息,不能用beautifulsoup对他们进行定位
      通过百度查询,浏览器按F12时能进入源代码模式 或者 点击右键进入审查元素,点击左上角的箭头,可以定位到元素的位置
  • 准备步骤:
    • 导入库:
    import requests
    from bs4 import BeautifulSoup
    import random
    import time
    import csv
    
    • UA头信息:
      多次访问自如的官网,只用一个UA头岂很容易被反爬虫识别,做很多个UA头,然后每次访问的时候可以随机选一个
    #这里增加了很多user_agent
    #能一定程度能保护爬虫
    user_agent = [
        "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
        "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
        "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
        "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
        "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
        "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
        "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
        "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
        "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
        "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
        "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
        "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值