day01-认识爬虫

准备知识:
  一、HTTP和HTTPS
    HTTP
      超文本传输协议
      默认端口号:80
    HTTPS
      HTTP+SSL(安全套接层)
      默认端口号:443
    HTTPS比HTTP更安全、但是性能更低


  二、python中Bytes类型和str类型
    bytes:二进制
      互联网上数据都是以二进制的方式传输的
    str:unicode呈现形式
      unicode实现方式:utf-8(三位)和gbk(两位)
    python3开始将两个类型分开
      Bytes类型将字符流(011001)转为肉眼不识的码(\adf\dvs\dfo),然后str将其转为可识别的
      Bytes ——> str 解码 decode
      str ——> Bytes 编码 encode

  三、url的形式
    形式:
      http://www.baidu.com
      http://localhost:4000/file/part01/1.2.html
    包含内容:
      scheme:协议(例如:http,https,ftp)
      host:服务器的IP地址或者域名
      port:服务器的端口
      path:访问资源的路径
      query-string:参数,发送给http服务器的数据
      anchor:锚

  四、HTTP请求
    http常见请求头
      Host(主机和端口号)
      Connection(链接类型)
      Upgrade-Insecure-Requests(升级为HTTPS请求)
      User-Agent(浏览器名称)
      Accept(传输文件类型)
      Referer(页面跳转处)
      Accept-Encoding(文件编解码格式)
      Cookie(cookie)
      x-requested-with:XMLHttpRequest(是Ajax异步请求)
    请求方式
      POST和GET
      响应状态码
      200:成功
      302:临时转移至新的url
      307:临时转移至新的url
      404:not found
      500:服务器内部错误
入门知识:
  一、学习过程
    基础知识——>requests的使用——>数据提取方法——>动态网页数据提取——>scrapy——>scrapy redis

  二、爬虫基础
    概念
      爬虫是模拟浏览器发送请求,获取响应
    流程
      url——>发送请求,获取响应——>提取数据——>保存
      发送请求,获取响应——>提取url
    注意
      爬虫要根据当前url地址对应的响应为准,当前url地址的element的内容和url的响应不一样
    数据
      1) 页面上的数据来自哪里
        当前url得知对应的响应中
        其他的url地址对应的响应中
          比如ajax请求中
      2) js生成的
        部分数据在响应中
        全部通过js生成

  三、爬虫分类
    通用爬虫:通常指搜索引擎的爬虫
      流程:抓取网页——>数据存储——>预处理——>提供检索服务
    聚焦爬虫:针对特定网站的爬虫
      流程:url列表——>响应内容(重新提取url放入列表)——>提取数据——>入库

  四、ROBOTS协议
    概念
      网站通过Robots协议告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取

 

入门示例
  一、简单请求(get方式)
  需求
    通过requests向百度首页发送请求,获取百度首页的数据
    response = requests.get(url)
  response的常用方法:
    response.text
    response.content
    response.status_code
      响应体中的状态码
    response.request.headers
      请求体的头部信息
    response.headers
      响应体的头部信息:以字典形式返回

 

  二、带header请求
    无header请求
      python请求所带的User-Agent是python默认,被检测到后没有返回真正的网页内容
    带header请求
      用python以字典形式进行制作
      headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
      response = requests.get('http://www.baidu.com',headers=headers)

 

  三、发送带参数的请求
    什么是参数
      百度直接搜索python,但是返回的链接中带有很多参数
      https://www.baidu.com/s?wd=python&rsv_spt=1&rsv_iqid=0xbcbbc6fc00006ee9&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_su
      https://www.baidu.com/s?wd=python 其实直接带这个一样效果
    构造参数
      方式一
        p = {'wd':'python'}
        url_temp = 'http://www.baidu.com/'
        r = requests.get(url_temp,headers=headers,params=p)
      方式二
        url = 'http://www.baidu.com/s?wd={}'.format('python')
        r = requests.get(url_temp,headers=headers)
        format的使用:

1 >>> '1{}23'.format(1)
2 '1123'
3 >>> '1{}23'.format('a')
4 '1a23'
5 >>> '1{}23'.format('[5,6,7]')
6 '1[5,6,7]23'
View Code

 

 1 import requests
 2 
 3 #get请求
 4 
 5 '''
 6 response = requests.get('http://www.baidu.com')
 7 # response = requests.get('http://www.1211.cn')
 8 ret = response.status_code
 9 print(ret) # 200
10 assert ret == 200 # 断言ret等于200,如果等于不显示任何,如果不等于报错
11 # assert ret == 300 # AssertionError
12 
13 
14 # 请求体 response.request
15 print(response.request.headers) # {'User-Agent': 'python-requests/2.20.1', 'Accept-Encoding': 'gzip, deflate', 'Accept': '*/*', 'Connection': 'keep-alive'}
16 print(response.request.url) # http://www.baidu.com/
17 
18 print(response.content.decode()) # 如果直接这样访问,使用python默认的请求头,服务器识别后不会返回真实的网页内容
19 '''
20 
21 '''
22 # 伪造headers
23 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
24 # 头部不能有空格
25 response = requests.get('http://www.baidu.com',headers=headers)
26 ret = response.status_code
27 print(ret)
28 print(response.content.decode()) # 此时返回整个页面
29 '''
30 
31 # 构造参数
32 # 方式一
33 headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
34 p = {'wd':'python'}
35 url_temp = 'http://www.baidu.com/'
36 # url_temp = 'http://www.baidu.com/s?'
37 r = requests.get(url_temp,headers=headers,params=p)
38 print(r.status_code)
39 print(r.request.url) # https://www.baidu.com/?wd=python 如果没有解码,可以使用在线解码
40 # 方式二
41 url = 'http://www.baidu.com/s?wd={}'.format('python')
42 r = requests.get(url_temp,headers=headers)
43 print(r.status_code)
44 print(r.request.url)
View Code

  四、练习
    实现任意贴吧的爬虫,保存网页到本地

 1 import requests
 2 
 3 class tiebaSpider:
 4     def __init__(self,tieba_name):
 5         self.tieba_name = tieba_name
 6         self.url_temp = 'https://tieba.baidu.com/f?kw='+tieba_name+'&pn={}'
 7         self.headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'}
 8 
 9     def get_url_list(self): # 1.构造url列表
10         url_list = []
11         for i in range(5):
12             url_list.append(self.url_temp.format(i*50))
13         return url_list
14 
15     def parse_url(self,url):
16         print(url)
17         response = requests.get(url,headers=self.headers)
18         return response.content.decode()
19 
20     def save_html(self,html_str,page_num):
21         file_path = '{}-第{}页.html'.format(self.tieba_name,page_num)
22         with open(file_path,'w',encoding='utf-8') as f:
23             f.write(html_str)
24 
25     def run(self): # 实现主要逻辑
26         # 思路
27         # 1.构造url列表
28         # 2.遍历,发送请求,获取响应
29         # 3.保存
30         url_list = self.get_url_list()
31 
32         for url in url_list:
33             html_str = self.parse_url(url)
34             page_num = url_list.index(url)+1
35             self.save_html(html_str,page_num)
36 
37 
38 if __name__ == '__main__':
39     tieba_spider = tiebaSpider('李毅')
40     tieba_spider.run()
View Code

 

转载于:https://www.cnblogs.com/xuedingwangluo/p/10069419.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值