爬虫day01 基本介绍,请求

目录

1.网络爬虫

6.Chrome浏览器插件

7.Filldler抓包工具

8.Anaconda 和 spyder

9.WEB

10.爬虫请求模块

11.作业


1.网络爬虫


    1.定义:网络蜘蛛 网络机器人 ,抓取网络数据的程序
    2.总结:用python程序去模仿人去访问网站,模仿的越逼真越好
    3.目的:通过有效的大量的数据分析市场走势,公司的决策
2.企业获取数据的方式
    1.公司自有
    2.第三方数据平台购买
        数据堂 贵阳大数据交易所
    3.爬虫爬取数据
        市场上没有或者价格太高,利用爬虫程序去爬取
3.python做爬虫的优势
    python:请求模块,解析模块丰富成熟
    PHP:对多线程,异步支持不够好
    JAVA: 代码笨重,代码量大
    C/C++:虽然效率高,但是代码成型太慢
4.爬虫的分类
    1.通用的网络爬虫(搜索引擎引用,需要遵守robots协议)
        1.搜索引擎如何获取一个新网站的url
            1.网站主动向搜索引擎提供(百度站长平台)
            2.和DNS服务商(万网),快速收录新网站
    2.聚焦网络爬虫
        自己写的爬虫程序:面向主题爬虫 面向需求爬虫

        爬虫 反爬虫 反反爬虫
5.爬取数据步骤
    1.确定需要爬取的url地址
    2.通过HTTP/HTTPS协议来获取响应的HTML页面
    3.提取HTML页面里有用的数据
        1.所需数据,保存
        2.页面中其他的URL,继续 2 步

6.Chrome浏览器插件

    1.插件安装
        1.右上角-更多工具-扩展程序
        2.点开 开发者模式
        3.把插件退拽到浏览器界面
    2.插件介绍
        1.Proxy SwitchOmega:代理切换插件
        2.XPath Helper:网页数据解析插件
        3.JSON View:查看json格式的数据(好看)

7.Filldler抓包工具

    1.抓包设置
        1.设置Filldler抓包工具
        2.设置浏览器代理

8.Anaconda 和 spyder

    1.anaconda:开源的python发行版本
    2.Spyder:集成的开发环境
        spyder常用快捷键
            1.注释/取消注释:ctrl+1
            2.保存:ctrl+s
            3.允许程序:F5

9.WEB

    1.HTTP 和 HTTPS
        1.HTTP:80
        2.HTTPS:443 HTTP的升级版
    2.GET 和 POST
        1.GET:查询参数会在URL上显示出来
        2.POST:查询参数和提交数据在form表单里,不会再URL地址上显示
    3.URL
        http://  item.jd.com   :80  /26606127795.html #detail
         协议     域名/IP地址  端口  要访问的资源路径   锚点 
    4.User-Agent
        记录用户的浏览器,操作系统等,为了让用户获取更好的HTML页面效果

        Mozilla : Firefox(Gecko内核)
        IE : Trident()
        Linux : KHTML(like Gecko)
        Apple : Webkit(like KHTML)
        google : Chrome(like webkit)

10.爬虫请求模块

    1. urllib.request
        1.版本
            1.python2中:urllib 和 urllib
            2.python3中:把两者合并,urllib.request
        2.常用方法
            1.urllib.request.urlopen("url")
            作用:向网站发起请求并获取响应

import urllib.request
url = "http://www.baidu.com/"
# 发起请求并获取响应对象
response = urllib.request.urlopen(url)
# 响应对象的read()方法获取响应内容
# read()得到的是 bytes 类型
# decode() bytes -> string
html = response.read().decode("utf-8")
print(html)

     2、urllib.request.Request(url,headers={})
        1、重构User-Agent,爬虫和反爬虫斗争第一步
        2、使用步骤
          1、构建请求对象request :Request()
          2、获取响应对象response :urlopen(request)
          3、利用响应对象response.read().decode("utf-8")

import urllib.request

url = "http://www.baidu.com/"
headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}

# 1.构建请求对象
request = urllib.request.Request(url,headers=headers)
# 2.获取响应对象
response = urllib.request.urlopen(request)
# 3.获取响应对象内容
html = response.read().decode("utf-8")
# 获取响应码
print(response.getcode())
# 获取响应报头信息
print(response.info())

    3. 请求对象request方法
        1. add_header()
              作用 : 添加/修改headers(User-Agent)
        2. get_header("User-agent") : 只有U是大写
              作用 : 获取已有的HTTP报头的值

import urllib.request

url = "http://www.baidu.com/"
headers = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"

# 1.构建请求对象
request = urllib.request.Request(url)
# 请求对象方法 add_header()
request.add_header("User-Agent",headers)
# 获取响应对象
response = urllib.request.urlopen(request)

# get_header()方法获取 User-Agent
print(request.get_header("User-agent"))

    4. 响应对象response方法
        1. read() : 读取服务器响应的内容
        2. getcode()
              作用 : 返回HTTP的响应码
                200 : 成功
                4XX : 服务器页面出错
                5XX : 服务器出错
        3. info()
              作用 : 返回服务器响应的报头信息
  2.urllib.parse
    1.quote("中文") 见:04_quote编码.py
    2.urlencode(字典)
          url : wd="美女"

          d = {"wd":"美女"}
          d = urllib.parse.urlencode(d)
          print(d)
          结果 : wd=%E7%BE%8E%E5%A5%B3
    3.unquote("编码之后的字符串")

import urllib.request
import urllib.parse

headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
url = "http://www.baidu.com/s?wd="
key = input("请输入要搜索的内容:")
# 编码,拼接URL
key = urllib.parse.quote(key)
fullurl = url + key
# 构建请求对象
request = urllib.request.Request(fullurl,headers=headers)
# 获取响应对象
response = urllib.request.urlopen(request)
# read().decode()
html = response.read().decode("utf-8")
print(html)
import urllib.request
import urllib.parse

baseurl = "http://www.baidu.com/s?"
headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
key = input("请输入要搜索的内容:")
# urlencode编码,参数一定要是字典
d = {"wd":key}
d = urllib.parse.urlencode(d)
url = baseurl + d
# 构建请求对象
request = urllib.request.Request(url,headers=headers)
# 获取响应对象
response = urllib.request.urlopen(request)
# 获取内容
html = response.read().decode("utf-8")
print(html)


  3.百度贴吧数据抓取
    要求:
      1.输入贴吧的名称
      2.输入抓取的起始页和终止页
      3.把每一页的内容保存到本地:第1页.html 第2页.html
    步骤:
      1. 找URL规律(拼接URL)
        第1页 :http://tieba.baidu.com/f?kw=达内&pn=0
    第2页 :http://tieba.baidu.com/f?kw=达内&pn=50
    第3页 :http://tieba.baidu.com/f?kw=达内&pn=100
    第n页 :pn=(n-1)*50
      2. 获取响应内容

      3. 保存到本地/数据库

# 数据抓取
import urllib.request
import urllib.parse

baseurl = "http://tieba.baidu.com/f?"
headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}

name = input("请输入贴吧名:")
begin = int(input("请输入起始页:"))
end = int(input("请输入终止页:"))
# URL进行编码
kw = {"kw":name}
kw = urllib.parse.urlencode(kw)
# 写循环拼接URL,发请求获响应,写入本地文件
for page in range(begin,end+1):
    # 拼接URL
    pn = (page-1)*50
    url = baseurl + kw + "&pn=" + str(pn)
    # 发请求,获响应
    req = urllib.request.Request(url,headers=headers)
    res = urllib.request.urlopen(req)
    html = res.read().decode("utf-8") # 字符串
    # 写文件/保存到本地
    filename = "第" + str(page) + "页.html"
    with open(filename,"w",encoding="utf-8") as f:
        print("正在下载第%d页" % page)
        f.write(html)
        print("第%d页下载成功" % page)
        print("*" * 30)
# 封装成类后

import urllib.request
import urllib.parse

class BaiduSpider:
    def __init__(self):
        self.baseurl = "http://tieba.baidu.com/f?"
        self.headers = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16"}
    
    # 请求并读取页面内容
    def getPage(self,url):
        req = urllib.request.Request(url,headers=self.headers)
        res = urllib.request.urlopen(req)
        html = res.read().decode("utf-8")
        return html

    # 保存到本地文件
    def writePage(self,filename,html):
        with open(filename,"a",encoding="utf-8") as f:
            f.write(html)
    
    # 主函数
    def workOn(self):
        name = input("请输入贴吧名:")
        begin = int(input("请输入起始页:"))
        end = int(input("请输入终止页:"))
        kw = {"kw":name}
        kw = urllib.parse.urlencode(kw)
        for page in range(begin,end+1):
            pn = (page-1) * 50
            url = self.baseurl + kw + "&pn=" + str(pn)
            print("正在下载第%d页" % page)
            html = self.getPage(url)
            filename = "第" + str(page) + "页.html"
            self.writePage(filename,html)
            print("第%d页下载成功" % page)        
    
if __name__ == "__main__":
    # 创建对象
    spider = BaiduSpider()
    # 对象调用类内方法
    spider.workOn()

11.作业

  1、爬取猫眼电影top100榜
    1、程序运行,直接爬取第1页
    2、是否继续爬取(y/n):
      y :爬取第2页
      n :爬取结束,谢谢使用
    3、把每一页的内容保存到本地 第1页.html ...

    普通版 && 类

  2、步骤
    1、URL
    2、获取响应内容
    3、写入本地

import urllib.request
import re

class MaoYanSpider:
    def __init__(self):
        self.headers = {"User-Agent":"Mozilla4.0/"}
        self.page = 1
        self.offset = 0
        self.baseurl = "http://maoyan.com/board/4?offset="
        
    # 获取html源码
    def getPage(self,url):
        req = urllib.request.Request(url,headers=self.headers)
        res = urllib.request.urlopen(req)
        html = res.read().decode("utf-8")
        return html

    # 正则解析html源码
    def parsePage(self,html):
        p = re.compile('<div class="movie-item-info">.*?title="(.*?)".*?class="star">(.*?)</p>.*?class="releasetime">(.*?)</p>.*?</div>',re.S)
        content_list = p.findall(html)
        # [("霸王别姬","张国荣","1993"),(),()]
        return content_list
    
    # 写入本地文件
    def writePage(self,content_list):
        for m_tuple in content_list:
            for n_str in m_tuple:
                with open("猫眼电影.txt","a",encoding="utf-8") as f:
                    f.write(n_str.strip() + "\n")
            
            with open("猫眼电影.txt","a",encoding="utf-8") as f:
                f.write("\n\n")
    # 主函数
    def workOn(self):
        while True:
            url = self.baseurl + str(self.offset)
            print("正在爬取第%d页" % self.page)
            html = self.getPage(url)
            content_list = self.parsePage(html)
            self.writePage(content_list)
            print("第%d页爬取成功" % self.page)
            
            c = input("是否继续爬取(y/n):")
            if c.strip().lower() == "y":
                self.offset += 10
                self.page += 1
            else:
                print("爬取结束,谢谢使用!")
                break

if __name__ == "__main__":
    spider = MaoYanSpider()
    spider.workOn()


猜你喜欢

转载自blog.csdn.net/zh__quan/article/details/82624192
今日推荐