萌新提问:能否跳过Python直接上手爬虫?

一般不建议这么干!

Python常用的语法是必须熟练掌握,爬虫的代码实现需要用到这些基础语法。

基础语法常用到的是对数据提取的简单应用处理,比如list、dict中的常用方法,怎么使用函数、类,甚至要会运用多协程,多进程,甚至是分布式爬虫的应用,以及到最后的存储数据等使用方式。

如果跳学的话,可能会在爬虫阶段遇到不懂的问题再倒回来学习Python基础,这样学习效率很慢,也耽误时间,加上容易乱,最后自己不知道在学什么。

1 爬虫整体知识点应用

01 发起请求

首先确定爬取页面的链接,需要注意看看翻页、关键字变化时链接的变化,有时候还需要考虑到日期,再就是看看网页是静态还是动态加载的。

通过HTTP库向目标站点发起请求,即发送一个Request,请求可以包含额外的headers、data等信息,然后等待服务器响应。

这个请求的过程就像我们打开浏览器,在浏览器地址栏输入网址:baidu.com你就知道,然后点击回车。这个过程其实就相当于浏览器作为一个浏览的客户端,向服务器端发送了一次请求。

请求资源这个难度不大,主要是Urllib、Request两个库的使用;

发送request请求给服务器,该函数内常用参数有三个;

urllib.request.urlopen(url,data=None,[timeout,]*)

  • 第一个参数是请求的链接地址

  • 第二个参数是POST请求时需要的数据

  • 第三个参数是超时的设置

#GET请求演示
response = urllib.request.urlopen("http://www.baidu.com")
#decode()函数指定编码格式。
print(response.read().decode("utf-8"))


#POST请求演示
data = bytes(urllib.parse.urlencode({"word":"hello"}),encoding="utf8")
response = urllib.request.urlopen("http://httpbin.org/post",data=data)
print(response.read())

#超时参数演示,如果没有在设置的时间内响应就会抛出异常。
response = urllib.request.urlopen("http://httpbin.org/get",timeout=1)
print(response.read())

02 获取响应内容

如果服务器能正常响应,我们会得到一个Response;

response = urllib.request.urlopen("http://www.python.org")
#type()查看变量数据类型
print(type(response))

状态码、响应头

import urllib.request

response = urllib.request.urlopen("http://www.python.org")

#输出状态码,判断是否响应成功
print(response.status)

#输出响应头
print(response.getheaders())

#输出响应头特定字段("Server")
print(response.getheader("Server"))

Response的内容便是所要获取的内容,类型可能有

HTML、Json字符串,二进制数据(图片,视频等)等;

这个过程就是服务器接收客户端的请求,进过解析发送给浏览器的网页HTML文件。

Request和Response:

  • Request

主机向服务器发送数据请求时的过程叫做HTTP Request

  • Response

服务器向主机返回数据的过程叫做HTTP Response

Request中包含的内容:

① 请求方式:常用的有GET,POST两种类型

  • GET:这种请求方式的参数都包含在网址里面

  • POST:这种请求方式的参数包含在请求体中的form data中。相对安全。

② URL:请求的网络链接。

③ 请求头

包含请求时的头部信息。如:User-Agent、Host、Cookies等。

User-Agent:指定浏览器。

④ 请求体

GET请求下一般情况请求体中不会包含重要信息

POST请求中包含重要信息

Response中包含的内容:

① 响应状态

Status Code:200 即状态码,一般200表示响应成功。

② 响应头

Response Headers

内容类型,内容长度,服务器信息,设置Cookie等

③ 响应体

请求资源的内容,如网页源代码,二进制数据等

代码示例:

#requests是一个HTTP请求库
>>> import requests
#利用requests库的get()函数获取指定URL的response
>>> response = requests.get("http://www.baidu.com")

#打印response中的响应体
>>> print(response.text)

#打印响应头
>>> print(response.headers)

#打印状态码
print(response.status_code)

简单演示:

#requests是一个HTTP请求库
>>> import requests
#利用requests库的get()函数获取指定URL的response
>>> response = requests.get("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1507915046492&di=c543439d4e643acb2fc8ed72e48c6b32&imgtype=0&src=http%3A%2F%2Fi.dimg.cc%2F9c%2F61%2Fc9%2Fb2%2F66%2Fc6%2F38%2F1a%2F0c%2F29%2F67%2F6d%2F6c%2Fcf%2Fb3%2F6f.jpg")

#打印该图片的二进制数据
>>> print(response.content)

