python爬虫开发基本知识点梳理

                                                                       Python爬虫开发基本知识点

 

概述:自动化的从网络中(网页或者app等客户端)获取数据,并保存起来的程序.

***理论上,一切可以浏览看到的数据都可以获取到.

***本质:发送正确的请求,获取想要响应。

**概述爬虫开发过程:

 

一,目标站点分析,准备阶段的注意事项:

  1. 检查网站根目录下/robots.txt中君子协议的说明

如果没有robots文件,则默认网站数据允许采集

哪些目录数据可以采集,哪些不允许,否则牵扯到商业性数据他用时,有法律纠纷从该出核定。

关于robots.txt文件:文档尾部详细说明。

2,从robots.txt文件中分析网站地图

即各分类网址,但要注意有些数据不完整;

初步查看网站拥有者,域名注册者。

3,初步分析网站或app采用的页面技术

借用浏览器开发者工具或抓包工具查看数据显示,分析页面框架技术,静态还是动态。

4,估计数据量的大小,以备后期选用数据库的选型。

二,尝试突破

  1. 首先用相对简单快速的工具,探索突破网站需要的验证

    谷歌浏览器开发者工具;

    Postman软件测试获取数据;

   app尝试用fiddler手机代理测试;

2,requests模块编写简单脚本

  1. 分析突破网站的技术难点,以数据完整度为前提,首选web采集,其次APP端。
  2. 逐个突破技术难点,暂时突破不了的选用其他采集途径。
  3. 常见的反爬机制
    1. 封ip----ip代理解决;
    2. 验证码:打码平台或自己封装图片识别方法;
    3. Js加密:截图识别或破解js加密;
    4. UA,cookie,模板等常见反爬;
    5. APP端验证签名机制:查找git破解算法的,或自行利用安卓逆向技术破解其对应算法,并将算法编写本地c语言的so库文件,来突破验签。

 

三,突破后,准备正式框架采集,提高效率,做好反爬策略

  1. 选用爬虫框架,scrapy,分布式,redis技术点,编写爬虫脚本;
  2. 考虑是否并行采集,提高采集效率,多线程、多进程或协程;
  3. 调整爬虫代码逻辑;
  4. 根据数据量和数据格式选用数据库HBase\Mongodb\mysql;
  5. 选用高效的ip代理;

 

四,上线测试服务器测试

  1. 长时间采集遇到的反爬问题,需要反复测试和观察,调整爬虫策略,休息时间等
  2. 循环自动采集设置;例如从feeds流出去最新数据,并做重复排除,让数据采集形成闭环,自动循环采集数据;
  3. 断点记录,重启时自动从断点开始;
  4. 报警机制,采集检测,中断报警,数据异常报警;
  5. 日志记录,数据异常报警记录。

 

五,优化采集效率:

  1. 代码逻辑优化,效果最明显的地方。
    1. 爬虫代码逻辑优化
    2. 框架优化,爬虫脚本衔接用中间件,缓存机制,kafuka,或多种mq
  2. ip代理成功率高的ip代理
  3. 服务器配置:cpu内存,带宽

 

**知识点梳理:

  1. 相关关键字说明:

Url:请求路径、请求地址;

Method:请求方式;

Cookies:请求需要的cookie信息;

Params:请求参数;

User_Agent:简称UA,浏览器信息;

Host:目的主机;

Referer:请求的来源;

  1. 发送网络请求:(get/post)

Post和Get区别:post加密更安全,get显示在地址栏不安全;

     数据量不同,post没有限制,get受限于浏览器地址栏内容长度限制;

     发送数据方式不同,get显示在浏览器地址栏,post表单形式隐藏提交;

     Get效率比post高。

Python2中:urllib负责将请求编码,urllib2负责发送请求;

Python3中:可用第三方包requests(对urllib封装过),更方便发送请求,接收响应;

用pip安装requests:pip install requests

请求携带的常用参数说明:

proxies=proxies   :ip代理

timeout=10       :请求超时设置

headers=headers  :请求头设置

cookies          :cookies信息

url              :请求地址

params           :请求地址后跟的参数键值对get

json         :json数据格式键值对参数 post

data         :表单参数 post

stream       :True:跳转后的链接继续发送请求

 

