零基础学习爬虫并实战
总第63篇
本篇主要从爬虫是什么、爬虫的一般流程、爬虫各个流程的实现方法、爬虫实例四个方面分享零基础了解爬虫,并进行简单的实战。
在阅读下面之前,我们需要对网页有个基本的了解,知道什么是标签,什么是属性,以及知道标题是放在哪,内容是放在哪,这些关于网站的基础知识。
可查看我前几篇关于网页基础知识的推文:
网页是怎么构成的?
网页的修饰
网页的行为
01|爬虫是什么:
爬虫又叫网页数据抓取,就是通过向浏览器发出请求并得到回应,把回应的内容抓取保存到本地的过程叫做爬虫。
比如,我要获取猫眼电影的TOP100榜电影的信息,其中包括电影名、主演、上映时间、评分以及封面图片。我们可以选择手动一条条登记,也可以写一个爬虫(通过浏览器向猫眼电影发出一个request然后得到一个response)去获取这些信息。
02|爬虫一般流程:
1、发起请求,通过HTTP库向目标站点发起请求,即发送一个Request。一般会包括下面这些部分。
2、获取响应内容,如果服务器能够正常响应,会得到一个Response,Response的内容便是要获取的页面内容,类型可能有HTML,Json字符串,二进制数据(图片视频等一般为二进制数据)等类型。
3、解析内容,得到的内容如果是HTML,可以用正则表达式和网页解析库进行解析;如果是Json,直接转为Json对象解析;如果是二进制数据,可以保存也可以做进一步处理。
json.dumps():对json数据进行编码。(Python编码为json类型)
json.loads():对json数据进行解码。(json解码为Python类型)
4、保存数据,保存形式有多种,可以存为文本,也可以保存至数据库,或者保存到特定格式的文件。
03|实现上述爬虫过程的具体方法:
1、获取内容
这里的获取内容包括前面提到的request和response两个过程。
Urllib库
直接将目标网站链接url传递给urlopen函数即可。
import urllib.request
response = urllib.request.urlopen('http://www.baidu.com')
print(response)#打印出得到回应的一行代码
print(response.read())#打印出获得的html内容
print(response.read().decode("utf-8"))#以“utf-8”编码的格式打印出获得的html内容
关于decode和encode的一些科普
字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码。
因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码。
request库
将目标网站链接url传递给request.get函数即可。
import requests
response = requests.get('http://httpbin.org/get')
response = requests.get("http://httpbin.org/get?name=germey&age=22")#带有参数的url
print(response.text)#获取response的具体html内容
2、解析内容
所谓的解析内容就是用一定的方法从获得的全部内容中取出我们想要的某一部分内容,开头讲述的猫眼电影top100的获取,我们通过第一步获取内容取得是整个网页的所有部分,但我们只需要这所有部分中的标题、主演、评分等信息。
正则表达式
正则表达式是用一些符号去表示要匹配的内容,然后将其放在过程1中获得的全部内容中区匹配我们想要的内容。
模式 | 描述 |
---|---|
\w | 匹配字母数字及下划线 |
\W | 匹配非字母数字下划线 |
\s | 匹配任意空白字符,等价于 [\t\n\r\f]. |
\S | 匹配任意非空字符 |
\d | 匹配任意数字,等价于 [0-9] |
\D | 匹配任意非数字 |
\A | 匹配字符串开始 |
\Z | 匹配字符串结束,如果是存在换行,只匹配到换行前的结束字符串 |
\z | 匹配字符串结束 |
\G | 匹配最后匹配完成的位置 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
^ | 匹配字符串的开头 |
$ | 匹配字符串的末尾。 |
. | 匹配任意字符,除了换行符,当re.DOTALL标记被指定时,则可以匹配包括换行符的任意字符。 |
[…] | 用来表示一组字符,单独列出:[amk] 匹配 ‘a’,’m’或’k’ |
[^…] | 不在[]中的字符:[^abc] 匹配除了a,b,c之外的字符。 |
* | 匹配0个或多个的表达式。 |
+ | 匹配1个或多个的表达式。 |
? | 匹配0个或1个由前面的正则表达式定义的片段,非贪婪方式 |
{n} | 精确匹配n个前面表达式。 |
{n, m} | 匹配 n 到 m 次由前面的正则表达式定义的片段,贪婪方式 |
a|b | 匹配a或b |
( ) | 匹配括号内的表达式,也表示一个组 |
上面的表是直接copy的崔庆才老师的表,老师在天善智能有开设爬虫入门课程,课程链接:https://edu.hellobi.com/course/157/lessons
在正则表达式中我们常用的是re.findall(pattern,html,re.S),三个参数依次表示目标匹配内容(正则表达式书写的)、待匹配的全部内容(过程1获得的全部内容)、匹配模式。在后面的实例中我们就是用的正则表达式进行解析的,具体内容看后面的实例。
BeautifualSoup
BeautifulSoup是python自带的一个库,在这个库中我们常用下面这个选择器:
find_all( name , attrs , recursive , text , **kwargs )
参数依次要查找的标签名、属性和内容。该选择器输出内容为所有符合条件的项。
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')#html表示要待解析的内容,lxml表示解析方式print(soup.find_all('ul'))#表示输出所有标签名为“ul”的内容
print(type(soup.find_all('ul')[0]))##表示输出第一个标签名为“ul”的内容
print(soup.find_all(attrs={'id': 'list-1'}))#表示输出属性id=list对应的值
print(soup.find_all(text='Jay'))#获取标签内的内容为“Jay”的项
3、保存内容到本地
先使用open创建并打开一个file对象,然后使用write方法将内容写入到这个file对象中。
with open('result.txt', 'a', encoding='utf-8') as f:#open用于打开一个文件,并创建一个file对象f.write(json.dumps(content, ensure_ascii=False) + '\n')#write()方法的参数为字符串形式,所以需要用json_dumps将字典形式转化为字符串f.close()
04|爬取猫眼电影实例:
获取内容
import requests
response = requests.get("http://maoyan.com/board/4")
print (response.text)
解析内容
import re#导入re库pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)
items = re.findall(pattern, response.text)
(部分解析结果)
保存到本地
import jsonwith open('result.txt', 'a', encoding='utf-8') as f:#open用于打开一个文件,并创建一个file对象f.write(json.dumps(items, ensure_ascii=False) + '\n')#write()方法的参数为字符串形式,所以需要用json_dumps将字典形式转化为字符串f.close()
这样一个包含有电影信息的名为result.txt文件就保存到本地了。整个爬虫过程就完成了。
零基础学习爬虫并实战相关推荐
- python经典教程_零基础 Python爬虫经典实战教程
最近Python爬虫比较火,看到网上分享源码的比较多,很少有教程帖子,为了帮助新人和对爬虫比较感兴趣的朋友,所以想到写一些比较详细教程帖子!大家共同学习! 下载工具,安装对应系统的版本,下面以wind ...
- 【python教程入门学习】Python零基础入门爬虫项目
Python入门爬虫项目 这是我的第一个python项目,分享给大家. 需求 我们目前正在开发一款产品其功能大致是:用户收到短信如:购买了电影票或者火车票机票之类的事件.然后app读取短信,解析短信, ...
- 我的Go+语言初体验——(4)零基础学习 Go+ 爬虫
我的Go+语言初体验--(4)零基础学习 Go+ 爬虫 "我的Go+语言初体验" | 征文活动进行中- Go+ 语言非常适合编写爬虫程序,具有并发机制完善.并发数量大.占用资源少. ...
- 零基础学习嵌入式入门以及项目实战开发【手把手教+国内独家+原创】
零基础学习嵌入式入门以及项目实战开发[手把手教+国内独家+原创] 独家拥有,绝对经典 创 科 之 龙 嵌入式开发经典系列教程 [第一期] 主讲人: ...
- 【创科之龙】零基础学习嵌入式开发以及项目实战开发【第二期视频】
[创科之龙]零基础学习嵌入式开发以及项目实战开发[学习交流零基础火热进行ing] 大家好,我是aiku,上期的项目学习资料在电子发烧友论坛上分享,大家觉得都很好. 在这里我首先要感谢电子发烧友给我们的 ...
- 慕课网python零基础入门教程_零基础Python爬虫入门学习一之综述
原标题:零基础Python爬虫入门学习一之综述 大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章 ...
- 小强软件测试_小强老师零基础学习软件测试视频教程 理论篇+自动化篇+工具篇+实战等零基础课程...
小强老师零基础学习软件测试视频教程 理论篇+自动化篇+工具篇+实战等零基础课程 1.jpg (53.32 KB, 下载次数: 0) 2017-10-5 09:33 上传 2.jpg (49.08 KB ...
- python零基础实例-零基础学习Python开发练习100题实例(1)
零基础学习Python开发练习100题实例(1) 2018-02-25 09:37:59 2864浏览 1.题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序 ...
- python基础代码事例-零基础学习Python开发练习100题实例(2)
零基础学习Python开发练习100题实例(2) 2018-02-26 13:11:39 1934浏览 11.题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个 ...
最新文章
- 两款接口测试工具推荐
- base--AuditResult
- 我给媳妇解释设计模式:第一部分
- 快速找出高价值用户,3分钟学会RFM模型分析
- 又烧一辆!蔚来ES8维修时起火烧到只剩底盘 官方回应:已开启调查
- 3星难度-算式填符号
- python读取配置文件获取所有键值对_python读取配置文件 变量 ConfigParser模块
- Linux系统定时任务Crond
- Python学习入门基础教程(learning Python)--5.1 Python下文件处理基本过程
- 数据结构实验1.2:高精度计算PI值
- 微信小黄鸡php,微信表情包小黄鸡含义
- java结业作业_学习平台-北语201606考试批次《JAVA语言程序设计》(结课作业)答案-成人高等教育_成人本科教育报名_远程网络教育学院-江苏学历网报名服务中心...
- css3,环绕圆环 loading,小组件
- yigo2.0定时器集合
- Lens Shading成因及相关
- 如何“拼”出一个页面-游戏中心模块化实践
- 本地生活商家和达人注意了,如何提高核销率
- 文史 篇一:《万历十五年》--黄仁宇
- 英特尔遭遇「灾难级」财报!裁员、砍业务、董事会主席辞职,甚至给不出2023业绩预期
- Delegate: What is this? ----什么是Delegate(委托)
热门文章
- types是什么意思中文翻译成_types 和 @types 是什么?
- sip gw功能包括_完整SIP/SDP媒体协商概论-SIP/WebRTC概要
- java中apache安装与配置_Apache应用服务器之四:Apache与Tomcat安装与配置
- oracle中的 where 1=1 和where 11
- IOS开发中单例模式使用详解
- 用来枚举属性的对象工具函数
- 在windows中手动安装第三方模块
- H5 C3中的概念(一)
- Python控制台英汉-汉英电子词典
- “七层架构”-----实践篇-登录小实例