zoukankan      html  css  js  c++  java
  • 网络爬虫(一)

    一、简介
      1、robot协议(爬虫协议):这个协议告诉引擎哪些页面可以抓取,哪些不可以
    -User-agent:爬虫引擎
    -allow:允许robot访问的URL
    -disallow:禁止访问的URL

      2、爬虫约束:过快/频繁的网络爬虫会对服务器产生巨大的压力,网站可能封锁你的IP,或者采取法律行动,所以需要将请求速度限定在一个合理范围内

      3、爬虫流程:

      -获取网页:给网页一个网址发送请求,该网址会返回整个网页的数据;
      -解析网页(提取数据):从整个网页中提取想要的数据
      -存储数据:将数据存储下来,可以存在csv中,或者数据库中

    二、新建爬虫
      1、获取网页
      -导入request类,使用requests.get(link,headers=headers)获取网页
      ·requests的header伪装成浏览器访问;
      ·r是requests的Response回复对象,从中获取想要的信息,r.text是获取的网页内容代码

      2、提取需要的数据:
     1 import requests
     2 from bs4 import BeautifulSoup   #从bs4这个库中导入BeautifulSoup
     3 link='http://www.santostang.com/'
     4 headers={
     5     'User-Agent':'Mozilla/5.0(Windows;U;Windows NT6.1;en-US;rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'
     6 }
     7 r=requests.get(link,headers=headers)
     8 # 下面的写法报错:bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
     9 # 修正方法:1、更改参数'lxml'为'html.parser';2、下载lxml
    10 # soup=BeautifulSoup(r.text,'lxml')   # 使用BeautifulSoup解析这段代码
    11 soup=BeautifulSoup(r.text,'html.parser')
    12 title=soup.find('h1',class_='post-title').a.text.strip() # 提取第一篇博文的标题
    13 # print(r.text)
    14 print(title)
    15 with open('title.txt','a+') as f:
    16     f.write(title)
    17     f.close()

     三、静态页面抓取

       1、参数介绍:

          -r.text:服务器响应的内容,会自动根据响应头部的字符编码进行解码
      -r.encoding:服务器内容使用的文本编码;
      -r.status_code:用于检测响应的状态码.
    ·返回200,表示请求成功;
    ·返回4xx,表示客户端错误;
    ·返回5xx,表示服务器错误响应
      -r.content:字节方式的响应体,会自动解码gzip和deflate编码的响应数据;
      -r.json:是Requests中的内置的JSON解码器
    1 import requests
    2 r=requests.get('http://www.baidu.com./')
    3 print('文本编码:',r.encoding)
    4 print('响应状态码:',r.status_code)
    5 print('字符串方式的响应体:',r.text)

       2、传递URL参数
      为了请求特定的数据,需要在URL的查询字符串中加入某些数据,如果自己构建URL,数据一般会接在一个
    问号后面,并且以键值对的行是放在URL中
    1 import requests
    2 key_dict={
    3     'key1':'value1',
    4     'key2':'value2'
    5 }
    6 r=requests.get('http://httpbin.org/get',params=key_dict)
    7 print('URL已经正确编码:',r.url)
    8 print('字符串方式的响应头:
    ',r.text)

       3、定制请求头
      请求头Headers提供关于请求,相应或其他发送实体的信息。
      requests并不会基于定制的请求头headers的具体情况改变自己的行为,只是在最后的请求中,所有的请求头信息都会被传递进去
    提取请求头中重要的部分:
     1 import requests
     2 headers={
     3     'user-agent':'Mozilla/5.0 (Windows NT 6.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36',
     4     'Host':'www.santostang.com'
     5 }
     6 r=requests.get('http://www.santostang.com/',headers=headers)
     7 print('响应状态码:',r.status_code)
     8 
     9 import requests
    10 headers={
    11     'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
    12     'Host':'movie.douban.com'
    13 }
    14 # r=requests.get('https://movie.douban.com/top250',headers=headers)
    15 # print('响应状态码:',r.status_code)

    练习:豆瓣TOP250

     1 import requests
     2 from bs4 import BeautifulSoup
     3 def get_movies():
     4     headers={
     5         'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
     6         'Host':'movie.douban.com'
     7     }
     8     movie_list=[]
     9     for i in range(0,10):
    10         link='https://movie.douban.com/top250?start='+str(i*25)
    11         r=requests.get(link,headers=headers,timeout=10)
    12         print(str(i+1),'页响应状态码:',r.status_code)
    13         soup=BeautifulSoup(r.text,'html.parser')
    14         div_list=soup.find_all('div',class_='hd')
    15         for each in div_list:
    16             movie=each.a.span.text.strip() # 相关定位问题参见https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/#id20
    17             movie_list.append(movie)
    18     return movie_list
    19 movies=get_movies()
    20 print(movies)
  • 相关阅读:
    js中的面向对象part2
    js中值类型和引用类型的区别
    js中三大引用类型
    js中的重点
    html和css区别
    面向对象part1
    null和undefined的区别
    前端面试题js篇
    行内元素和块级元素的区别
    学习网站
  • 原文地址:https://www.cnblogs.com/Free-Ink/p/12912406.html
Copyright © 2011-2022 走看看