ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【python办公自动化】task5 爬虫入门与综合应用

2021-07-02 18:01:31  阅读:420  来源: 互联网

标签:task5 python Mozilla 爬虫 Windows import NT find 4.0


目录

1. Requests简介

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

安装

pip install requests

一些常用方法

requests.get('网址') #发出响应请求

re.status_code #响应的HTTP状态码
re.txt #响应内容的字符串形式,用于文本的获取、下载
rs.content #响应内容的二进制形式用于图片、视频、音频等内容的获取下载
rs.encoding #响应内容的编码, 爬取内容的编码形似,常见的编码方式有 ASCII、GBK、UTF-8 等。如果用和文件编码不同的方式去解码,我们就会得到一些乱码。

2. 简单爬取

2.1 对百度首页数据进行请求

requests.get(‘网址’)

import requests
#发出http请求
re=requests.get('http://www.baidu.com')
#查看响应状态
print(re.status_code)

输出为200
200就是响应的状态码,表示请求成功,我们可以通过res.status_code的值来判断请求是否成功。

2.2 用爬虫下载孔乙己的文章

res.test返回的是服务响应内容的字符串形式,也就是文本内容,下面我们来爬取下孔乙己文章https://apiv3.shanbay.com/codetime/articles/mnvdu
在这里插入图片描述

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)
    print('爬取结束')

在这里插入图片描述

2.3 爬取图片

使用re.content爬取图片https://www.icode9.com/i/ll/?i=20210424184053989.PNG
在这里插入图片描述

import requests
res=requests.get('https://www.icode9.com/i/ll/?i=20210424184053989.PNG')
#以二进制写入的方式打开一个名为info的文件
with open('datawhale.png','wb')as ff:
    #将二进制形式写入文件
    ff.write(res.content)

3.HTML解析和提取

3.1 浏览器工作原理

浏览器工作原理:向浏览器中输入某个网址,浏览器会向服务器发出请求,然后服务器就会做出响应。服务器返回的结果就是HTML代码,然后浏览器将HTML代码解析成我们平常捡到的网页

import requests
res=requests.get('http://baidu.com')
print(res.text)

在这里插入图片描述
**HTML(Hyper Text Markup Language)**是一种超文本标记语言,是由一堆标记组成。

<html>
  <head>
    <title>我的网页</title>
  </head>
  <body>
    Hello,World
  </body>
</html>

扩展:HTML https://www.runoob.com/html/html-tutorial.html

3.2 BeautifulSoup介绍

想要解析html页面需要用到BeautifulSoup这个第三方库

Beautiful Soup 提供一些简单的、python 式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,通过解析文档为用户提供需要抓取的数据,因为简单,所以不需要多少代码就可以写出一个完整的应用程序。 Beautiful Soup 自动将输入文档转换为 Unicode 编码,输出文档转换为 utf-8 编码。你不需要考虑编码方式,除非文档没有指定一个编码方式,这时,Beautiful Soup 就不能自动识别编码方式了。然后,你仅仅需要说明一下原始编码方式就可以了。 Beautiful Soup 已成为和 lxml、html6lib 一样出色的 python 解释器,为用户灵活地提供不同的解析策略或强劲的速度。

Python 爬虫利器二之 Beautiful Soup 的用法https://cuiqingcai.com/1319.html
Beautiful Soup 4.4.0 文档 https://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

安装:pip install bs4

下面来解析以下豆瓣读书top250https://book.douban.com/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')#将网页内容解析为BeautifulSoup对象
print(soup)

headers表示我们的请求网页的头,对于没有headers的请求可能会被服务器判定为爬虫而拒绝提供服务
在这里插入图片描述
如何进一步把需要信息提取出来需要用到BeautifulSoup

find()方法find_all()方法

  • 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'),'\n')
#返回一个列表,所有包含<a>的标签
print(soup.find_all('a'))

在这里插入图片描述
除了传入HTML标签名外,BeautifulSoup还支持定位

# 定位div开头 同时id为'doubanapp-tip的标签
print(soup.find('div', id='doubanapp-tip'))
print('=============================================')
# 定位a开头 同时class为rating_nums的标签
soup.find_all('span', class_='rating_nums')
#class是python中定义类的关键字,因此用class_表示HTML中的class

