博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
爬虫基础一
阅读量:6079 次
发布时间:2019-06-20

本文共 4425 字,大约阅读时间需要 14 分钟。

一 爬虫的定义和主要的功能

定义:爬虫就是向网站发起请求,获取资源后分析并提取有用的数据。

爬虫主要做的是什么?     模拟浏览器发送请求------》下载网页源代码------》提取有用的数据-------》存放在数据库或者文件中

二 爬虫的基本流程以及请求与响应

基本流程:

  1、发起请求     使用http库向目标站点发起请求,即发送一个Request;Request包含:请求头、请求体等  2、获取响应内容     如果服务器能正常响应,则会得到一个Response;Response包含:html,json,图片,视频等  3、解析内容    解析html数据:正则表达式,第三方解析库如Beautifulsoup,pyquery等;解析json数据:json模块;解析二进制数据:以b的方式写入文件  4、保存数据    数据库;文件

请求与响应 

  http协议:http://www.cnblogs.com/linhaifeng/articles/8243379.html  equest:用户将自己的信息通过浏览器(socket client)发送给服务器(socket server)  Response:服务器接收请求,分析用户发来的请求信息,然后返回数据(返回的数据中可能包含其他链接,如:图片,js,css等)  ps:浏览器在接收Response后,会解析其内容来显示给用户,而爬虫程序在模拟浏览器发送请求然后接收Response后,是要提取其中的有用数据。 

 三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客户端配置,服务端可能将你当做一个非法用户host    cookies:cookie用来保存登录信息    一般做爬虫都会加上请求头4、请求体    如果是get方式,请求体没有内容    如果是post方式,请求体是format data    ps:    1、登录窗口,文件上传等,信息都会被附加到请求体内    2、登录,输入错误的用户名密码,然后提交,就可以看到post,正确登录后页面通常会跳转,无法捕捉到post

 

四 response

1、响应状态    200:代表成功    301:代表跳转    404:文件不存在    403:权限    502:服务器错误2、Respone header    set-cookie:可能有多个,是来告诉浏览器,把cookie保存下来    3、preview就是网页源代码    最主要的部分,包含了请求资源的内容    如网页html,图片    二进制数据等

  

总结

 

1、总结爬虫流程:    爬取--->解析--->存储2、爬虫所需工具:    请求库:requests,selenium    解析库:正则,beautifulsoup,pyquery    存储库:文件,MySQL,Mongodb,Redis3、爬虫常用框架:    scrapy

 

  

 

 校花网示例 

import requestsimport reimport timeimport hashlibdef get_page(url):    print('GET %s' %url)    try:        response=requests.get(url)        if response.status_code == 200:            return response.content    except Exception:        passdef parse_index(res):    obj=re.compile('class="items.*? 0:        movie_url=res[0]        return movie_urldef save(movie_url):    response=requests.get(movie_url,stream=False)    if response.status_code == 200:        m=hashlib.md5()        m.update(('%s%s.mp4' %(movie_url,time.time())).encode('utf-8'))        filename=m.hexdigest()        with open(r'./movies/%s.mp4' %filename,'wb') as f:            f.write(response.content)            f.flush()def main():    index_url='http://www.xiaohuar.com/list-3-{0}.html'    for i in range(5):        print('*'*50,i)        #爬取主页面        index_page=get_page(index_url.format(i,))        #解析主页面,拿到视频所在的地址列表        detail_urls=parse_index(index_page)        #循环爬取视频页        for detail_url in detail_urls:            #爬取视频页            detail_page=get_page(detail_url)            #拿到视频的url            movie_url=parse_detail(detail_page)            if movie_url:                #保存视频                save(movie_url)if __name__ == '__main__':    main()#并发爬取from concurrent.futures import ThreadPoolExecutorimport queueimport requestsimport reimport timeimport hashlibfrom threading import current_threadp=ThreadPoolExecutor(50)def get_page(url):    print('%s GET %s' %(current_thread().getName(),url))    try:        response=requests.get(url)        if response.status_code == 200:            return response.content    except Exception as e:        print(e)def parse_index(res):    print('%s parse index ' %current_thread().getName())    res=res.result()    obj=re.compile('class="items.*? 0:        movie_url=res[0]        print('MOVIE_URL: ',movie_url)        with open('db.txt','a') as f:            f.write('%s\n' %movie_url)        # save(movie_url)        p.submit(save,movie_url)        print('%s下载任务已经提交' %movie_url)def save(movie_url):    print('%s SAVE: %s' %(current_thread().getName(),movie_url))    try:        response=requests.get(movie_url,stream=False)        if response.status_code == 200:            m=hashlib.md5()            m.update(('%s%s.mp4' %(movie_url,time.time())).encode('utf-8'))            filename=m.hexdigest()            with open(r'./movies/%s.mp4' %filename,'wb') as f:                f.write(response.content)                f.flush()    except Exception as e:        print(e)def main():    index_url='http://www.xiaohuar.com/list-3-{0}.html'    for i in range(5):        p.submit(get_page,index_url.format(i,)).add_done_callback(parse_index)if __name__ == '__main__':    main()
爬取校花网视频

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  

转载于:https://www.cnblogs.com/wanghaohao/p/8289622.html

你可能感兴趣的文章
一起来看 rxjs
查看>>
Java容器深入浅出之String、StringBuffer、StringBuilder
查看>>
Spring Cloud Gateway 数据库存储路由信息的扩展方案
查看>>
PostgreSQL 10.1 手册_部分 II. SQL 语言_第 9 章 函数和操作符_9.19. 范围函数和操作符...
查看>>
14 SVM - 代码案例一 - 鸢尾花数据SVM分类
查看>>
PostgreSQL 11 发布:JIT、存储过程事务,并行性能提升
查看>>
分享几篇文章(PDF版)
查看>>
Node.js 全局对象
查看>>
你真的懂使用Runtime进行swizzle的最佳写法?
查看>>
Java JDBC
查看>>
实现multibandblend
查看>>
机器学习 vs 深度学习到底有啥区别,为什么更多人选择机器学习
查看>>
MongoDB安装(Mac版)
查看>>
25.Android Studio下Ndk开发(参数加密解决方案)
查看>>
小程序中使用百度地图
查看>>
Kubeless —— Kubernetes 原生 Serverless 框架
查看>>
我所理解的Android组件化之通信机制
查看>>
以太坊系列之六: p2p模块--以太坊源码学习
查看>>
Confluence 6 用户目录图例 - Confluence 内部目录
查看>>
iOS算法小记
查看>>