前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Python爬虫入门 (看这篇就够了)

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

作者头像
KEVINGUO_CN
发布于 2020-03-16 15:34:07
发布于 2020-03-16 15:34:07
1.6K00
代码可运行
举报
文章被收录于专栏:全栈全栈全栈全栈
运行总次数:0
代码可运行

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模拟百度搜索代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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自带的库,安装如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install beautifulsoup4pip install lxml

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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标签:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
p = soup.body.p

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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的标签

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#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标签的属性和数据呢?方法如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for p in soup.select('p'):    print(p.name) #标签名称        #标签属性,也可以用p['id']。若属性不存在会报错,和字典获取键值类似    print(p.get('id'))     print(p.string) #标签内容

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
print(''.join(soup.body.strings))print(''.join(soup.body.stripped_strings))

将分别得到:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
u'\ntest1\ntest2\n'u'test1test2'
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-11-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Python爬虫
调度器:相当于一台电脑的CPU,主要负责调度URL管理器、下载器、解析器之间的协调工作。 URL管理器:包括待爬取的URL地址和已爬取的URL地址,防止重复抓取URL和循环抓取URL,实现URL管理器主要用三种方式,通过内存、数据库、缓存数据库来实现。 网页下载器:通过传入一个URL地址来下载网页,将网页转换成一个字符串,网页下载器有urllib2(Python官方基础模块)包括需要登录、代理、和cookie,requests(第三方包) 网页解析器:将一个网页字符串进行解析,可以按照我们的要求来提取出我们有用的信息,也可以根据DOM树的解析方式来解析。网页解析器有正则表达式(直观,将网页转成字符串通过模糊匹配的方式来提取有价值的信息,当文档比较复杂的时候,该方法提取数据的时候就会非常的困难)、html.parser(Python自带的)、beautifulsoup(第三方插件,可以使用Python自带的html.parser进行解析,也可以使用lxml进行解析,相对于其他几种来说要强大一些)、lxml(第三方插件,可以解析 xml 和 HTML),html.parser 和 beautifulsoup 以及 lxml 都是以 DOM 树的方式进行解析的。 应用程序:就是从网页中提取的有用数据组成的一个应用。
conanma
2021/09/07
1.6K0
【python爬虫保姆级教学】urllib的使用以及页面解析
pip install bs4 -i https://pypi.douban.com/simple
查理不是猹
2021/12/12
1.4K0
【python爬虫保姆级教学】urllib的使用以及页面解析
Python使用BeautifulSoup爬取妹子图
最近突然发现之前写的妹子图的爬虫不能用了,估计是网站又加了新的反爬虫机制,本着追求真理的精神我只好又来爬一遍了!
Awesome_Tang
2018/09/11
1.5K0
Python使用BeautifulSoup爬取妹子图
【学习笔记】Python爬虫
URL由协议、主机名、端口、路径、参数、锚点 URLError\HTTPError 后者时前者的子类 用try-except捕获异常
Livinfly
2022/10/26
2.1K0
python爬虫入门(三)XPATH和BeautifulSoup4
 XML和XPATH 用正则处理HTML文档很麻烦,我们可以先将 HTML文件 转换成 XML文档,然后用 XPath 查找 HTML 节点或元素。 XML 指可扩展标记语言(EXtensible M
zhang_derek
2018/04/11
2.5K0
python爬虫入门(三)XPATH和BeautifulSoup4
一文带你了解Python爬虫(二)——四种常见基础爬虫方法介绍
–Requests是用python语言基于urllib编写的,采用的是Apache2 Licensed开源协议的HTTP库 –urllib还是非常不方便的,而Requests它会比urllib更加方便,可以节约我们大量的工作。 –requests是python实现的最简单易用的HTTP库,建议爬虫使用requests库。 –默认安装好python之后,是没有安装requests模块的,需要单独通过pip安装
诡途
2020/10/16
1.4K0
Python爬虫入门(二)
上一篇文章大概的讲解了 Python 爬虫的基础架构,我们对 Python 爬虫内部运行流程有了一定的理解了,我们这节将用一些简单的 Python 代码实现Python 爬虫架构的 URL 管理器、网页下载器和网页解析器。 URL 管理器 上篇文章我们已经说了,URL 管理器是用来管理待抓取的 URL 和已抓取的 URL,作为一只聪明的爬虫,我们当然应该会选择跳过那些我们已经爬取过的 URL ,这不仅是为了防止重复抓取,也为了防止一些循环抓取的问题,URL 间的互相调用会导致爬虫的无限死循环抓取。 URL
小之丶
2018/03/07
1.2K0
Python爬虫入门(二)
Python爬虫(全)
里面的parse方法,这个方法有两个作用 1.负责解析start_url下载的Response 对象,根据item提取数据(解析item数据的前提是parse里全部requests请求都被加入了爬取队列) 2.如果有新的url则加入爬取队列,负责进一步处理,URL的Request 对象 这两点简单来说就是编写爬虫的主要部分
yuanshuai
2022/08/22
13.3K0
Python爬虫(全)
Python爬虫入门知识!
Python现在非常火,语法简单而且功能强大,很多同学都想学Python!所以小的给各位看官们准备了高价值Python学习视频教程及相关电子版书籍,欢迎前来领取!
python学习教程
2019/07/10
5490
Python爬虫入门知识!
Python爬虫-小测验
(1)读取给定的dangdang.html页面内容,注:编码为gbk(5分) (2)获取页面中所有图书的名称,价格,作者,出版社及图书图片的url地址(20分) (3)将获取的信息保存至文件(excel、csv、json、txt格式均可)(5分) 网页文件dangdang.html文件下载链接: https://pan.baidu.com/s/1awbG5zqOMdnWzXee7TZm6A 密码: 3urs
潇洒坤
2018/09/10
6050
Python爬虫-小测验
Python爬虫库-Beautiful Soup的使用
Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库,简单来说,它能将HTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应属性。
IT派
2018/07/30
1.8K0
Python爬虫库-Beautiful Soup的使用
python爬虫入门_在百度搜索手机归属地
欢迎与我分享你的看法。 转载请注明出处:http://taowusheng.cn/
yifei_
2022/11/14
4120
6个强大且流行的Python爬虫库,强烈推荐!
Python中有非常多用于网络数据采集的库,功能非常强大,有的用于抓取网页,有的用于解析网页,这里介绍6个最常用的库。
派大星的数据屋
2024/07/17
2K0
6个强大且流行的Python爬虫库,强烈推荐!
python爬虫抓取小姐姐图片
学习的过程是枯燥的,所以兴趣非常重要,但什么样的兴趣能比得过自己手打的代码经过无数次调试,成果出来的那一瞬间的喜悦呢,而学习爬虫最重要的是因为什么,当然是爬取美腻的小姐姐图片了,去tm的数据分析,数据可视化,哪有看到一张张小姐姐图片来的真是,桀桀桀~O(∩_∩)O~
kevinfaith
2018/09/18
1.7K0
Python爬虫技术系列-03requests库案例-完善
Python爬虫技术系列-03requests库案例 参考 参考:https://blog.csdn.net/Faith_Lzt/article/details/124933765 https://
IT从业者张某某
2023/10/16
3500
Python爬虫技术系列-03requests库案例-完善
Python爬虫基础
爬虫基础简介 http协议 概念: 服务器和客户端进行数据交互的一种形式 user-Agent: 请求载体的身份表示 Connection : 请求完毕后,是断开连接还是保持连接 Content-Type : 服务器相应客户端的数据类型 # user-Agent ( NetWork-All-Headers ) Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638
shaoshaossm
2022/12/26
4270
入门爬虫笔记
由于上一篇的排版被这个公众号的编辑器弄得和💩一样,我就重新发一次,真的太难用了公众号平台自带的编辑器 学习了一小段时间的爬虫,跟着视频学习,顺便跟着记了一些笔记,现在记录一下。 爬虫入门: 1.指定url 2.UA(User-Agent)伪装,将请求的载体标识伪装成浏览器 3.发起请求get(url, params, headers),post(url,data,headers) 4.获取响应的请求(response = ....text/json()) 5.进行数据解析 6.持久化存储
y191024
2022/09/20
6760
Python爬虫快速入门,BeautifulSoup基本使用及实践
今天来跟大家分享用 BeautifulSoup 获取信息的一些知识点,文章内容由公众号读者 Peter 创作。
小小詹同学
2021/07/27
3.7K0
Python爬虫快速入门,BeautifulSoup基本使用及实践
Python爬虫入门这一篇就够了
所谓爬虫,就是按照一定的规则,自动的从网络中抓取信息的程序或者脚本。万维网就像一个巨大的蜘蛛网,我们的爬虫就是上面的一个蜘蛛,不断的去抓取我们需要的信息。
py3study
2020/01/15
9230
Python爬虫:我这有美味的汤,你喝吗
在前面的文章中已经讲过了正则表达式的使用方法了,但是如果正则表达式出现问题,那么得到的结果就不是我们想要的内容。熟悉前端的朋友肯定知道,对于一个网页来说,都有一定的特殊结构和层级关系,而且很多节点都用id和class来区分。所以可以借助网页的结构和属性来提取数据。
我被狗咬了
2021/01/13
2.5K0
Python爬虫:我这有美味的汤,你喝吗
相关推荐
Python爬虫
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验