Python编程-爬虫原理与简单实践

一个简单的爬虫是比较初级入门并且也十分有实用价值的东东,例如可以获取一下每天的天气,喜欢看电影的可以爬一爬电影的榜单,复杂一点的可以根据已有的电影爬取封面、信息等。爬虫就是一个这样的东西,可以实现批量的获取我们想要的信息,取代了手工的点点点和选择等操作。

 

开题

我们知道html网页是由标签组成,通常同级并列的信息是位于同一类标签下,例如下面的一个电影网站

左侧是新上映的电影,包括图像 名字和演员,右侧则是排名的榜单。图像和榜单分别位于两个div容器中,一个叫piclist,另一个为title。进一步的查看更细节的信息,看看这个piclist中的li列表元素内容

每个列表中的内容包括一个名字为pic的div容器和一个span元素,分别记录了诸如网页路径,标题,图像路径和演员等信息。正常这些我们都是可以在网页上直接看到的,但是使用爬虫时我们看到的是html文档,并看不到浏览器渲染的界面,此时就需要手动的获取标签中的内容。

再比如一个很多图像的壁纸网站?有很多历史数据的某个网站? 只要是你想要的、不想自己天天手动点或是数目太多操作不过来的,这些问题都是爬虫解决的。

 

爬虫需要什么?

经过前面的一些基本原理,我们大致的能够知道想要爬取信息需要哪些准备

1. 最基本的知道我们想要的目标信息,比如某个网站的图? 网站的数据? 天气?等等

2. 需要获得网站的html文档内容,其内容是由标签组成,了解我们需要的信息在哪些标签中

3. 截取标签的数据,提取其中需要的目标信息

4. 处理获取的数据,是保存到磁盘中?保存到数据库中? 还是显示在窗口中?

万幸的是这里的大部分需要的功能已经有人帮我们完成了。拿python举例子,request可以帮助我们获取html文档内容,Beautiful Soup则是非常专业的网页标签匹配库,可以非常方便的提取指定标签的内容。

 

BS4使用

如何匹配到自己想要的内容是一个技术活,尤其是BS4的使用方法需要熟记于心。这里着实有一些非常容易混淆,且不好捋的地方,我尽量说明的透彻一些。

BS4中所有的匹配项都可以看做一个对象,我们可以继续匹配对象下的其他对象,或者是获取对象的属性内容。

BS4匹配对象的方法是搜索,可以根据标签 或者是对象的某些属性寻找特定的对象,返回对象后我们依旧可以继续对新的对象进行匹配和属性获取。

例如获取div容器中所有的li中的span下的文字,也就是电影名字。

(使用网页初始化bs4,获取网页html文字内容后 soup  = BeautifulSoup(html, 'html.parser') )

步骤应该是这样的:

1. 获取class为piclist的div容器对象

div = soup.find("div")  #匹配所有div对象返回第一个
divs = soup.find_all("div")  #匹配所有div对象 返回可迭代对象

divpiclist = soup.find("div",class_="piclist")  #匹配特定名字的div对象


# 搜索还支持(name,id="XXX")
# find 仅返回第一个 find_all返回所有

# 更为细新奇的时他可以不要求对象的标签类型,仅通过属性匹配
# soup.find_all(class_="XXX")  #匹配所有div对象 返回可迭代对象
# soup.find_all(id="XXX")  #匹配所有div对象 返回可迭代对象
# soup.find_all(attrs={"属性":"值"})  #匹配所有div对象 返回可迭代对象

总之BS4的匹配功能几乎是让你能够匹配到所有的目标对象

2. 获取上一级对象中的所有li元素

# 我们获得了类别为piclist的div容器divpiclist 继续获取下面的所有li元素

lis = divpiclist.find_all('li')  # 没有限定直接获取就可以

3. 获取所有li元素中的span标签的元素

# lis包含所有的li对象,我们要获取的是每个li的span对象的文字内容
for li in lis:
    print(li.span.string)


# 这里涉及访问对象内容的方法 span几乎没有什么属性 img和a标签比较适用
# 方法有3 一会儿会演示
# 第一个是直接通过对象.子对象.属性的方法  一般用于标签内部文字等
# 第二个是通过对象.attrs["属性名"]的方法  attrs是包含对象所有属性的字典
# 第三个是对象["属性名"]

使用BS4切记一点,所有匹配都是对象,而所有得到的对象我们可以继续匹配和获取属性,掌握这个宗旨那么用起来就比较得心应手,不会出现乱了的情况,在命名方面最好使用目标标签命名,这样编程的时候方便识别。下面就实际演示一下这个例子。

 

简单实践

为了稍微有点难度,我们计划获取新的电影的图像和信息,前面已经观察好了网页的html文档结构,我们就直接上手。

from bs4 import BeautifulSoup
import requests
import os

# 这里是第一步 获取html文档 文字内容在text属性中
url = "http://www.656ys.com/"
headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36",
    "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
    "Accept-Encoding": "gzip, deflate, sdch",
}
res = requests.get(url, headers=headers)
print(res.status_code)
res.apparent_encoding  # 可能用到的编码
res.encoding = 'utf-8'



#创建 Beautiful Soup 对象 使用获取的html文档
soup = BeautifulSoup(res.text, 'html.parser')


# 第一步  获取名字为piclist的div对象
piclist = soup.find("div", class_="piclist")


