爬虫编程入门实践(Day 1)

基础知识

HTTP

HTTP是一个客户端(用户)和服务器端(网站)之间进行请求和应答的标准。
HTTP的请求方法有多种,其中最常用的包括以下8种:

请求 说明
GET 向指定的资源发出“显示”请求。GET方法应该只用于读取数据,而不应当被用于“副作用”的操作中(例如在Web Application中)。其中一个原因是GET可能会被网络蜘蛛等随意访问。
HEAD 不传输内容,获取关于该资源的信息
POST 创建新的资源或修改现有资源,或二者皆有。
PUT 向指定资源位置上传输最新内容。
DELETE 请求服务器删除Request-URL所标识的资源,或二者皆有。
TRACE 回显服务器收到的请求,主要用于测试或诊断。
OPTIONS 这个方法可使服务器传回该资源所支持的所有HTTP请求方法。用“*”来代表资源名称向Web服务器发送OPTIONS请求,可以测试服务器共能是否正常。
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的连接(经由非加密的HTTP代理服务器)。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed),当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。

网页基础

网页组成

网页是由 HTML 、 CSS 、JavaScript 组成的。
HTML 是用来搭建整个网页的骨架,而 CSS 是为了让整个页面更好看,包括我们看到的颜色,每个模块的大小、位置等都是由 CSS 来控制的, JavaScript 是用来让整个网页“动起来”,这个动起来有两层意思,一层是网页的数据动态交互,还有一层是真正的动,比如我们都见过一些网页上的动画,一般都是由 JavaScript 配合 CSS 来完成的。
要查看以上内容,可以开 Chrome 浏览器,访问博客站的首页,打开 F12 开发者工具。

在选项 Elements 中可以看到网页的源代码,这里展示的就是 HTML 代码。不同类型的文字通过不同类型的标签来表示,如图片用 <img> 标签表示,视频用 <video> 标签表示,段落用 <p> 标签表示,它们之间的布局又常通过布局标签 <div> 嵌套组合而成,各种标签通过不同的排列和嵌套才形成了网页的框架。在右边 Style 标签页中,显示的就是当前选中的 HTML 代码标签的 CSS 层叠样式,“层叠”是指当在HTML中引用了数个样式文件,并且样式发生冲突时,浏览器能依据层叠顺序处理。“样式”指网页中文字大小、颜色、元素间距、排列等格式。而 JavaScript 就厉害了,它在 HTML 代码中通常使用 <script> 进行包裹,可以直接书写在 HTML 页面中,也可以以文件的形式引入。

网页结构

手写一个简单的HTML页面:

  1. 首先创建一个文本文件,后缀名为.html
  2. 写入如下内容
<!DOCTYPE  html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Demo</title>
    </head>
    <body>
        <div id="container">
            <div class="wrapper">
                <h1>Hello World</h1>
                <div>Hello Python.</div>
            </div>
        </div>
    </body>
</html>

整个 HTML 文档一般分为 head 和 body 两个部分,在 head 头中,我们一般会指定当前的编码格式为 UTF-8 ,并且使用 title 来定义网页的标题,这个会显示在浏览器的标签上面。
body 中的内容一般为整个 html 文档的正文,html的标签由<h1>到<h6>六个标签构成,字体由大到小递减,换换行标签为<br>,链接使用<a>来创建,herf属性包含链接的URL地址。

<a href="http://www.baidu.com" >一个指向百度的链接</a>

HTML DOM

在 HTML 中,所有标签定义的内容都是节点,它们构成了一个 HTML DOM 树。
根据 W3C 的 HTML DOM 标准,HTML 文档中的所有内容都是节点:

  • 整个文档是一个文档节点
  • 每个 HTML 元素是元素节点
  • HTML 元素内的文本是文本节点
  • 每个 HTML 属性是属性节点注释是注释节点
    在这里插入图片描述

CSS

大多数原色的属性以“名称-值”的形式成对出现,由“=”连接并写在开始标签元素名之后。值一般由单引号或双引号包围,有些值的内容包含特定字符,在html中可以去掉引号。不加引号的属性值被认为是不安全的。要注意的是,许多元素存在一些共同的属性:

  • id 属性为元素提供在全文档内的唯一标识。它用于识别元素,以便样式表可以改变其外观属性,脚本可以改变、显示或删除其内容或格式化。对于添加到页面的url,它为元素提供了一个全局唯一识别,通常为页面的子章节。
  • class 属性提供了一种将类似元素分类的方式,常被用于语义化或格式化。例如,一个html文档可以指定class="标记"来表明所有具有这一类值得元素都属于文档的主文本。格式化后,这样的元素可能会聚集在一起,并作为页面脚注而不会出现在html代码中。类值也可以多值声明。如class="标记 重要"将元素同时放入“标记”与“重要”两类中。
  • style 属性可以将表现性质赋予一个特定原色。比起使用id或class属性从样式表中选择元素,“style”被认为是一个更好的做法。
  • tile 属性用于给元素一个附加的说明。大多数浏览器中这一属性显示为工具提示。