发送get请求演示

     Import requests

     url = ‘http://xxxxxx’

     proxies = {type.lower():type.lower()+’://’+ip+’:’+port}  //ip代理

     res = requests.get(url,params=params).text

     print(res)

发送post请求

data ={‘username’=’xxxxx’,’password’=’xxxx’}

url = ‘http://xxxxx’

text = requests.post(url,data=data).text

json = requests.post(url,data= data).json()    //接收json响应数据

userinfo={"ua":"username","pw":"password"}

login=requests.post(login_url,json=userinfo)

cookies=login.cookies           #获取登录后的cookies

myaddress=requests.get(myaddress_url,cookies=cookies)

3,用lxml第三方库对响应页面进行解析:

    Pip install lxml

    From lxml import etree

    text=requests.get(‘http://xxxxx’).text

    Html = etree.HTML(text)     //将响应字符串文本转换为HTML文档

**xpath语法:

//  : 定位根节点;

Nodename(标签名) :根据标签名定位元素;

[] :筛选元素;

@  :取一个属性值;

/  :取下级标签

text()   :取标签内文本数据;

starts-with(@属性,值):该属性以某个值作为开头;

contains(@属性,值) :和not一起使用,排除掉属性不包含值的元素;

|  :或,选择多个标签;

or  :或,在筛选元素时用;

and :并且,在筛选元素时用

getchildren() :获取子节点:tr.getchildren()[1].text

例如:html = etree.HTML(requests.get(‘xxx’).text)

result = html.xpath(‘//div[@class=”my_div”]/a/text()’)[0] //得到序列

 

4,响应中携带的信息:

    -- r.status_code     #响应状态码:200,403
  -- r.content      #字节方式的响应体,会自动为你解码

  -- r.headers      #以字典对象存储服务器响应头,但是这个字典比较特殊,字典键不区分大小写,若键不存在则返回None
  -- r.json()      #Requests中内置的JSON解码器
  -- r.url         # 获取url
  -- r.encoding        # 编码格式
  -- r.cookies          # 获取cookie
  -- r.raw          #返回原始响应体
  -- r.text           #字符串方式的响应体,会自动根据响应头部的字符编码进行解码
  -- r.raise_for_status() #失败请求(非200响应)抛出异常

 

*****Requests源码解析:

python爬虫开发基本知识点梳理_第1张图片

 

 

*****网站robots.txt文件解读:

robots.txt是一个纯文本文件,是搜索引擎蜘蛛爬行网站的时候要访问的第一个文件,当蜘蛛访问一个站点时,它会首先检查该站点根目录下是否存在robots.txt,如果存在,搜索机器人就会按照该文件中的内容来确定访问的范围,相当于网站与搜索引蜘蛛遵循协议,如果该文件不存在,所有的搜索蜘蛛将能够访问网站上所有没有被屏蔽的网页。
 robots的语法:
  1、User-agent 定义搜索引擎。一般情况下,网站里面都是:User-agent: ,这里的意思是所有,表示定义所有的搜索引擎。比如,我想定义百度,那么就是User-agent: Baiduspider;定义google,User-agent: Googlebot。
  2、Disallow 禁止爬取。如,我想禁止爬取我的admin文件夹,那就是Disallow: /admin/。禁止爬取admin文件夹下的login.html,
  Disallow: /admin/login.html。
  3、Allow 允许。我们都知道,在默认情况下,都是允许的。那为什么还要允许这个语法呢?举个例子:我想禁止admin文件夹下的所有文件,除了.html的网页,那怎么写呢?我们知道可以用Disallow一个一个禁止,但那样太费时间很精力了。这时候运用Allow就解决了复杂的问题,就这样写:
  Allow: /admin/.html$
  Disallow: /admin/。
  4、$ 结束符。例:Disallow: .php$ 这句话的意思是,屏蔽所有的以.php结尾的文件,不管前面有多长的URL,如abc/aa/bb//index.php也是屏蔽的。
  5、* 通配符符号0或多个任意字符。例:Disallow: ? 这里的意思是屏蔽所有带“?”文件,也是屏蔽所有的动态URL。
  robots.txt文件写法举例说明
  禁止Google/百度等所有搜索引擎访问整个网站
  User-agent: *
  Disallow: /
  允许所有的搜索引擎spider访问整个网站(Disallow:可以用Allow: /替代)
  User-agent: *
  Disallow:
  禁止Baiduspider访问您的网站,Google等其他搜索引擎不阻止
  User-agent: Baiduspider
  Disallow: /
  只允许Google spider: Googlebot访问您的网站,禁止百度等其他搜索引擎
  User-agent: Googlebot
  Disallow:
  User-agent: *
  Disallow: /
  禁止搜索引擎蜘蛛spider访问指定目录
    (spider不访问这几个目录。每个目录要分开声明,不能合在一起)
  User-agent: *
  Disallow: /cgi-bin/
  Disallow: /admin/
  Disallow: /~jjjj/
  禁止搜索引擎spider访问指定目录,但允许访问该指定目录的某个子目录
  User-agent: *
  Allow: /admin/far
  Disallow: /admin/
  使用通配符星号""设置禁止访问的url
     (禁止所有搜索引擎抓取/cgi-bin/目录下的所有以".html"格式的网页(包含子目录))
  User-agent: *
  Disallow: /cgi-bin/
.html
  使用美元符号"$"设置禁止访问某一后缀的文件
     (只允许访问以".html"格式的网页文件。)
  User-agent: *
  Allow: .html$
  Disallow: /
  阻止google、百度等所有搜索引擎访问网站中所有带有?的动态网址页面
  User-agent: *
  Disallow: /?
  阻止Google spider:Googlebot访问网站上某种格式的图片
    (禁止访问.jpg 格式的图片)
  User-agent: Googlebot
  Disallow: .jpg$
  只允许Google spider:Googlebot抓取网页和.gif格式图片
     (Googlebot只能抓取gif格式的图片和网页,其他格式的图片被禁止;
   其他搜索引擎未设置)
  User-agent: Googlebot
  Allow: .gif$
  Disallow: .jpg$
  .......
  只禁止Google spider:Googlebot抓取.jpg格式图片
   (其他搜索引擎和其他格式图片没有禁止)
  User-agent: Googlebot
  Disallow: .jpg$

国内的搜索引擎蜘蛛
  百度蜘蛛:baiduspider
  搜狗蜘蛛:sogou spider
  有道蜘蛛:YodaoBot和OutfoxBot
  搜搜蜘蛛: Sosospider
  国外的搜索引擎蜘蛛
  google蜘蛛: googlebot
  yahoo蜘蛛:Yahoo! Slurp
  alexa蜘蛛:ia_archiver
  bing蜘蛛(MSN):msnbot

 

你可能感兴趣的:(爬虫(python))