Python爬虫入门 (看这篇就够了)

本文介绍了爬虫的基本概念,通过urllib2库演示了如何实现GET请求,包括设置请求参数和Header来模拟浏览器行为。同时,讲解了如何使用BeautifulSoup库解析HTML,提取所需数据,以及处理网页内容的方法。
摘要由CSDN通过智能技术生成

1、什么是爬虫

“爬虫”是一种形象的说法。互联网比喻成一张大网,爬虫是一个程序或脚本在这种大网上爬走。碰到虫子(资源),若是所需的资源就获取或下载下来。这个资源通常是网页、文件等等。可以通过该资源里面的url链接,顺藤摸瓜继续爬取这些链接的资源。

你也可以把爬虫当作模拟我们正常上网。打开网页并分析网页的内容获取我们想要的东西。

那么,这里就涉及到http传输协议等相关的知识。

我们通常打开一个网页,基本上都是打开一个Url链接即可。在这个过程当中,实际上发生了很多事情。

打开一个Url链接,浏览器自动向Url链接的服务器发送一个请求(Request),告诉服务器说我需要访问这个Url链接的内容,请返回数据给我。服务器就处理该请求,响应该请求并返回结果给浏览器。

既然爬虫需要模拟该过程。根据http协议,爬虫需要构造一个请求(Request),发到请求到目标服务器(通常是Url链接)。然后等待服务器的响应(Response)。

所有相关的数据都在这个响应结果当中,这个就是爬虫实现的基本逻辑。

2、urllib2实现GET请求

GET和POST是请求中最常见的两种方式。(一共有6种)

GET方式是通过Url链接的方式传输相关的参数或数据。一般打开网址是GET方式请求,例如打开百度首页、谷歌首页。

有时候,需要向这个链接传输一些参数。

例如我在百度搜索一个词,发现链接变成 https://www.baidu.com/s?ie=UTF-8&wd=测试

这里有个?问号以及后面一堆数据。问号后面的数据是GET请求的参数,这里一共有两组参数。

1)ie = UTF-8

2)wd = 测试

每组参数用&符号链接。在参数中,等号前面的是参数名;等号后面的是参数值。

例如第2组参数的含义是百度搜索关键字为“测试”。第1组参数是设置返回ie浏览器的编码格式,可有可无,作为说明加入进来。

那么,我使用urllib2模拟百度搜索代码如下:

#coding:utf-8import urllib, urllib2 #前半部分的链接(注意是http,不是https)url_pre = 'http://www.baidu.com/s' #GET参数params = {}params['wd'] = u'测试'.encode('utf-8')url_params = urllib.urlencode(params) #GET请求完整链接url = '%s?%s' % (url_pre, url_params) #打开链接,获取响应response = urllib2.urlopen(url) #获取响应的htmlhtml = response.read() #将html保存到文件with open('test.txt', 'w') as f:    f.write(html)

执行代码,可以看到爬取的内容。

5、反爬虫设置header

有些服务器为了避免被爬虫,会检查header。header是发送请求的时候,一起发送给服务器的数据。可以通过header得到浏览器的类型,手机端还是电脑端访问,以及从什么地方进入该链接等等。

若发现不是正常浏览器访问,服务器则直接拒绝。

so~ 我们需要进一步模拟浏览器的行为,需要模拟设置header。

#coding:utf-8import urllib, urllib2   #设置headeruser_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'  headers = {'User-Agent':user_agent}  #构造Request请求,其中第二个参数是dataurl = 'http://www.server.com/login'request = urllib2.Request(url, None, headers) #响应请求response = urllib2.urlopen(request)  html = response.read()

复制

同样,若你不知道如何设置header,可以通过抓包软件获取,例如Fiddler。

6、解析html

前面说了这么多,都是为了获取网页内容html。既然获取到html之后,我们解析?从中提取我们需要的数据?

我们所获取的html本质是字符串。处理字符串最基本的方法是通过相关的字符串函数,但效率很低,容易出错。

还可以使用正则表达式处理字符串。这部分的知识也是很多,大家可以自行了解。

这里,我想给大家说的处理方式是使用BeautifulSoup。

BeautifulSoup是解析html/xml的库。非Python自带的库,安装如下:

pip install beautifulsoup4pip install lxml

复制

安装lxml库是为了加快html解析效率。

先我们设置1个html内容,使用BeautifulSoup解析方法如下:

#coding:utf-8from bs4 import BeautifulSoup #先随便假设一个htmlhtml = '''<html><head></head><body>    <p id="test_p">test1</p>    <p>test2</p></body><html>''' #使用lxml解析htmlsoup = BeautifulSoup(html, 'lxml')

复制

soup是解析得到的解析器。我们可以根据html的结构获取对应的节点。例如我想获取p标签:

p = soup.body.p

复制

但该方法只能获取到第1个节点。假如body标签下有很多p节点,该方法无法获取全部。

这里,我们可以用find_all或select方法获取。建议大家使用select方法,这个方法可以jQuery选择器用法差不多。例如:

p1 = soup.select('p') #获取p标签p2 = soup.select('#test_p') #获取id为test_p的标签p3 = soup.select('.test')   #获取class为test的标签p4 = soup.select('body .test') #获取body下的class为test的标签

复制

来个完整的代码,输出结果:

#coding:utf-8from bs4 import BeautifulSoup #先随便假设一个htmlhtml = '''<html><head></head><body>    <p id="test_p">test1</p>    <p>test2</p></body><html>''' #使用lxml解析htmlsoup = BeautifulSoup(html, 'lxml') #获取全部p标签for p in soup.select('p'):    print(p)

通过该方法,可以输出全部p标签。

那假如我要获取p标签的属性和数据呢?方法如下:

for p in soup.select('p'):    print(p.name) #标签名称        #标签属性,也可以用p['id']。若属性不存在会报错,和字典获取键值类似    print(p.get('id'))     print(p.string) #标签内容

若一个标签里面有很多子标签,你可以再进一步继续使用select。

若想获取标签下全部子标签的文本内容。可以用strings属性得到一个生成器,不过可能有很多回车和空格。若想屏蔽回车和空格,可以使用stripped_strings属性。如下所示:

print(''.join(soup.body.strings))print(''.join(soup.body.stripped_strings))

将分别得到:

u'\ntest1\ntest2\n'u'test1test2'

Python经验分享

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后大家分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

Python学习路线

这里把Python常用的技术点做了整理,有各个领域的知识点汇总,可以按照上面的知识点找对应的学习资源。
在这里插入图片描述

学习软件

Python常用的开发软件,会给大家节省很多时间。
在这里插入图片描述

学习视频

编程学习一定要多多看视频,书籍和视频结合起来学习才能事半功倍。
在这里插入图片描述

100道练习题

在这里插入图片描述

实战案例

光学理论是没用的,学习编程切忌纸上谈兵,一定要动手实操,将自己学到的知识运用到实际当中。
在这里插入图片描述
最后祝大家天天进步!!

上面这份完整版的Python全套学习资料已经上传至CSDN官方,朋友如果需要可以直接微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

  • 1
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值