简单了解python爬虫

简单了解python爬虫

一、什么是爬虫

1.1爬虫Spider的概念

  • 爬虫用于爬取数据,又称之为数据采集程序。
  • 爬取的数据来源于网络,网络中的数据可以是由Web服务器(Nginx/Apache)、数据库服务器(MySQL、Redis)、索引库(ElastichSearch) 、大数据(Hbase/Hive)、视频/图片库(FTP)、云存储等(OSS)提供的。
  • 爬取的数据是公开的、非盈利的。

1.2 Python爬虫

使用Python编写的爬虫脚本(程序)可以完成定时、定量、指定目标(Web站点)的数据爬取。主要使用多(单)线程/进程、网络请求库、数据解析、数据存储、任务调度等相关技术。

#请求报文(请求头header和请求体body以空行分开)
POST/s HTTP/1.1
HOST:www.baidu.com
Content-Type:application/json
Content-Length:24
{"name":"disen","phone":"17365488888"}

#相应报文
HTTP/1.1 200 OK
Content-Type:text/html,charset=utf-8
Content-Length:300

<html>
.....
</html>

二、爬虫与Web后端服务之间的关系

  • 爬虫使用网络请求库,相当于客户端请求,Web后端服务根据请求响应数据。
  • 爬虫即向Web服务器发起HTTP请求,正确地接收响应数据,然后根据数据的类型(Content-Type)进行数据的解析及存储。
  • 爬虫程序在发起请求前,需要伪造浏览器(User-Agent指定请求头),然后再向服务器发起请求,响应200的成功率高很多。|

三、Python爬虫技术的相关库

1.网络请求:

  • urllib
  • requests / urllib3
  • selenium(UI自动测试、动态js渲染)
  • appium(手机App的爬虫或UI测试)

2.数据解析:

1.re正则

2.xpath

3.bs4

4.json

json序列化:将对象转换成字符串或字节
json反序列化:将字符串或字节转换成对象

3.数据存储:

  • pymysql
  • mongodb
  • elasticsearch

4.多任务库:

  • 多线程(threading)
  • 线程队列queue
  • 协程(asynio、gevent/eventlet)

5.爬虫框架

  • scrapy
  • scrapy-redis分布式(多机爬虫)

四、常见反爬虫的策略

  • UA (User-Agent)策略

  • 登录限制(Cookie)策略

  • 请求频次(IP代理)策略

  • 验证码(图片-云打码,文字或物件图片选择、滑块)策略

  • 动态js (Selenium/Splash/api接口)策略

初次使用urllib实现爬虫的数据请求
urllib.request.urlopen(ur1)发起get请求
urllib.parse.quote()将中文进行url编码
urllib.request.urlretrieve(url,filename)下载url保存到filename

 

案例:爬取漫画岛网站漫画图片

https://www.manhuadao.cn/

下载库:

1.通过命令pip install requests 

2.通过pycharm--File | Settings | Project: Pythonwork | Project Interpreter--点击+号搜索需要的库进行添加

#导入第三方库
from urllib import response
from xml import etree

import requests

#获取网页中的数据(网页源代码)
def get_urls(url):

    #反爬 爬虫来模拟浏览器
    headers = {
        'User - Agent': 'Mozilla/5.0(Windows NT 6.1; Win64; x64) ApplewebKit/537.36(KHTML,like Gecko) Chrome / 72.0.3626.121 Safari/537.36'
    }

    response = requests.get(url,headers)
    # print(response.text) 获取到的网页源代码

    return response.text

#获取网页图片链接(爬取的那个图片)
def html_result(text):

   html = etree.HTML(text)
   # print(html)
   """
   <div class="main-content">
    <ul>
        ......
        <img src="http://img.manhuadao.cn/api/v1/bookcenter/scenethumbnail/1/168407/U_01f7e72e-c343-4688-8a5f-2049c77d73b9.jpg" alt="">
        ....
   </div>
   // 可以提取某个标签的所有信息
   @ 选取属性
   / 选择某一个便签
   """
   #获取所有属性class的值为main-content的div便签下的类
   html.xpath('//div[@class="main-content"]//img/@src')
   return img_urls

#下载网页当中的数据
def get_img(url,name):
    #请求下载地址
    reaponse = requests.get(url)
    #开始下载:%s 占位符,%name get_img(u,image_name3),wb:以二进制的方式写入图片
    with open("D:\img\%s.jpg"%name"wd") as f:
        f.write(response.content)


#定义一个函数来调用这3个功能
def main():
    url = 'https://www.manhuadao.cn/Comic/ComicView?comicid=58ddb12627a7c1392c23c427&chapterid=2182076'

    #调用第一个函数
    result = get_urls(url)
    #调用第二个函数
    html_result(result)

    #循环遍历图片
    for u in image_urls:
        '''
        <img src="http://img.manhuadao.cn/api/v1/bookcenter/scenethumbnail/1/168407/U_fea8cfad-f288-4364-83e8-348c9e3815ae.jpg" alt="">
        '''
        #截取数据返回个列表--倒着取
        image_name = u.split('/')[-1]
        #按.截取--正着取
        image_name2 = image_name.split('.')[0]
        # #按-截取--倒着取【348c9e3815ae】
        image_name3 = image_name2.split('-')[-1]
        get_img(u,image_name3)
        print(image_name3)
#执行程序:执行判断:不会受到外面的干扰或其他程序错误调用你自己的测试程序
if __name__ == '__main__':
    main()
#最后爬虫完毕,这次的爬虫只能爬取一页,如果爬取多页,可以用列表存取,如果要效率更高,到后来可以使用多线程爬虫。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值