更多关于html和css的知识可以在菜鸟教程查看

使用开发者工具检查网页

可以选择“菜单”中的“更多工具”→→“开发者工具”,也可以直接在网页内容中右击并选择“检查”选项,还可以按f12键。
Chrome的开发者模式为用户提供了下面几组工具。

  • Elements:允许用户从浏览器的角度来观察网页,用户可以借此看到Chrome渲染页面所需要的HTML、CSS和DOM(Document Object Model)对象。
  • Network:可以看到网页向服务气请求了哪些资源、资源的大小以及加载资源的相关信息。此外,还可以查看HTTP的请求头、返回内容等。
  • Source:即源代码面板,主要用来调试JavaScript
  • Console:即控制台面板,可以显示各种警告与错误信息。在开发期间,可以使用控制台面板记录诊断信息,或者使用它作为shell在页面上与JavaScript交互。
  • Performance:使用这个模块可以记录和查看网站生命周期内发生的各种事情来提高页面运行时的性能。
  • Memory:这个面板可以提供比Performance更多的信息,比如跟踪内存泄漏。
  • Application:检查加载的所有资源。
  • Security:即安全面板,可以用来处理证书问题等。

requests库

一个网络爬虫程序最普遍的过程:访问站点;定位所需的信息;得到并处理信息。
是python公认的爬取网站最好的第三方库
方法说明:

  • requests.request()构造一个请求,支撑以下各方法的基础方法
  • requests.get()获取HTML网页的主要方法,对应于HTTP的GET
  • requests.head()获取HTML网页头信息的方法,对应于HTTP的HEAD
  • requests.post()向HTML网页提交POST请求的方法,对应于HTTP的POST
  • requests.put()向HTML网页提交PUT请求的方法,对应于HTTP的PUT
  • requests.patch()向HTML网页提交局部修改请求,对应于HTTP的PATCH
  • request.delete()向HTML页面提交删除请求,对应于HTTP的DELETE

爬取豆瓣电影

爬取URL信息的重点在于对于原网站的HTML分析和需要元素的定位查找 ctrl+shift+c

import requests
import os

# 创建图片存储文件夹
if not os.path.exits('image'):
    os.mkdir('image')

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:] 
        #一个页面里有25个alt
        item.append(extract(text))
    return item
    
def extract(text):
    text = text.split('"')
    name = text[1]
    image = text[3]
    return name, image
    
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; # 排名
    # 分析网页页面得出每个页面25个电影内容
    for offset in range(0, 250, 25):
        url = 'http://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()

使用api

所谓的采集网络数据,并不一定必须从网页中抓取数据,而api(Application Programming Iterface)的用处就在这里:API为开发者提供了方便友好的接口,不同的开发者用不同的语言都能获取相同的数据。目前API一般会以XML(Extensible Markup Language,可拓展标记语言)或者JSON(JavaScript Object Notation)格式来返回服务器响应,其中JSON数据格式越来越受到人们的欢迎。

JavaScript与AJAX技术

如果利用Requests库和BeautifulSoup来采集一些大型电商网站的页面,可能会发现一个令人疑感的现象,那就是对于同一个URL、同一个页面,抓取到的内容却与浏览器中看到的内容有所不同。比如有的时候去寻找某一个<div>元素,却发现Python程序报出异常,查看requests.get()方法的响应数据也没有看到想要的元素信息。这其实代表着网页数据抓取的一个关键问题——开发者通过程序获取到的HTTP响应内容都是原始的HTML数据,但浏览器中的页面其实是在HTML的基础上,经过JavaScript进一步加工和处理后生成的效果。比如淘宝的商品评论就是通过JavaScript获取JSON数据,然后“嵌入”到原始HTML中并呈现给用户。这种在页面中使用JavaScript的网页对于20世纪90年代的web界面而言几乎是天方夜测,但在今天,以AJAX(Asynchronous JavaScript and XML,异步JavaScript与XML)技术为代表的结合JavaScript、CSS、HTML等语言的网页开发技术已经成为绝对的主流。

为了避免为每一份要呈现的网页内容都准备一个HTML,网站开发者们开始考虑对网页的呈现方式进行变革。在JavaScript问世之初,Google公司的Gmail邮箱网站是第一个大规模使用JavaScript加载网页数据的产品,在此之前,用户为了获取下一页的网页信息,需要访问新的地址并重新加载整个页面。但新的Gmail则做出了更加优雅的方案,用户只需要单击“下一页”按钮,网页就(实际上是浏览器)会根据用户交互来对下一页数据进行加载,而这个过程并不需要对整个页面(HTML)的刷新。换句话说,JavaScript使得网页可以灵活地加载其中一部分数据。后来,随着这种设计的流行,“AJAX”这个词语也成为一个“术语”,Gmail作为第一个大规模使用这种模式的商业化网站,也成功引领了被称之为“Web2.0”的潮流。

发布了14 篇原创文章 · 获赞 4 · 访问量 4328

猜你喜欢

转载自blog.csdn.net/Zhuanzhu22nian/article/details/105654823