在这里插入图片描述

4. 项目实践

4.1 实践一:自如公寓数据抓取

日前 ,国务院办公厅印发《关于加快培育和发展住房租赁市场的若干意见》,你是某新媒体公司的一名员工,老板希望对武汉的租房情况进行深度调研与分析,你想调查自如公寓的数据情况。根据工作的安排,你调研的是自如公寓武汉房屋出租分析的任务。

项目难度:⭐⭐⭐⭐
自如公寓官网:https://wh.ziroom.com/z/z/

通过观察官网可以发现

剩下的页面以此类推,即每个页面的格式为https://wh.ziroom.com/z/p页数/

而对于每个房屋的具体信息点进去可以发现其格式为https://wh.ziroom.com/x/XXXX.html
在这里插入图片描述
对于具体的房屋信息我们 想爬取房屋的名称,房屋的面积,房屋的朝向,房屋的户型,房屋的位置,房屋的楼层,是否有电梯,房屋的年代,门锁情况,绿化情况这些项
在这里插入图片描述
如何获取这些元素的对应标签然后把他们提取出来呢?浏览器按F12进入源代码模式
在这里插入图片描述

所以我们的思路是:

  1. 访问自如公寓的网站,获得每个房间后面的数字号
  2. 根据数字号访问房屋的直接信息,然后抓取房屋的信息方法哦excel表中
  3. 确定所要提取的具体信息,针对本项目是房屋的名称,房屋的面积,房屋的朝向,房屋的户型,房屋的位置,房屋的楼层,是否有电梯,房屋的年代,门锁情况,绿化情况
  4. 摁f12进入源代码模式,查看各个元素对应的信息
    通过查看可以知道
  • 房屋详情信息< a href=“dd//wh.ziroom.com/x/741955798.html” target="_blank"> 房屋名称< /a >
    在这里插入图片描述

  • 房屋的名称
    在这里插入图片描述

  • 房屋的面积、房屋的朝向、房屋的户型
    在这里插入图片描述

  • 房屋的位置、房屋的楼层、是否有电梯、 房屋的年代、门锁情况、绿化情况
    在这里插入图片描述
    总体代码如下:

import requests
from bs4 import BeautifulSoup
import random
import time 
import csv 

##这里增加了多个user_agent(用户代理),防止被反爬虫识别
#每次访问的时候随机选择一个UA头
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 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)"]


def get_info(start,end):
    csvheader=['名称','面积','朝向','户型','位置','楼层','是否有电梯','建成时间',
                ' 门锁','绿化']
    with open('wuhan_ziru.csv','a+',newline='')as csvfile:
        writer=csv.writer(csvfile)
        writer.writerow(csvheader)
        for i in range(start,end):#总共有50页
            print('正在爬取第%s页'%i)
            timelist=[1,2,3]
            print('休息一下下辣')
            time.sleep(random.choice(timelist)) #随机休息1~3秒,方式给对方服务器太大压力
            url=url='https://wh.ziroom.com/z/p%s/'%i
            headers={'User-Agent':random.choice(user_agent)}
            r = requests.get(url, headers=headers)
            r.encoding = r.apparent_encoding
            soup=BeautifulSoup(r.text,'lxml')
            all_info=soup.find_all('div',class_='info-box')
            print('开始干活咯')
            for info in all_info:
                href=info.find('a')
                if href!=None:
                    href='https:'+href['href']
                    try:
                        print('正在爬取%s'%href) #提取到的形式为wh.ziroom.com/x/741955798.html
                        house_info=get_house_info(href)
                        writer.writerow(house_info)
                    except:
                        print('出错啦,%s进不去啦( •̥́ ˍ •̀ू )'%href)

