爬虫:
先讲一下爬虫的应用和分类,对爬虫有个大致的了解。
定义:是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本(百度百科的解释),其实就是从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.youkuaiyun.com/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)
# 延时两秒