关于想学python爬虫,我觉得首先我的熟悉一种数据提取的方式,比如正则表达式(正则表达式是其中一种进行数据筛选的表达式),那我们就先从re说起。我争取让你看完这边博客,能对python的爬虫不再陌生,并且能做到爬取简单的数据。
正文请往下看
正则表达式通常被用来匹配
、检索
、替换
和分割
那些符合某个模式(规则)的文本。
案例一:
import re #导入正则模块 str = 'Beijing Olympic Games will be held in 2018, I still remember' pat = re.compile("[0-9]{4}") #compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。 year = pat.findall(str) #寻找所有符合的数据 print(year) #结果:['2018']
我们换一种写法
import re str = 'Beijing Olympic Games will be held in 2018, I still remember'
res = re.findall("[0-9]{4}",str)
print(res)
#结果:['2018']
关于更多的正则语法可打开此篇博客:https://www.cnblogs.com/12james/p/11787305.html
正则表达式中的常用函数如,详细解释可参考:https://www.cnblogs.com/12james/p/11787462.html
compile()、match()、search()、findall()、finditer()、split()、sub()等
案例二:正则在实际中的应用
我们本地有一个index.html文件
<!DOCTYPE html> <html> <head> <title>正则表达式实例</title> </head> <body> <h2>常用网站链接</h2> <ul> <li><a href="https://www.python.org">Python官方网站</a></li> <li><a href="https://www.djangoproject.com">Django官方网站</a></li> <li><a href="https://www.baidu.com">百度搜索引擎</a></li> <li><a href="https://blog.csdn.net">CSDN官方网站</a></li> <li><a href="https://edu.csdn.net/">CSDN学院</a></li> </ul> </body> </html>
使用python爬取网页中的内容
mport re f = open("./index.html","r") #打开本地index.html文件 content = f.read() #读取文件中内容 f.close() #关闭文件操作 title = re.search("<title>(.*?)</title>",content) #使用正则从content中匹配标题 if title: print(title) print("标题:"+title.group()) alist = re.findall('<a href="(.*?)">(.*?)</a>',content) #匹配网站链接和名称 for ov in alist: print(ov[1]+":"+ov[0])
python爬虫的应用场景如下:
-
爬虫技术在
科学研究
、Web安全
、产品研发
、舆情监控
等领域可以做很多事情。 -
在数据挖掘、机器学习、图像处理等科学研究领域,如果没有数据,则可以通过爬虫从网上抓取;
-
在Web安全方面,使用爬虫可以对网站是否存在某一漏洞进行批量验证、利用;
-
在产品研发方面,可以采集各个商城物品价格,为用户提供市场最低价;
-
在舆情监控方面,可以抓取、分析新浪微博的数据,从而识别出某用户是否为水军
python爬虫学习的技术准备:
-
(1). Python基础语言: 基础语法、运算符、数据类型、流程控制、函数、对象 模块、文件操作、多线程、网络编程 … 等
-
(2). W3C标准: HTML、CSS、JavaScript、Xpath、JSON
-
(3). HTTP标准: HTTP的请求过程、请求方式、状态码含义,头部信息以及Cookie状态管理
-
(4). 数据库: SQLite、MySQL、MongoDB、Redis …
网络爬虫工作原理
数据请求、抓取
-
在爬虫实现上,除了scrapy框架之外,python有许多与此相关的库可供使用。其中,在数据抓取方面包括: urllib2(urllib3)、requests、mechanize、selenium、splinter;
-
其中,urllib2(urllib3)、requests、mechanize用来获取URL对应的原始响应内容;而selenium、splinter通过加载浏览器驱动,获取浏览器渲染之后的响应内容,模拟程度更高。
-
考虑效率、当然能使用urllib2(urllib3)、requests、mechanize等解决的尽量不用selenium、splinter,因为后者因需要加载浏览器而导致效率较低。
-
对于数据抓取,涉及的过程主要是模拟浏览器向服务器发送构造好的http请求,常见类型有:get/post。
数据解析:
-
在数据解析方面,相应的库包括:lxml、beautifulsoup4、re、pyquery。
-
对于数据解析,主要是从响应页面里提取所需的数据,常用方法有:xpath路径表达式、CSS选择器、re正则表达式等。
-
其中,xpath路径表达式、CSS选择器主要用于提取结构化的数据。而正则表达式主要用于提取非结构化的数据。
想深入了解urllib,可以打开urllib库官方链接:https://docs.python.org/3/library/urllib.html
我们今天主要使用requests库:
- 安装:通过使用pip命令来安装requests
pip install requests
requests的get请求使用:
import requests import re url = "http://www.baidu.com" # 抓取信息 res = requests.get(url) #获取HTTP状态码 print("status:%d" % res.status_code) # 获取响应内容 data = res.content.decode("utf-8") #使用正则解析出结果 print(re.findall("<title>(.*?)</title>",data))
#定义请求携带的数据 data = { 'key':'python', 'final':1, 'jump':1, }
#定义请求地址 url = "http://bj.58.com/job/" #使用get请求方式 res = requests.get(url,params=data) #对获取的页面数据转码 html = res.content.decode('utf-8') #定义正则表达式 pat = '<span class="address" >(.*?)</span> \| <span class="name">(.*?)</span>'
dlist = re.findall(pat,html) #匹配数据
for v in dlist: print(v[0]+" | "+v[1])
关于post请求请看下篇