def get_house_info(href):
    #获得房屋的信息
    time.sleep(1)
    headers = {'User-Agent': random.choice(user_agent)}
    response = requests.get(url=href, headers=headers)
    response=response.content.decode('utf-8', 'ignore')
    soup = BeautifulSoup(response, 'lxml')
    #房屋名称
    name=soup.find('h1',class_='Z_name').text
    #房屋的面积、房屋的朝向、房屋的户型
    sinfo=soup.find('div', class_='Z_home_b clearfix').find_all('dd')
    area=sinfo[0].text
    orien=sinfo[1].text
    area_type=sinfo[2].text
    # 房屋的位置、房屋的楼层、是否有电梯、 房屋的年代、门锁情况、绿化情况
    dinfo=soup.find('ul',class_='Z_home_o').find_all('li')
    location=dinfo[0].find('span',class_='va').text
    loucen=dinfo[1].find('span',class_='va').text
    dianti=dinfo[2].find('span',class_='va').text
    niandai=dinfo[3].find('span',class_='va').text
    mensuo=dinfo[4].find('span',class_='va').text
    lvhua=dinfo[5].find('span',class_='va').text
    room_info=[name,area,orien,area_type,location,loucen,dianti,niandai,mensuo,lvhua]
    return room_info


if __name__ == '__main__':
    get_info(1,3)#只爬取了前两页
    print('结束了!')

在这里插入图片描述
在这里插入图片描述


4.2 实践一:36kr信息抓取与邮件发送

爬取36kr的信息然后通过电脑端A账户发送,并在手机端用B接收
具体路径是:python爬虫–>通过邮件A发送–>服务器—>通过邮件B接收
36kr官网:https://36kr.com/newsflashes

使用python发送邮件需要获得pop3授权码,具体获取方式可参考:

https://blog.csdn.net/wateryouyo/article/details/51766345

接下来对36Kr网站进行爬取
在这里插入图片描述
可以发现消息标签为消息称字节跳动旗下懂车帝将推线下体验店
在这里插入图片描述
因此代码为

import requests
import random 
from bs4 import BeautifulSoup
import smtplib#发送邮件模块
from email.mime.text import MIMEText #定义邮件内容
from email.header import Header #定义邮件标题

#---------------------------发送邮件设置------------------------#
#配置邮件发送信息
smtpserver='smtp.qq.com'

#发送邮箱用户密码
user='邮箱账户,此处需要用QQ邮箱'
password='邮箱授权码,注意不是邮箱密码,授权码获取参考https://service.mail.qq.com/cgi-bin/help?subtype=1&&no=1001256&&id=28'

#发送和接收邮箱
sender='上面设置的用于发送的QQ邮箱'
receive='由于接受的邮箱'

def send_email(content):
    #通过QQ邮箱发送
    title='36kr快讯'
    subject = title
    msg = MIMEText(content, 'html', 'utf-8')
    msg['Subject'] = Header(subject, 'utf-8')
    msg['From'] = sender
    msg['To'] = receive
    # SSL协议端口号要使用465
    smtp = smtplib.SMTP_SSL(smtpserver, 465)  # 这里是服务器端口!
    # HELO 向服务器标识用户身份
    smtp.helo(smtpserver)
    # 服务器返回结果确认
    smtp.ehlo(smtpserver)
    # 登录邮箱服务器用户名和密码
    smtp.login(user, password)
    smtp.sendmail(sender, receive, msg.as_string())
    smtp.quit()
    

#---------------------爬虫---------------------#
#这里增加了很多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 Version/11.11",
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)",
    "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)"]

def main():
    print('正在爬数据')
    url='https://36kr.com/newsflashes'
    headers={'User-absAgent':random.choice(user_agent)}
    response=requests.get(url,headers=headers)
    response=response.content.decode('utf-8','ignore')
    soup=BeautifulSoup(response,'lxml')
    '''
    <a class="item-title" rel="noopener noreferrer" target="_blank"
    href="/newsflashes/1292246690482567" sensors_operation_list="page_flow">
    消息称字节跳动旗下懂车帝将推线下体验店</a>
    '''
    news = soup.find_all('a', class_='item-title')  
    news_list=[]
    for i in news:
        title=i.get_text()
        href='https://36kr.com'+i['href']
        news_list.append(title+'<br>'+href)
    info='<br></br>'.join(news_list)
    print('正在发送信息')
    send_email(info)
    print('发送完毕')
    
    
main()

最终在另一个邮箱中接收到的结果
在这里插入图片描述

标签:task5,python,Mozilla,爬虫,Windows,import,NT,find,4.0
来源: https://blog.csdn.net/a8689756/article/details/118295942

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有