# 第二步  获取div中的所有li对象 返回可迭代对象
lis = piclist.find_all("li")
    # lis = piclist.find_all(class_="pic")   # 可用于获取目标对象的多种方式
    # lis = piclist.find_all(id=X)
    # lis = piclist.find_all(attrs={"class": "pic"})

# 第三步 遍历每个li对象 获取属性等信息
for li in lis:

    aa = li.find_all("a")   # 每个li有两个a标签 第一个是img元素  第二个是名字
    for i in range(2):
        if i == 0:

            # 获取a下面的img标签的src元素
            print(aa[i].img.attrs['src'])  # 第二中获取属性的方法aa[i].img['src']

            # 获取文件名 然后保存到本地
            path = aa[i].img.attrs['src']
            name = os.path.basename(path)
            with open("d:\\"+name, "wb") as f:  # 注意wb二进制写 get获得的二进制数据
                f.write(requests.get(path).content)
        else:

            # 获取标签的文字内容
            print(aa[i].get_text())  #第二种方法 aa[i].string

    # 获取li下面的p标签 其中的文字为演员
    actor = li.find('p')
    print(actor.string)
F:\PROGRAMME\python\python.exe F:/SOFTWARE/编程软件/python/projects/AAA/warm.py
200
http://rpg.pic-imges.com/pic/upload/vod/2019-10/1571315259.jpg
没有秘密的你
戚薇,金瀚,王阳明,黄梦莹
http://tu.tianzuida.com/pic/upload/vod/2019-10-24/201910241571923506.jpg
海棠经雨胭脂透
邓伦,李一桐,方中信,应昊茗
http://tu.tianzuida.com/pic/upload/vod/2019-10-23/201910231571834520.jpg
初恋那件小事
赖冠霖,赵今麦,柴蔚,王润泽
http://rpg.pic-imges.com/pic/upload/vod/2019-10/1571674332.jpg
我的机器人男友
姜潮,毛晓彤,李小冉,宁理
http://tu.tianzuida.com/pic/upload/vod/2019-10-11/201910111570792595.jpg
光荣时代
张译,黄志忠,潘之琳,薛佳凝
http://rpg.pic-imges.com/pic/upload/vod/2019-10/15699260240.jpg
中国机长
张涵予 欧豪 杜江 袁泉
http://img.weituku.cc/upload/vod/2019-11-03/201911031572786172.png
谁的青春不叛逆
于朦胧,毛晓彤,梁大维,尹淇
http://pic.bdbdtv.com/upload/vod/2019-10-10/15707131274.jpg
满满喜欢你
鲁照华,刘昱晗,谢治勋,韩昕妤
http://pic.bdbdtv.com/upload/vod/2019-10-08/15705378481.jpg
学警旋风
隋雨蒙,刘潮,李柏谊
http://img.weituku.cc/upload/vod/2019-10-17/201910171571273518.png
一马三司令
张明建,苏丽,李君峰,丁柳元

下载的图像

 

总结

爬虫还是一个涉及比较广的,一个完善一些的爬虫势必会涉及验证,异常处理,文件访问,数据库操作和编码等一些问题。但是爬虫的基本原理还是比较简单,做一些小东西也还是比较有意思的,多动手才是快速提升的捷径。

一个爬虫需要注意的点包括以下这几个:

1. 注意返回的html是否出现乱码,要使用正确的编码方法,如果在多个网页抓信息,注意好网站网址的规则或是根据抓取的信息得到新的网址。

2. 根据目标便签和属性使用BS4匹配到它,有时候便签可能非常好匹配,有的时候可能需要匹配好几层。但是BS4非常灵活,解决匹配是没有问题的。

3. 获取信息之后就是存储问题,注意处理好数据的信息,格式尽量统一,否则用的时候就很头疼。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或 EJBs。 Quartz的优势: 1、Quartz是一个任务调度框架(库),它几乎可以集成到任何应用系统中。 2、Quartz是非常灵活的,它让您能够以最“自然”的方式来编写您的项目的代码,实现您所期望的行为 3、Quartz是非常轻量级的,只需要非常少的配置 —— 它实际上可以被跳出框架来使用,如果你的需求是一些相对基本的简单的需求的话。 4、Quartz具有容错机制,并且可以在重启服务的时候持久化(”记忆”)你的定时任务,你的任务也不会丢失。 5、可以通过Quartz,封装成自己的分布式任务调度,实现强大的功能,成为自己的产品。6、有很多的互联网公司也都在使用Quartz。比如美团 Spring是一个很优秀的框架,它无缝的集成了Quartz,简单方便的让企业级应用更好的使用Quartz进行任务的调度。   课程说明:在我们的日常开发中,各种大型系统的开发少不了任务调度,简单的单机任务调度已经满足不了我们的系统需求,复杂的任务会让程序猿头疼, 所以急需一套专门的框架帮助我们去管理定时任务,并且可以在多台机器去执行我们的任务,还要可以管理我们的分布式定时任务。本课程从Quartz框架讲起,由浅到深,从使用到结构分析,再到源码分析,深入解析Quartz、Spring+Quartz,并且会讲解相关原理, 让大家充分的理解这个框架和框架的设计思想。由于互联网的复杂性,为了满足我们特定的需求,需要对Spring+Quartz进行二次开发,整个二次开发过程都会进行讲解。Spring被用在了越来越多的项目中, Quartz也被公认为是比较好用的定时器设置工具,学完这个课程后,不仅仅可以熟练掌握分布式定时任务,还可以深入理解大型框架的设计思想。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值