爬虫基本知识,如何发起请求,进行分析
欢迎大家去博客冰山一树Sankey,浏览效果更好。直接右上角搜索该标题即可
博客园主页:博客园主页-冰山一树Sankey
CSDN主页:CSDN主页-冰山一树Sankey
爬虫一个实战性很强的内容,下面是一些知识点,方便日后复习,具体还要去案例看看,随机应变。这是我的github爬虫仓库github-spider,欢迎大家clone进行学习和体验。
一. 网络爬虫概述
定义
网络蜘蛛(spider)、网络机器人(robot),抓取网络数据的程序
其实就是用Python程序模仿人点击浏览器并访问网站,而且模仿的越像越好,让Web站点无法发现你不是人
爬取数据的目的
1、公司项目测试数据
2、公司业务部门及其他部门所需数据
3、数据分析
企业获取数据方式
1、公司自有数据
2、第三方数据平台购买(tushare,数据堂、贵阳大数据交易所)
3、爬虫爬取数据
Python做爬虫优势
1、Python :请求模块、解析模块丰富成熟,强大的Scrapy网络爬虫框架
2、PHP :对多线程、异步支持不太好
3、JAVA:代码笨重,代码量大
4、C/C++:虽然效率高,但是代码成型慢
爬虫爬取数据步骤
1、确定需要爬取的URL地址
2、由请求模块向URL地址发出请求,并得到网站的响应(网页的源码)
3、从响应内容中提取所需数据
1、所需数据,保存
2、页面中有其他需要继续跟进的URL地址,继续第2步去发请求,如此循环
二. 爬虫请求模块
2.1 headers重构
直接访问网址,网址会直接判断为爬虫程序而非真人操作,可使用下面函数进行模仿
urllib.request.Request(url,headers)
1、url:请求的URL地址
2、headers:添加请求头(爬虫和反爬虫斗争的第一步)
#headers={'User-Agent':'sdfsdfsd'}#百度
User-Agent需要去网上搜索一个进行重构,不过令人高兴的是有直接获取随机User-Agent的库
1、安装fake_useragent类库
2、引用fake_useragent类库
3、创建对象,通过random获取随机User-Agent
使用方法
from fake_useragent import UserAgent
ua=UserAgent()
headers={
'User-Agent': ua.random
}
直接传给header对象即可
2.1 request获取
模块名导入
1、模块名:urllib.request
2、导入方式:
1、import urllib.request
2、from urllib import request
使用方法
urllib.request.urlopen(url,timeout)
参数
1、url:需要爬取的URL地址
2、timeout: 设置等待超时时间,指定时间内未得到响应抛出超时异常
进行headers重构后
req=request.Request(url=url,headers=headers)
res = request.urlopen(req)
小栗子:
向测试网站(http://httpbin.org/get)发起请求,构造请求头并从响应中确认请求头信息
from urllib import request
#定义常用变量 url headers
url='http://httpbin.org/get'
headers={
'User-Agent':'Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168
Version/11.50'
}
#1.创建请求对象
req=request.Request(url=url,headers=headers)
#2.获取请求的返回对象
res=request.urlopen(req)
#3.提取响应内容
html=res.read().decode('utf-8')
print(html)
补充:响应对象(response)方法
1、bytes = response.read() # read()得到结果为 bytes 数据类型
2、string = response.read().decode() # decode() 转为 string 数据类型
3、url = response.geturl() # 返回实际数据的URL地址
4、code = response.getcode() # 返回HTTP响应码
5、string.encode() # bytes -> string
6、bytes.decode() # string -> bytes
2.2 URL地址编码模块
当需要获取其他页面就需要进行URL地址进行编码
# 模块名
urllib.parse
# 导入
import urllib.parse
from urllib import parse
常用方法
urllib.parse.urlencode({dict})
URL地址中一个查询参数
# 查询参数:{'wd' : '美女'}
# urlencode编码后:'wd=%e7%be%8e%e5%a5%b3'
# 示例代码
query_string = {'wd' : '美女'}
result = urllib.parse.urlencode(query_string)
# result: 'wd=%e7%be%8e%e5%a5%b3'
URL地址中多个查询参数
from urllib import parse
params = {
'wd' : '美女',
'pn' : '50'
}
params = parse.urlencode(query_string_dict)
url = 'http://www.baidu.com/s?{}'.format(params)
print(url)
urllib.parse.quote(string)编码
from urllib import parse
string = '美女'
print(parse.quote(string))
# 结果: %E7%BE%8E%E5%A5%B3
#只编译中文
urllib.parse.unquote(string)解码
from urllib import parse
string = '%E7%BE%8E%E5%A5%B3'
result = parse.unquote(string)
print(result)
四. 解析
获得的html页面并没有什么用处,需要使用解析模块进行解析
4.1 正则re解析
正则解析是一个很齐全的方法
#首先导入正则模块
import re
#建立pattern对象
pattern = re.compile('正则表达式',re.S)
#得到解析内容
r_list = pattern.findall(html)
正则表达式写法
贪婪匹配(默认) : .*
非贪婪匹配 : .*?,一般使用.*?
1、想要什么内容在正则表达式中加(.*?),有空格或者不确定的地方就加.*?
2、多个分组,先按整体正则匹配,然后再提取()中数据。结果:[(),(),(),(),()]
正则表达式元字符
案例:这里以明日方舟贴吧的html进行说明
爬取html页面模块
from urllib import request
from urllib import parse
def get_url(wd):
url='https://tieba.baidu.com/f?{}'
params=parse.urlencode({'kw':wd})
url=url.format(params)
return url
def request_url(url,filename):
headers = {
'User-Agent': 'Opera/9.80 (Windows NT 6.1; U; zh-cn) Presto/2.9.168 Version / 11.50'
}
req=request.Request(url=url,headers=headers)
res = request.urlopen(req)
# 提取响应内容
html = res.read().decode('utf-8')
# 保存数据
with open(filename, 'w', encoding='utf-8') as f:
f.write(html)
if __name__ == '__main__':
wd=input('请输入搜索内容:')
url=get_url(wd)
filename=wd+'.html'
request_url(url,filename)
解析模块
import re
# 明日方舟内容解析
with open('明日方舟.html','r',encoding='utf-8') as f:
注意re表达式的写法
pattern=re.compile('