Datawhale 爬虫实战打卡(一)

爬虫前置知识

网络连接

可以简单的理解为由客户端和服务器组成,由客户端发出请求(requests),服务器在接收后返回一个响应(response)

爬虫的原理就是模拟浏览器对目标网站发送请求,然后从网站返回的数据中提取有用的数据,并将有用的数据存放于数据库或文件中。
即如下三大步骤:
1.向服务器发起Request请求
2.接收服务器端的Response内容并解析、提取所需的信息
3.存储数据

HTTP协议

HTTP是一个客户端(用户)和服务器端(网站)之间进行请求和应答的标准。通过使用网页浏览器、网络爬虫或者其他工具,客户端可以向服务器上的指定端口(默认端口为80)发起一个HTTP请求。这个客户端成为客户代理(user agent)。应答服务器上存储着一些资源码,比如HTML文件和图像。这个应答服务器成为源服务器(origin server)。在用户代理和源服务器中间可能存在多个“中间层”,比如代理服务器、网关或者隧道(tunnel)。尽管TCP/IP是互联网最流行的协议,但HTTP中并没有规定必须使用它或它支持的层。

网页基础

网页组成

因为我们爬取数据的对象是网页,因此在爬取数据前,我们必须对网页的组成有一定的认识。

通常来说,网页是由 HTML 、 CSS 、JavaScript 组成的。

HTML 是用来搭建整个网页的骨架,而 CSS 是为了让整个页面更好看,包括我们看到的颜色,每个模块的大小、位置等都是由 CSS 来控制的, JavaScript 是用来让整个网页“动起来”,这个动起来有两层意思,一层是网页的数据动态交互,还有一层是真正的动,比如我们都见过一些网页上的动画,一般都是由 JavaScript 配合 CSS 来完成的。

通常我们进入一个网页后可以用快捷键F12打开开发者工具,并在其中的Elements和Network部分中寻找我们需要的信息。Elements包含了网页的源代码(HTML代码),其本身含有我们在爬取数据时需要用到的信息。

  • Chrome的开发者模式为用户提供了下面几组工具。
    • Elements:允许用户从浏览器的角度来观察网页,用户可以借此看到Chrome渲染页面所需要的HTML、CSS和DOM(Document Object Model)对象。

    • Network:可以看到网页向服务气请求了哪些资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。

    • Source:即源代码面板,主要用来调试JavaScript。

    • Console:即控制台面板,可以显示各种警告与错误信息。在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell在页面上与JavaScript交互。

    • Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事情来提高页面运行时的性能。

    • Memory:这个面板可以提供比Performance更多的信息,比如跟踪内存泄漏。

    • Application:检查加载的所有资源。

    • Security:即安全面板,可以用来处理证书问题等。

HTML DOM

在 HTML 中,所有标签定义的内容都是节点,它们构成了一个 HTML DOM 树。其中的html,head,body,h1等均被定义为节点,并构成从属关系,如下所示
Alt
节点树中的节点彼此拥有层级关系。

父(parent)、子(child)和同胞(sibling)等术语用于描述这些关系。父节点拥有子节点。同级的子节点被称为同胞(兄弟或姐妹)。

在节点树中,顶端节点被称为根(root),每个节点都有父节点、除了根(它没有父节点),一个节点可拥有任意数量的子同胞是拥有相同父节点的节点。

requests库

get函数

import requests
url = 'https://www.python.org/dev/peps/pep-0020/'
res = requests.get(url)
text = res.text
text

通过导入requests库并调用函数,运行后可以发现text中的内容与开发者工具下的Elements中相同

我们可以通过find()函数定位字符串中某些特定字符的位置来爬取我们所需要的特定内容

通常来说,我们会在调用get函数时同时传入headers,以避免被服务器拒绝访问。我们可以在Network中任意选中一项并通过headers属性来查看headers信息。
translate1.png

headers={
    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
}#User-Agent会告诉网站服务器,访问者是通过什么工具来请求的,如果是爬虫请求,一般会拒绝,如果是用户浏览器,就会应答。

res = requests.get(url,headers)
    

实践:爬取豆瓣top250电影

我们此次的目标是爬取豆瓣中top250电影的名字和对应的图片,因此我们首先应在Elements中定位我们所需要的信息(可以使用Ctrl + Shift + C 快速定位元素对应的网页源代码)
定位电影名称
定位图片位置

我们观察出电影的名称和图片链接可以通过‘alt’来快速定位

然后我们浏览网页可以发现一页上只有25部电影,并且在换页时我们网页的URL发生了改变:

	第二页的URL:https://movie.douban.com/top250?start=25&filter=
	第三页的URL:https://movie.douban.com/top250?start=50&filter=

观察可以发现URL中start的值规律性改变,因此我们可以通过参数值来定位网页的页数,并需要构造列表进行遍历从而实现访问整个TOP250电影的网页。

接下来我们可以同requests库中的get函数来获取我们需要的信息并以指定的格式来进行存储,代码如下:

import requests
import os

#建立存储图片的文件夹
if not os.path.exists('image'):
     os.mkdir('image')
     
#通过get函数来获取我们需要的信息
def parse_html(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36"}
    res = requests.get(url, headers=headers)
    text = res.text
    item = []
    for i in range(25):
        text = text[text.find('alt')+3:]
        item.append(extract(text))
    return item

#提取其中关于电影名称和图片地址的信息       
def extract(text):
    text = text.split('"')
    name = text[1]  
    image = text[3]
    return name, image

#将电影名称保存进txt文本文档,并保存对应的img图片
def write_movies_file(item, stars):
    print(item)
    with open('douban_film.txt','a',encoding='utf-8') as f:
        f.write('排名:%d\t电影名:%s\n' % (stars, item[0]))
    r = requests.get(item[1])
    with open('image/' + str(item[0]) + '.jpg', 'wb') as f:
        f.write(r.content)
        
def main():
    stars = 1
    #构建列表循环全部需要访问的网页
    for offset in range(0, 250, 25):
        url = 'https://movie.douban.com/top250?start=' + str(offset) +'&filter='
        for item in parse_html(url):
            write_movies_file(item, stars)
            stars += 1

if __name__ == '__main__':
    main()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值