2019/10/28更新

  • 使用Python3,而不再是Python2

转载请注明出处:https://blog.csdn.net/aaronjny/article/details/77945329

爬虫入门系列教程:

  • python爬虫入门教程(一):开始爬虫前的准备工作

  • python爬虫入门教程(二):开始一个简单的爬虫

  • python爬虫入门教程(三):淘女郎爬虫 ( 接口解析 | 图片下载 )

  • 等待更新…


上一篇讲了开始爬虫前的准备工作。当我们完成开发环境的安装、IDE的配置之后,就可以开始开发爬虫了。 这一篇,我们开始写一个超级简单的爬虫。

1.爬虫的过程分析

当人类去访问一个网页时,是如何进行的?
  ①打开浏览器,输入要访问的网址,发起请求。
  ②等待服务器返回数据,通过浏览器加载网页。
  ③从网页中找到自己需要的数据(文本、图片、文件等等)。
  ④保存自己需要的数据。

对于爬虫,也是类似的。它模仿人类请求网页的过程,但是又稍有不同。
  首先,对应于上面的①和②步骤,我们要利用python实现请求一个网页的功能。
  其次,对应于上面的③步骤,我们要利用python实现解析请求到的网页的功能。
  最后,对于上面的④步骤,我们要利用python实现保存数据的功能。
  因为是讲一个简单的爬虫嘛,所以一些其他的复杂操作这里就不说了。下面,针对上面几个功能,逐一进行分析。

2.如何用python请求一个网页

作为一门拥有丰富类库的编程语言,利用python请求网页完全不在话下。这里推荐一个非常好用的第三方类库requests。

2.1 requests

2.1.1 安装方式

打开终端或者cmd,在里面输入以下指令并回车

pip3 install requests


  一般不会出什么问题,如果下载太慢,是因为pip使用的源服务器在国外,可以设置pip使用国内镜像源,设置方法可以参考PyPI使用国内源。

2.1.2 测试是否安装成功

在命令行中输入python,敲击回车,进入python交互环境。在里面输入以下代码并回车:

import requests

如果不报错,就安装成功了,如下图:
  

2.2 使用requests请求网页

打开pycharm,创建一个项目,嗯,随便取个名字吧。
  
  创建成功后,再创建一个py文件,用来写代码。嗯,再随便取个名字= =教程(二)的2.2,那就spider_2_2_2吧。
  
  在里面输入以下代码:

#coding=utf-8
import requestsresp=requests.get('https://www.baidu.com') #请求百度首页
print(resp) #打印请求结果的状态码
print(resp.content) #打印请求到的网页源码

对上面的代码进行以下简单的分析:
  我是用的是python2.7,第1行到第4行,都是为了将字符编码设置为utf8
  第2行:引入requests包。
  第4行:使用requests类库,以get的方式请求网址https://www.baidu.com,并将服务器返回的结果封装成一个对象,用变量resp来接收它。
  第5行:一般可以根据状态码来判断是否请求成功,正常的状态码是200,异常状态码就很多了,比如404(找不到网页)、301(重定向)等。
  第6行:打印网页的源码。注意,只是源码。不像是浏览器,在获取到源码之后,还会进一步地取请求源码中引用的图片等信息,如果有JS,浏览器还会执行JS,对页面显示的内容进行修改。使用requests进行请求,我们能够直接获取到的,只有最初始的网页源码。也正是因为这样,不加载图片、不执行JS等等,爬虫请求的速度会非常快。
  代码很短吧?一行就完成了请求,可以,这很python
  现在,运行一下代码看看吧。
  
  箭头指向的是状态码,可以看到,200,请求正常。
  被圈起来是网页的源码。

3.如何用python解析网页源码

网页源码我们拿到了,接下来就是要解析了。python解析网页源码有很多种方法,比如BeautifulSoup、正则、pyquery、xpath等。这里我简单介绍一下。

3.1 网页源码解析器

3.1.1 BeautifulSoup

这是我比较推荐的一款解析器,简单易用,容易理解。
  但是使用bs4还需要安装另一个类库lxml,用来代替bs4默认的解析器。之所以这样做,是因为默认的那个实在太慢了,换用了lxml后,可以大幅度提升解析速度。

3.1.1.1 安装

命令行中输入以下指令并回车,安装bs4:

pip3 install beautifulsoup4


  使用pip直接安装lxml会出错,所以要用些特别的方法。Windows用户的话,去百度搜一下lxml在Windows环境下的安装方法,网上有很多,我就不多说了(主要是嫌麻烦= =)。Ubuntu用户就很方便了,在终端里面输入以下指令并回车就行了:

apt-get install python-lxml

3.1.1.2 测试是否安装成功

