爬虫

爬虫

爬虫的应用:

# 1.通用爬虫:通用爬虫是搜索引擎(Baidu、Google、Yahoo等)“抓取系统”的重要组成部分。主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。
  1)搜索引擎如何抓取互联网上的网站数据?
     a)门户网站主动向搜索引擎公司提供其网站的url
     b)搜索引擎公司与DNS服务商合作,获取网站的url
     c)门户网站主动挂靠在一些知名网站的友情链接中

# 2.聚焦爬虫:聚焦爬虫是根据指定的需求抓取网络上指定的数据。
  例如:
      获取豆瓣上电影的名称和影评,而不是获取整张页面中所有的数据值。

爬虫的基本流程:

request:

#1、请求方式:
    常用的请求方式:
    GET,POST

    其他请求方式:
    HEAD,PUT,DELETE,OPTHONS

    ps:用浏览器演示get与post的区别,(用登录演示post)

    post与get请求最终都会拼接成这种形式:
    k1=xxx&k2=yyy&k3=zzz

    post请求的参数放在请求体内:
       可用浏览器查看,存放于form data内
    get请求的参数直接放在url后

#2、请求url
    url全称统一资源定位符,如一个网页文档,一张图片
    一个视频等都可以用url唯一来确定

    url编码: 
      https://www.baidu.com/s?wd=图片
      图片会被编码(看示例代码)

    网页的加载过程是:
      加载一个网页,通常都是先加载document文档,在解析document文档的时候,遇到链接,则针对超链接发起下载图片的请求。

#3、请求头
    User-agent:
    请求头中如果没有user-agent客户端配置,服务端可能将你当做一个非法用户。
    
    Cookies:
    cookie用来保存登录信息。

   Referer:
    浏览器上次访问的网页url

   一般做爬虫都会加上请求头
#4、请求体
    如果是get方式,请求体没有内容
    如果是post方式,请求体是format data

  ps:
    1、登录窗口,文件上传等,信息都会被附加到请求体内
    2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

response:

 

 

爬取校花网:

# pip3 install requests
import requests
import re

# 爬虫三部曲

# 一 发送请求
def get_page(url):
    print()
    index_res = requests.get(url)
    return index_res.text

# 二 解析数据
# 解析主页
def parse_index(index_page):
    detail_urls = re.findall('<div class="items">.*?href="(.*?)"', index_page, re.S)
    # print(detail_urls)

    for detail_url in detail_urls:
        if not detail_url.startswith('http'):
            detail_url = 'http://www.xiaohuar.com' + detail_url
        yield detail_url

# 解析详情页
def parse_detail(detail_page):
    video_urls = re.findall('id="media".*?src="(.*?)"', detail_page, re.S)

    if video_urls:
        video_urls = video_urls[0]
        if video_urls.endswith('.mp4'):
            yield video_urls

    # print(video_urls)


# 三 保存数据
import uuid
def save_video(video_url):
    try:
        res = requests.get(video_url)
        with open(r'D:\tank\day01\movies\%s.mp4' % uuid.uuid4(), 'wb') as f:
            f.write(res.content)
            f.flush()

    except Exception:
        pass


if __name__ == '__main__':
    base_url = 'http://www.xiaohuar.com/list-3-{}.html'
    for line in range(5):
        index_url = base_url.format(line)

        index_page = get_page(index_url)
        detail_urls = parse_index(index_page)
        for detail_url in detail_urls:
            detail_page = get_page(detail_url)
            video_urls = parse_detail(detail_page)
            for video_url in video_urls:
                save_video(video_url)
普通爬取版
import requests
import re
from concurrent.futures import ThreadPoolExecutor

pool = ThreadPoolExecutor(50)

# 爬虫三部曲

# 一 发送请求
def get_page(url):
    print('%s GET start ...' % url)
    index_res = requests.get(url)
    return index_res.text

# 二 解析数据
# 解析主页
def parse_index(index_page):
    # 拿到主页的返回结果
    res = index_page.result()
    detail_urls = re.findall('<div class="items">.*?href="(.*?)"', res, re.S)
    # print(detail_urls)

    for detail_url in detail_urls:
        if not detail_url.startswith('http'):
            detail_url = 'http://www.xiaohuar.com' + detail_url

        pool.submit(get_page, detail_url).add_done_callback(parse_detail)
        # yield detail_url

# 解析详情页
def parse_detail(detail_page):
    res = detail_page.result()

    video_urls = re.findall('id="media".*?src="(.*?)"', res, re.S)

    if video_urls:
        video_urls = video_urls[0]
        if video_urls.endswith('.mp4'):
            pool.submit(save_video, video_urls)

    # print(video_urls)


# 三 保存数据
import uuid
def save_video(video_url):
    try:
        res = requests.get(video_url)
        with open(r'D:\tank\day01\movies\%s.mp4' % uuid.uuid4(), 'wb') as f:
            f.write(res.content)
            f.flush()
            print('%s done ...' % video_url)

    except Exception:
        pass


if __name__ == '__main__':
    base_url = 'http://www.xiaohuar.com/list-3-{}.html'
    for line in range(5):
        index_url = base_url.format(line)
        pool.submit(get_page, index_url).add_done_callback(parse_index)
高并发版
查询出来的页面要返回content
yeild使用的缩进

 

posted @ 2019-03-07 15:07 ChuckXue 阅读( ...) 评论( ...) 编辑 收藏
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值