#利用with open语句进行文件的本地写入,open()函数第一个参数为文件名,第二个参数为写入模式。
>>> with open("demo.jpg","wb") as f:
...     f.write(response.content)
...     f.close()
... 
#写入字节数,说明写入成功。
30361

一般做网页请求的时候,可以先判断状态码是否

是200,再取出响应体进行解析。

03 解析内容

解析的方式有:

  • 直接处理

  • Json解析

  • 正则表达式

  • BeautifulSoup

  • PyQuery

  • XPath

得到的内容可能是HTML,可以使用正则表达式,网页解析库进行解析;可能是Json,可以直接转为Json对象解析;也可能是二进制数据,可以做保存或者进一步处理;

这一步相当于浏览器把服务器端的文件获取到本地,再进行解释并且展现出来。

而需要爬取的网页信息不一定都是规律整齐的,比如常见的个人信息,除了必填选项,其他部分都不怎么填,缺失了部分信息,是不是得先判断一下是否有数据,再进行抓取,所以判断语句这时候就得派上用场了!

然后清洗数据就不得不提Python的数据结构了,列表、队列都是高频使用,是不是也要掌握?

python的基本数据类型有:

  • Number(数字)

  • String(字符串)

  • List(列表)

  • Tuple(元组)

  • Sets(集合)

  • Dictionary(字典)

python3支持4种类型的数字:int,float,bool,complex(复数),python内置的type()函数可以用来查询变量所指的对象类型。

如 a=256 print(type(a)) 结果为<class ‘int’>

1)数值运算

>>>3+9 #加法 
12   
>>>4*5 #乘法   
20 
>>>3//12 #整除,得到一个整数     
1
>>>7.5-4 #减法
3.5

2)字符串

字符串是由零个或多个字符组成的有限序列,它是编程语言中表示文本的数据类型,如“Hello world!”

表达方式:

  • 使用单引号’’

  • 使用双引号""

  • 使用三引号(‘’'或"“”)

利用三引号,可以指示一个多行的字符串,可以在三引号中自由的使用单引号和双引号。例如:

“”"This is the first line.
This is the second line.
"what’s your name?“I asked.
He said “Edward.”
“””

转义符:

如果要在单引号字符串中使用单引号本身,或在双引号字符串中使用双引号本身,需要借助于转义符\。

例如’What\‘s your name?’

另外可以用转义符\\来指示反斜杠本身,\n表示换行符,注意的是,在一个字符串中,行末的单独一个反斜杠表示字符串在下一行继续。

原始字符串

如果想要指示某些不需要像转义符那样特别处理的字符串,那么需要指定一个原始字符串,原始字符串通过给字符串加上前缀r或R来指定。

例如 r"New lines are indicated by \n"。

字符串的截取

格式:

字符串变量[start_index:end_index+1]索引值从零开始,-1为末尾最后一位。

例如 str:F a i r y l a n d Index: 0 1 2
3 4 5 6 7 8 str[0]=“F” str[1:4]=“air” str[5:]=“land”
str[2:-1]=“irylan” str*2=“FairylandFairyland” “I love”+str=“I love
Fairyland”

字符串不可以原位修改!

3)列表

python 列表是任意对象的有序集合,列表写在括号[ ]里,元素之间用逗号隔开。通过索引访问列表指定元素,第一个索引是零,第二个索引是1,以此类推,-1为末尾最后一位。

例如 List->[“python”,65563,[1,2,3],3.14159,False]
index-> 0 1 2 3 4

列表的切片语法格式:

列表变量[start_index:end_index+1]

4)元组

元组与列表相似,不同之处在于元组的元素不能修改,元组写在小括号( )里,元素之间用逗号隔开。

元组中的元素不可以原位修改!

>>>tuple1=('abc',123,'xyz',5.2,30)
>>>tuple2=(7.5,False)
>>>print(tuple1[1:3])                               (123,'xyz')
>>>print(tuple2[-1])                                 False
>>>print(tuple2*2)                                   (7.5,False,7.5,False)
>>>print(tuple1+tuple2)                          
('abc',123,'xyz',5.2,30,7.5,False)
>>>tuple1[2]='xyz'                                   Typeerror

5)集合

集合(set)是一个无序不重复的元素的序列。基本功能是进行成员关系测试和删除重复元素,可以使用大括号{ }或者set()函数创建集合。

注意:

创建一个空集合必须用set()而不是{ },因为{ }用来创建一个空字典。

集合中没有重复元素!

集合的去重和成员关系测试:

animals={‘dog’,‘cat’,‘lion’,‘pig’,‘dog’,‘bird’} print(animals)
#输出集合,重复的元素被自动去掉

6)字典

