手把手教你入门Python爬虫(一)

本文是Python爬虫入门教程,讲解了浏览器如何帮助浏览网页以及爬虫的基本构思。通过实例展示了如何爬取豆瓣Top250电影信息,适合有一定Python基础的读者学习。
摘要由CSDN通过智能技术生成

手把手教你入门Python爬虫

前言

  本文通过介绍基本的html、计算机网络等知识,带领读者了解访问网页时发生了什么;并通过“爬取豆瓣Top250电影信息”的项目,向读者展示了一个最基本的爬虫过程。本文适合作为读者入门爬虫的文章,需要读者有一定的Python语法基础(包括但不限于条件判断、循环语句、定义函数、基本数据类型、函数调用等知识)。
  作者的开发环境如下:

  • Python 3.8.1
  • IDE: Pycharm Community 2020.1.4

目录

  • 浏览器是如何帮助我们浏览网页的
  • 爬虫的基本构思
  • “爬取豆瓣Top250电影信息”项目
  • 致谢

1. 浏览器是如何帮助我们浏览网页的

  我们日常使用浏览器时,只需在浏览器最上方的地址栏输入目标网址,按下回车,即可访问一个网页。看似简单的一个操作,其实暗藏了许多繁琐的步骤。下面,我们通过一个简单的例子,来了解浏览器帮助我们完成了哪些操作:

  • 假设小明要访问百度网站,他在Chrome浏览器的地址栏输入了
    https://www.baidu.com/,并按下了回车
    在这里插入图片描述
  • 浏览器查找自身的DNS缓存,希望找到"https://www.baidu.com/" 对应的IP地址。(假设浏览器在自身DNS缓存中找到,但已过期)
  • 浏览器查询操作系统的DNS缓存,希望找到"https://www.baidu.com/" 对应的IP地址。(假设浏览器在操作系统的DNS缓存中未找到)
  • 浏览器查询本机的hosts文件,试图从中找到"https://www.baidu.com/" 对应的IP地址。(假设浏览器并未找到)
  • 浏览器发起一个DNS系统调用,向本地配置的首选DNS服务器发起域名解析请求,即请求"https://www.baidu.com/" 对应的IP地址。举例几个DNS服务器:

阿里DNS: 180.76.76.76
百度DNS: 223.5.5.5
谷歌DNS: 8.8.8.8

  • DNS服务器查询到了"https://www.baidu.com/" 对应的IP地址,并返回给浏览器
  • 浏览器通过TCP/IP协议,借助上一步收到的IP地址和服务器端默认端口80,向目标服务器建立连接即三次握手
  • 浏览器向服务器发送HTTP请求。(如果使用Chrome浏览器,可以通过"自定义及控制"->“更多工具”->“开发者工具”->"Network"查看具体请求信息)

部分请求信息-1
部分请求信息-2

Status Code:状态码,200代表成功与目标服务器建立连接;404代表服务器无反应;418代表触发了反爬机制,禁止访问
User-Agent:用户代理,即小明使用的浏览器告诉目标服务器,我们是哪种浏览器(小明使用的浏览器是Chrome,但Chrome却告诉目标服务器,我是Mozilla等等浏览器,这里出现的问题与各大浏览器厂商间的一段爱恨情仇有关,有兴趣的同学可以自行搜索了解)

  • (若连接成功且没有触发服务器的反爬机制)服务器将数据(即html文件)返回给浏览器
  • 浏览器收到index.html文件,开始解析其中的JS和CSS等代码
  • 页面加载、渲染完毕
  • 关闭TCP连接即四次挥手

  至此,即完成了一个简单的浏览网页过程,可以看出。浏览器主要的工作是将用户输入的URL映射到IP地址;与服务器建立连接;传输数据;解析数据以及关闭连接。
  下面介绍几个基本的概念:

  • URL:Uniform Resource Locator 即统一资源定位器,即网络地址。例如:http://www/baidu.com/。(URL可以方便人们记忆网站地址,不用背繁琐的IP地址)
  • IP地址:Internet Protocol Address 即互联网协议地址。(类似于门牌号,即在互联网中可以通过IP地址找到唯一对应服务器)
  • HTML:Hyper Text Mark-up Language 即超文本标记语言,是一种制作万维网页面的标准语言
  • DNS:Domain Name System即域名系统,是存在于互联网技术中的一项服务,作为域名(URL)与IP地址映射的一个分布式数据库