进入python交互环境,引用bs4和lxml类库,不报错即安装成功。

import bs4
import lxml

3.1.2 正则

这个不用安装,标准库里带的就有。
  正则的优点:①速度快 ②能够提取有些解析器提取不到的数据
  正则的缺点:①不够直观,很难从面向对象的角度来考虑数据的提取 ②你得会写正则表达式
  教程就不放了,善用百度嘛。正则一般用来满足特殊需求、以及提取其他解析器提取不到的数据,正常情况下我会用bs4,bs4无法满足就用正则。
  当然了,如果你喜欢,全部用正则解析也是没问题的,你喜欢就好= =。

3.1.3 pyquery

这个解析器的语法和jQuery很相似,所以写过jQuery的同学用起来可能比较容易上手。国内有个dalao写的爬虫框架pyspider用的就是这个解析器。
  如果没用过jQuery,那就在bs4和pyquery两个里面选一个学吧,一般情况下会一个就够了。

3.1.3.1 安装

pip3 install pyquery

3.1.3.2 测试

import pyquery

3.2 使用BeautifulSoup+lxml解析网页源码

接着上面的代码来,我们使用BeautifulSoup+lxml解析请求到的网页源码。
  从百度的首页,可以通过点击跳转到很多其他页面,比如说下面圈起来的,点击都会跳转到新的页面:
  
  现在,我们想要用python获得从百度能够跳转到的页面的链接,该怎么做?
  代码很简单,接着上面的写:

#coding=utf-8
import requests
from bs4 import BeautifulSoupresp=requests.get('https://www.baidu.com') #请求百度首页
print(resp) #打印请求结果的状态码
print(resp.content) #打印请求到的网页源码bsobj=BeautifulSoup(resp.content,'lxml') #将网页源码构造成BeautifulSoup对象,方便操作
a_list=bsobj.find_all('a') #获取网页中的所有a标签对象
for a in a_list:print(a.get('href')) #打印a标签对象的href属性,即这个对象指向的链接地址

首先,第3行,引入我们解析时要使用的类库,beautifulsoup4。
  第9行,将网页的源码转化成了BeautifulSoup的对象,这样我们可以向操作DOM模型类似地去操作它。
  第10行,从这个BeautifulSoup对象中,获取所有的a标签对象(大家应该知道a标签对象是什么吧,网页中的链接绝大多数都是a对象实现的),将他们组成一个列表,也就是a_list。
  第11、12行,遍历这个列表,对于列表中的每一个a标签对象,获取它的属性href的值(href属性记录一个a标签指向的链接地址)。获取一个标签对象的属性,可以使用get(‘xx’)方法,比如a_tag是一个a标签对象,获取它的href的值,就是a_tag.get('href'),获取它的class信息可以用a_tag.get('class'),这将返回一个修饰该标签的class列表。
  运行一下,可以看到,打印出了很多链接。
  
  这是个简单的例子,介绍如何开始一个简单爬虫,不涉及复杂操作(复杂的后面会上小项目,会介绍)。关于beautifulsoup的详细用法,请自行百度。

3.3 简单的保存数据的方法

保存数据的方法大概可以分为几类:保存文本、保存二进制文件(包括图片)、保存到数据库。保存二进制文件和保存到数据库后面会具体说,这里简单讲一下怎么保存到文本。
  python里面操作文本相当的简单。现在,我将刚才提取出来的链接保存到一个名称为url.txt的文本里面去,将上面的代码稍作修改。

#coding=utf-8
import requests
from bs4 import BeautifulSoupresp=requests.get('https://www.baidu.com') #请求百度首页
print(resp) #打印请求结果的状态码
print(resp.content) #打印请求到的网页源码bsobj=BeautifulSoup(resp.content,'lxml') #将网页源码构造成BeautifulSoup对象,方便操作
a_list=bsobj.find_all('a') #获取网页中的所有a标签对象
text='' # 创建一个空字符串
for a in a_list:href=a.get('href') #获取a标签对象的href属性,即这个对象指向的链接地址text+=href+'\n' #加入到字符串中,并换行
with open('url.txt','w') as f: #在当前路径下,以写的方式打开一个名为'url.txt',如果不存在则创建f.write(text) #将text里的数据写入到文本中

代码中注释写得很清楚了,就不多做解释了。值得一提的是,使用with…as…来打开文件,在操作完成后,会自动关闭文件,不用担心忘记关闭文件了,超级好用啊!
  运行一下代码,可以发现,当前路径下多了个名为url.txt的文件。
  
  打开后,能够看到我们刚才提取出来的url。
  

4.更多