字典是一种映射类型,字典用{ }标识,它是一个无序的键(key):值(value)对集合,键(key)必须使用不可变类型。

注意:在同一个字典中,键(key)必须是唯一的!字典是无序的,不可以通过索引来访问!

>>>item={}
>>>item['name']='dress'
>>>item['price']=275
>>>client={'name':'Fiona','age':26,'sex':'female'}
>>>print(item['name'])               dress
>>>print(item['price'])              275
>>>print(client)                     {'name':'Fiona','age':26,'sex':'female'}
>>>print(client.keys())               dict_keys(['name','age','sex'])
>>>print(client.values())             dict_values(['Fiona',26,'female'])

04 保存数据

保存数据可采取的方式:

  • 文本保存
    纯文本、Json、Xml等。

  • 关系型数据库保存
    MySQL、Oracle、SQLServer等。

  • 非关系型数据库保存
    MongoDB、Redis等Key-Value形式存储。

  • 二进制文件
    图片、视频、音频等特定文件。

这就相当于我们在浏览网页时,下载了网页上的图片或者视频。

保存的方式可以是把数据存为文本,也可以把数据保存到数据库,或者保存为特定的jpg、mp4 等格式的文件,所以掌握Python的文件读写也必不可少。

这一路看下来我们的爬虫基本上能跑起来了,如果你再厉害点,开发个爬虫软件什么的,就还得掌握个类了。

如果想要爬虫效率更高,就得涉及到scrapy框架的应用、并发下载、分布式进程、协程和异步I/O的学习了。

2 掌握HTML

再一点就是必须要会HTML各标签属性等用法,掌握了解HTML基本结构;

比如以python爬虫中的BeautifulSoup解析数据的用法举例一下:

bs对象=BeautifulSoup(要解析的文本,“解析器”),"解析器"比如这样写法:“html.parser”

整体:result = BeautifulSoup(html,“htmll.parser”),因为爬虫常用到的是对HTML标签及属性等的数据提取。

3 了解HTTP协议

HTTP协议中文名称是超文本传输协议,是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。

请求和响应模式很好理解,客户端发送请求,服务器响应客户端的请求,就像学校食堂打菜一样,你和打菜阿姨说要哪份菜,她才会给你盛哪份菜。

我们浏览网页的浏览器和手机应用客户端与服务器通信几乎都是基于HTTP协议,而爬虫可以看作是一个另类的客户端。

它把自己伪装成浏览器或者手机应用客户端,按照自己的逻辑贪婪的向服务器索取数据,如何向服务器索取数据,所以了解HTTP协议就显得很有必要了。

4 给萌新的几点建议

① 建议先熟悉python的基础语法,再深入练习;如果用python写爬虫是为了满足“抓数据”的需求,使用爬虫软件更为方便。

②选择适合自己的教程;有些入门书籍很经典,但是不是适合你呢?有些书籍是我们学过一遍Python有了基础之后再去看才会发挥很大的作用。

③不断的写代码,重复的练习;这不用多说,学习什么语言都是这样,总看视频,编不出什么东西,可以从书上的小案例开始写,之后再写完整的项目。

④哪里不会补哪里;除了学Python,计算机的基础多少也要懂一点,英语不太好的建议稍微补一下。

⑤不但要会写而且要会看;看源码是一个本领,调试代码更是一个本领,就是解决问题的能力,挑错,理解你自己的报错信息,自己去解决。

⑥当你到达了一个水平,就多去看官方的文档;找一些Python论坛或者交流群,跟同行的大神多交流,所谓取他人之长补己之短嘛。

关于Python学习指南

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你,干货内容包括:

👉Python所有方向的学习路线👈

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。

在这里插入图片描述

👉Python学习开发工具👈

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

在这里插入图片描述

👉Python入门学习视频👈

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

在这里插入图片描述

👉Python实战练手案例&源码👈

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

在这里插入图片描述

👉全套PDF电子书👈

书籍的好处就在于权威和体系健全,刚开始学习的时候你可以只看视频或者听某个人讲课,但等你学完之后,你觉得你掌握了,这时候建议还是得去看一下书籍,看权威技术书籍也是每个程序员必经之路。

在这里插入图片描述

👉Python大厂面试资料👈

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

👉Python副业兼职学习路线👈

​​在这里插入图片描述

👉 这份完整版的Python全套学习资料已经上传,朋友们如果需要可以扫描下方CSDN官方认证二维码或者点击链接免费领取保证100%免费

读者福利:CSDN大礼包:《Python小白从入门到精通全套学习资料》免费分享 安全链接免费领取

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值