Python爬虫教程

15,209 阅读6分钟

Python爬虫教程

Python爬虫主要分为四步:发送请求——获得页面——解析页面——抽取并存储内容

环境安装及配置

使用PyCharm进行爬虫。

创建一个新的项目

首先创建一个新的项目New Project,选择Pure Python,选择Location,即整个爬虫项目在电脑中的位置,选一个自己记得住的全英文路径即可(如E:\pythonLearning\Demo\demo1)。

鼠标选中项目名,右键创建Python File,输入文件名字(比如demo1),回车就创建啦。

安装爬虫需要的依赖包

接下来要安装爬虫需要的依赖包,有bs4、re、urllib、xlwt、sqlite这些我们需要的库。其中re和sqlite库Python已经为我们预安装好了,所以只需要安装剩下的三个就可以啦。安装步骤如下:

  1. 点击主界面左上角的File,选择下面的settings
  2. settings中,点击左侧的Project: demo1(demo1是创建的项目名字),点击下面的Project Interpreter

  1. 首先要确认上面Python的位置是我们创建的项目的位置
  2. 然后点击右边的加号+,输入我们要下载的依赖包名urllib3,点击左下角的Install Package就可以啦,依次点击右上角的x,和下面的ok就可以回到主界面了,等待依赖包下载完成。

5.在主界面的最下面有个进度条,会告诉你依赖包下载的进度。如果下载失败了,可以回到上方图片的页面,点击MangeRepositories,点击右上角的加号+,添加网址http://mirrors.aliyun.com/pypi/simple/。然后重新输入依赖包名称,再下载就可以啦。

6.重复上面的步骤,下载bs4、xlwt依赖包。

开始简单的爬虫

首先打开我们创建的第一个python文件。在文件的开头我们首先导入依赖。输入

import urllib.request

这里我们爬取的是百度的源代码。我们使用一个变量response来接收我们爬取的结果,然后将结果打印出来。

response = urllib.request.urlopen("http://www.baidu.com")
#read是读取
#decode是解码成其他格式的编码,当我们爬取的数据包含中文的时候就需要这个
print(response.read().decode('utf-8'))

右键鼠标,选择Run就可以运行了!

输出的结果如下:可以看到就是百度网页的源代码。

出现的问题

其实上面演示的就是一个最简单的爬虫了,但是不是所有网页我们都可以这么爬取的。因为很多网站设置了反爬虫,不想让我们去直接爬取他们的数据,比如我们把刚才代码中的网址换成豆瓣的电影栏目https://movie.douban.com,然后试试输出的结果。

可以看到结果报错了,我们关注的就是下面的HTTP Error 418,这代表网站已经发现我们是爬虫了,不允许我们进行数据的爬取。所谓魔高一尺道高一丈,我们也有方法去应对418这种情况。

解决被识别的问题

既然我们被识别出来是爬虫了,我们就可以通过伪装成服务器请求的方式去获取网站的数据,这样就不会被发现啦。这里我们要补充一些关于浏览器的知识。接下来的知识有些硬核,可能有些难懂,做好准备哦。

知识补充

  • 首先是使用Chrome浏览器,在地址栏输入movie.douban.com/top250?start=0,打开豆瓣电影前250名
  • 按下F12进入开发者模式。得到如下图所示:

可以看到,在Element栏下显示的就是网站的源代码。实际上的网站就是由这些代码写出来的,网页中的字、图片等都可以在源代码中找到它的位置。比如,我们要看肖申克的救赎这部电影在源代码中的位置,就可以点击源代码栏左上角的鼠标那里(下图中蓝色的地方),然后鼠标指向我们当前网页中肖申克的救赎的位置。然后你就可以发现,源代码自动跳转到了这个电影名称所在源代码的位置。

这个小tips的作用在于我们以后爬取网页时,常常需要解析网页的结构,从源代码中获取我们想要的数据。而通过这个方式可以轻易地帮助我们找到想要的数据在源代码中的位置。

  • 接下来点击源代码栏中的Network,你可以看到许多条线吧?然后这时候刷新网页(网页地址栏左边的按钮就是哦),然后再点击源代码栏中红色的圈圈按钮。点击线条开始的部分,得到下图所示。

  • 这时点击Name下的top250?start=0,就会得到下图所示:

这是什么?!好像比前面的网页源代码好理解些唉,都是英文单词标识的属性,后面就是对应的内容。我来解释下这里是什么吧!

在Name栏的右侧你可以发现Headers一栏,这里就是我们使用Chrome浏览器向网站的服务器发出请求的数据,换句话说,Headers就是我们访问豆瓣网站时,告诉豆瓣的服务器我们所需要的数据。

在General模块中:

  • Request URL:表示的是我们当前网站的地址,也就是最开始输入的网址
  • Request Method:是我们请求的方法,这里使用的是GET。请求的方法一共有五种,分别是GET,POST,PATCH,DELETE和UPDATE。
  • Status Code:是状态码,表示我们请求的状态。常用的状态码有200(成功),404(网站不存在),500(网关错误)等。
  • 下面的Referrer Policy我们暂时不需要了解。

向下继续看Response Headers,这里是服务器发送给我们的响应的东西,目前对我们用处不大。

继续滚动到Request Headers,这里是我们向服务器请求时发出的东西:

这里的东西有什么用?这里就是我们爬虫时候模仿浏览器向服务器发送请求的关键!

  • Cookie:这个是一种网站追踪用户信息的一种标识,就好像我们在雪地里走会留下脚印一样。
  • Host:主机的位置,我们爬虫时候用不上
  • User-Agent:用户代理,这个是我们模仿的关键。我们爬虫的时候使用这个东西,就可以模仿浏览器去请求数据啦!

伪装后我们再战

现在我们学会了伪装的方法,接下来就在爬虫代码中使用伪装去请求数据!

import urllib.request
#下面是我们要爬取的网址
url = "https://www.douban.com"


#接下来我们要封装请求信息,模拟浏览器,避免被识别成爬虫

#复制刚才找的User-Agent的内容,并修改成下面的格式
headers={
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.122 Safari/537.36"
}
#把我们要请求的数据给包装成字节的形式(bytes),然后以键值对来编码(url encode),编码形式为utf-8
#实际上这个基本就是一个固定的写法
data = bytes(urllib.parse.urlencode({'name':'eric'}),encoding="utf-8")
#请求对象req
req = urllib.request.Request(url=url,data=data,headers=headers,method="GET")

#这里就使用到第一次爬虫的代码啦
response = urllib.request.urlopen(req)
print(response.read().decode("utf-8"))

输出结果:网站的源代码

看!我们逃过了服务器对我们的识别,成功请求到了数据!