爬虫(抓取静态页面和动态页面的区别,get请求和post请求的区别)

静态页面:

非结构化数据: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请求了)

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值