网络爬虫

Posted free-ink

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络爬虫相关的知识,希望对你有一定的参考价值。

一、简介
  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)

 

以上是关于网络爬虫的主要内容,如果未能解决你的问题,请参考以下文章

Python爬虫|网络爬虫简介

Python爬虫|网络爬虫简介

网络爬虫简介

网络爬虫开发实战2和一的区别

网络爬虫可以收集线下数据吗?

Java网络爬虫怎么实现?