Python爬虫———正则表达式

爬虫:

先讲一下爬虫的应用和分类,对爬虫有个大致的了解。

定义:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本(百度百科的解释),其实就是从Html源代码获取你需要信息的一种手段。
应用场景:

1.做数据分析(大数据)将分析出来的结果制成(饼状图、柱状图、折线图);
2.将数据应用于公司的网站或者app;
技术手段:urllib、request、bs4、pyspider(框架)、scrapy(框架)

爬虫网站:
从网站类型分:
1.静态网站:页面上展示的数据,如果可以在‘右键-网页源代码’中能看到这些数据,那这种网站就是静态网站,爬取简单
2.动态网站:页面上展示的数据,在‘右键-网页源代码’中看不到这些数据,这些数据是通过js动态渲染的,就是动态网站

如果是动态网站:
    1.看看页面上展示的数据,是否是通过API接口返回的json数据,这是最简单的
    2、使用selenium动态加载js文件,获取js加载完成后的页面,效率比较慢
    3. 有些网站会对selenium驱动进行识别,通过分析js源代码,看数据是怎么返回的
从难易程度上分:
1.数据直接通过HTML源代码返回了
2. 通过js对请求参数加密
3. 需要使用cookie进行网络请求
4. 返回数据加密;
5. 需要重点分析请求头和响应头
6 网站对同一个ip的访问有次数限制
7. 验证码的破解;
请求头和响应头中常用的字段:

1.请求头:
Host:表示当前请求对应的主机地址;比如:www.baidu.com
REFERER:表示此次请求是有那个地方发起的请求;
COOKIE:请求的时候携带上cookie可实现免登录
USER-AGENT: 浏览器标识,如果不携带该字段,可能会被对方服务器认为是爬虫
2.响应头:
SET-COOKIE:一般是服务器向客户端返回的cookie信息

例子代码(此处爬取得的是我的一片博客):

这是一个简单的爬取代码,先获取HTML源代码,然后在解析源代码写正则表达式,提取出所要的信息。

import re
from urllib.request import Request,urlopen
#向地址发送get请求 
req = Request(url='https://blog.csdn.net/lhhnb/article/details/85628167',headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) '
'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36'})
response=urlopen(req)
html=response.read().decode()
pattern=re.compile(r'<div id="content_views.*?<a id=".*?".*?></a>(.*?)<.*?<p>(.*?)</p>.*?</a>(.*?)<.*?<p>(.*?)</p>.*?</a>(.*?)<.*?<p>(.*?)</p>.*?</a>(.*?)</h3>.*?<code class="prism.*?">(.*?)<div class=".*?">',re.S)
print(re.findall(pattern,html))

讲解:

urllib:是python的标准库,包含了从网络请求数据,处理cookie,改变请求头和用户代理这些元数据的函数

urllib分为一些子模块: urllib.request,urllib.parse,urllib.error

urlopen:用来打开并读取一个从网络获取的远程对象(HTML文件,图像文件,其他文件流)

r: 主要为了区分python中的转义字符和正则表达式中的转义字符,防止冲突

re.S : (S大写)因为正则表达式匹配数据的时候是按照行进行匹配的,如果字符串出现换行,没有携带re.S匹配结果就可能出错

.*: 贪婪匹配,在符合规则的前提下,尽可能多的匹配内容
.*?: 非贪婪匹配,在符合规则的前提下,尽可能少的匹配内容(使用最多)

decode():将<class ‘bytes’>类型数据转化成<class ‘str’>
因为response.read()读出来的源代码是<class ‘bytes’>类型的(可以输出一下看看),这时候汉字是被编码的状态,多以加上decode()函数,能够使汉字解码,decode()默认值是UTF-8编码格式,所以爬取的时候注意一下,你所爬取网页的编码格式。

headers: 请求头

注意:

多次访问的时候加上延时函数,不然网站服务器会把你视为机器人,禁止你访问。

import time
time.sleep(2)
# 延时两秒
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值