静态页面:
非结构化数据:HTML
处理方式:正则表达式,xpath, beautifulsoup4
静态页面中的数据都包含在网页的HTML中(一般都是get请求)
所以可以直接在网页的HTML中提取数据
关键词一般都以查询字符串的方式拼接在URL中
分析URL的变化可以进行多页爬取
python2: urllib + urllib2 / requests
# coding=utf-8
import urllib2
import urllib
headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"}
key_word = raw_input("请输入想要爬取的贴吧名字:")
page = int(input("请输入需要爬取的页数:"))
base_url = 'https://tieba.baidu.com/f?'
for i in range(0,page):
params = {
'kw':key_word,
'pn':(i)*50,
}
url = base_url + urllib.urlencode(params)
print(url)
request = urllib2.Request(url,headers=headers)
response = urllib2.urlopen(request)
html = response.read()
with open(key_word + '.txt','a') as f:
f.write(html)
print'第%d页'%(i+1)
print '数据抓取完毕'
这样可以获取贴吧的静态页面的HTML
python3: urllib + urllib.request / requests
页面提取技术:
1.re(正则)
1>主要方法有:search(返回字符串),match(返回字符串),findall(返回列表),sub(返回字符串)
2>正则前加上r表示按原生字符串进行匹配,特殊符号不需要转义
3>匹配是注意贪婪和非贪婪模式
4>可以先创建一个pattern = re.compile(r''),可以不必每次正则匹配时重新创建pattern,可以节省内存空间
2.xpath和lxml
1>xpath基于HTML的树结构和节点进行取值
2>匹配方式
3>lxml的使用方法
html = etree.HTML(text)
ret_list = html.xpath("xpath字符串")
3.beautifulsoup4
1>基本使用
soup = BeautifulSoup(html, "lxml")
node_list = soup.select(".even, .odd")
2>bs4是基于css选择器的,选择class,id,层级选择器方式都和CSS语法相同
3>主要有select(), find(), findall()三个方法,select,findall返回列表,find返回当个对象
4>获取文本内容:get_text() 或string
获取属性值: get('属性名') 或attrs['属性名']
动态页面
结构化数据:json,xml等
处理方式:直接转化为python类型
动态页面和静态页面最主要的区别就是当数据刷新的时候用了ajax技术,刷新时从数据库查询数据并重新渲染到前端页面
数据都存储在json中,爬取HTML是获取不到数据的
json数据提取技术(jsonpath)
1.动态页面都需要动态抓包来获取response中的json数据
2.刷新页面,打开开发者模式,点击Network,在点击XHR,找到获取json数据的URL
3.json有4个方法(json.loads(), json.dumps())括号中接收字符串 (json.load(), json.dumps())括号中接收的是文件
loads: 将json数据转换成python数据 dumps: 将python数据转化成json数据
4.jsonpath的语法与xpath的语法很相似
$: 根节点 . : 下一级节点 通常用法: $..节点名
5.jsonpath中接收的参数必须是python类型的
例如: result_list = jsonpath(python_dict,"$..result")
6.可以在发送请求时使用.json()的方法获取python数据
GET请求和POST请求的区别?
GET请求中的URL可以包含查询字符串,请求响应的请求体中中一定不能包含表单数据
POST请求中的URL可以包含查询字符串,请求响应的请求体中一定包含表单数据(不包含表单数据也不会报错,那样就直接使用GET请求了)