虽然东西不多,但是写了挺长时间的。因为平时在一边上课,一边实习,时间真的不多,抽着时间一点点写的。后面我尽量加快速度写吧,当然了,尽量嘛,写得慢了的话……你顺着网线过来打我呀~
  我也只是个菜鸟,文中错误的地方,欢迎拍砖~

python爬虫入门教程(二):开始一个简单的爬虫相关推荐

  1. python elasticsearch 入门教程(二) ---全文搜索

    python elasticsearch 入门教程(二) ---全文搜索 截止目前的搜索相对都很简单:单个姓名,通过年龄过滤.现在尝试下稍微高级点儿的全文搜索--一项 传统数据库确实很难搞定的任务. ...

  2. $python爬虫系列(1)——一个简单的爬虫实例

    本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片. 1. 概述 本文主要实现一个简单的爬虫,目的是从一个百度贴吧页面下载图片.下载图片的步骤如下: 获取网页html文本内容: 分析html ...

  3. python爬虫入门教程(非常详细),超级简单的Python爬虫教程

    一.基础入门 1.1什么是爬虫 爬虫(spider,又网络爬虫),是指向网站/网络发起请求,获取资源后分析并提取有用数据的程序. 从技术层面来说就是 通过程序模拟浏览器请求站点的行为,把站点返回的HT ...

  4. ros订阅话题python_ROS入门教程 (写一个简单的消息发布器和订阅器 (Python))

    Note: This tutorial assumes that you have completed the previous tutorials: 创建ROS消息和ROS服务. Descripti ...

  5. python基础教程第三版豆瓣-Python爬虫入门教程:豆瓣读书练手爬虫

    点击蓝字"python教程"关注我们哟! 前言 Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及 ...

  6. Python爬虫入门教程 34-100 掘金网全站用户爬虫 scrapy

    爬前叨叨 已经编写了33篇爬虫文章了,如果你按着一个个的实现,你的爬虫技术已经入门,从今天开始慢慢的就要写一些有分析价值的数据了,今天我选了一个<掘金网>,我们去爬取一下他的全站用户数据. ...

  7. ABP入门教程(二)添加一个实体和服务

    1,在领域层(Core)添加一个实体 [Table("Department")]public class Department : FullAuditedEntity{[Requi ...

  8. python3爬虫入门教程-有什么好的python3爬虫入门教程或书籍吗?

    2018.2.23 更新.现在书也来了,经过一段时间的学习,我把我的爬虫经验写成了一本书,名字叫<Python3网络爬虫开发实战> /> 本书通过多个实战案例详细介绍了 Python ...

  9. Scrapy爬虫入门教程五 Selectors(选择器)

    Scrapy爬虫入门教程一 安装和基本使用 Scrapy爬虫入门教程二 官方提供Demo Scrapy爬虫入门教程三 命令行工具介绍和示例 Scrapy爬虫入门教程四 Spider(爬虫) Scrap ...

最新文章

  1. 科学研究发现:说谎,是儿童成长的里程碑
  2. break, continue, goto, return语句详解
  3. KS009基于SSH实现宠物管理系统
  4. Sql中的递归问题-思考与建议
  5. python自学网站 知乎-如何自学Python拿到25K的薪资?非常感谢这11个站点!
  6. python二十四:python练习题
  7. html js停止计时,用 js 写的计时器,暂停计时无法生效
  8. Bootstrap 静止导航条
  9. 用配置还用Attribute来实现IoC?
  10. resnet18 结构
  11. LabVIEW状态机小灯按顺序点亮条件结构+自定义枚举
  12. HDFS中JAVA API的使用
  13. 转载:用图片搜索图片的几个好网站
  14. Axure RP 8.1最新激活码
  15. 1060显卡用什么软件测试,参测显卡超频测试——10分
  16. SPSS Modeler 神经网络实践案例(第十四章)
  17. 网易有道词典识别不了adobe打开的pdf
  18. MySQL的Binlog原理
  19. 高性能计算--HPCC--他人评述
  20. sqlServer服务器名称

热门文章

  1. 信号与系统 Part 2:傅里叶级数和傅里叶变换(1) 典型周期信号的傅里叶级数推导
  2. 马拉车java_leetcode-5 最长回文子串-画蛇添足的马拉车算法
  3. 使用Threejs创建几何体,动态添加几何体,删除几何体,添加坐标轴
  4. Linux kodi添加中文,如何在Ubuntu中通过PPA安装Kodi 18.2并设置中文界面
  5. 怎么样可以让两个女朋友和平相处
  6. 我希望,男女交友网站进入「甜蜜分众」世代
  7. 钱诚:10.11现货黄金原油价格走势实时行情分析
  8. golang gin框架 CURD
  9. 6.1图的定义、无向图、有向图、连通图、强连通图、带权图
  10. java查看端口是否被占用_如何查看某个端口被谁占用