2.爬虫的基本构思

  通过第一节,已经了解到,我们看到的网页(即看到的图片、文字等)是存在一个html文件里,通过服务器发送给浏览器,浏览器再解析、展现给我们。
  如果我们把页面保存下载到本地,是不是可以把重要的数据存下来了呢?答案是可以的,但是这种文件内存在着大量的超文本标记语言,不利于我们获取信息。(例如"https://www.baidu.com/"的网页源码如下)
百度搜索主页的部分源码

  假设我们想编写一个JAVA程序,把"https://www.baidu.com/"的网页源码解析、去除超文本标记语言(<!DOCTYPE html><!–STATUS OK–><html>等),只保留页面左上角的所有字符串,即新闻、hao123、地图、视频、贴吧、学术、更多,这7个字符串,并输出到编程语言的控制台。
在这里插入图片描述

  有一种思路可能是:把html文本转换格式成txt(内容不会变),把txt按行读取到Java中的变量,再编写一个函数(输入字符串,内部通过判断字符串两端是否含有"<"、">",输出该字符串是否为超文本标记语言),循环遍历所有的字符串,借用函数判断该字符串是否为超文本标记语言(如果是,则删去),对留下的字符串进行输出。
  上述构思符合多数只入门了编程语言的同学,看似合理,其实输出后的内容与我们的预期大不相同,其中有一点原因就是:去除超文本标记语言后,页面仍有许多其他信息,比如<head>标签下有一个<title>标签,里面有如下信息:
页面信息

  因此我们希望有一个近乎完美的工具,能够帮我们自动获取服务器的html文件,并解析、去除超文本标记语言(只留下文本),并按要求自动筛取数据。此时,这个工具便是爬虫了! 一个简单的爬虫程序基本分为以下几步:

  • 模拟人为操作,模拟浏览器操作,将URL地址转换为IP地址,向服务器发送请求
  • 将服务器返回的html文件读入内存,解析网页源码
  • 按照一定的规律,去除超文本标记语言,只保存指定数据
  • 将数据保存至excel文件或数据库

3. “爬取豆瓣Top250电影信息”项目

  通过上文的介绍,我们已经基本熟悉了爬虫项目的架构,那么下面我们就从一个最简单的例子,来学习编写爬虫。

  • 建立一个文件夹"爬虫",在文件夹下建立一个Python文件,命名为:爬取豆瓣数据.py
  • 观察豆瓣网址"https://movie.douban.com/top250?start=“的源码
    豆瓣网址源码
      该网页基本由两个大标签head和body构成,而我们要获取的电影信息(例如导演信息),均在body标签下的标签下的…的标签下:
    body标签内容-1
    body标签内容-2
      此时我们跳转到显示排26-50名电影的第二页,发现网页源码为:“https://movie.douban.com/top250?start=25&filter=”,如果我们编辑这个URL,把最后的”&filter="删掉,再按回车,发现仍能正常访问网页。
      通过上述操作,我们能发现一个规律,显示豆瓣Top250电影信息的10张网页的URL只有"start="后的参数不同,而且这个参数是25的倍数。(这条规律会在下文批量生成URL连接用到)
  • 编写如下程序用以加载我们爬虫程序会用到的工具库,这些库在下文应用时会具体讲解
# 加载包
import bs4     # 网页解析,获得数据
import re      # 正则表达式,进行文字匹配
import urllib.request,urllib.error    # 指定URL,获取网页数据
import xlwt    # 进行excel操作
from bs4 import BeautifulSoup
  • 根据前面的学习,我们此次项目基本需要编写以下几个函数:
# 主函数,用于调用各个函数
def main():
# 爬取网页获取数据函数,输入一个url地址,返回解析、去除无关信息后的数据
def getData(baseurl):
# 得到指定一个URL的网页内容(html文件)的数据,输入一个url地址
def 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值