简单的Python_爬虫

REQUESTS库

requests库主要的方法有:request,get,put,post,head,patch,delete。其中常用到的有request,get,head.

  • request方法:它有三个参数(method,url,**kwargs),其中method为请求方式,有get,post,put,head,patch,delete,options.其中常用的有:get,post,patch。get参数即为获取资源,爬虫一般都用get方法。url即为我们所需资源的定位符,后面的参数为可选字段,可填可不填,其中有一个常用的参数为params,它接受一个字典,这个字典中的键对值将会作为参数添加到URL后面,可以作为我们进行关键字搜索的依据。request方法的用法一般形式为:r=requests.request('get',url,params=kv)kv为一个字典。r为爬取返回的对象
  • get方法:使用方法:r = requests.get(url) ,r为返回的对象,里面包含了我们所爬取的内容。

get返回对象的基本元素

r.text: 这个为我们爬取的页面的编码。

r.encoding:输出为从我们爬取的HTTP头中分析出来的数据的编码方式,有网页会在头中给出编码方式,这时我们用r.encoding输出的就是正确的编码方式,然后我们用r.text就可以输出正确的内容

可以看到我们的编码以及下面的内容都是有规律的,不是乱码。但是有些网页给出的头中并不会有编码方式,这个时候r.encoding就会默认编码为ISO-8859- 1,这个时候输出内容就会为乱码,还好我们对象中还有一个r.apparent_encoding,它表示内容正确的编码,因为它是通过分析爬取内容得出的。所以我们爬取网页或者什么东西,一般都会进行一个这样的操作:r.encoding = r.apparent_encoding。这样就可以保证万无一失了。

r.headers:  将会输出我们爬虫发送的请求头,当然我们也可以修改请求头的内容,有些网站会阻止爬虫爬取内容,就是根据请求头中的'User-Agent'字段来判断的,所以我们可以修改这个字段:header = {'User-Agent':Mozilla/5.0'} ,然后在后面的get请求中:r = requests.get(url,headers = header)。这样就可以避免网站阻止爬虫了。

r.status_code: 这个为我们爬虫请求返回的状态码,状态码为200表示请求成功,其他的基本可以认为是请求失败了,原因可能是无网络连接,也可能是重定向或者访问页面不存在之类的。

BeautifulSoup库

BeautifulSoup库的基本元素:<tag>(标签),attrs(属性), name(标签的名字),Navigablestring(标签之间的注释,即<>与<>之间的内容),comment(标签内字符串的注释内容,这个不常用)。

BeautifulSoup库的用法:首先  from bs4 import BeautifulSoup  ,然后 dome = r.text (r为get 返回的对象),然后 soup = Beautiful(dome,'html.parser'),这一步是解析爬取内容,它将复杂的html文档解析成一个树状结构,每个节点都可以说是一个python对象,解析完后我们就有了上面所讲的4个元素,并且可以使用了。如:soup.a将会输出爬取页面的 a 标签,soup.name将会输出a标签的名字,soup.a.attrs将会输出a标签的属性,soup.a.string将会输出标签内的字符串,就是两个<>之间的内容。soup.a.Comment将会输出标签内字符串的注释内容。而soup.prettify()可以将解析后的html文档变成更易读的模式。

import requests
from bs4 import BeautifulSoup as bs
url = 'http://www.baidu.com'
r = requests.get(url)
print(r.status_code)
r.encoding = r.apparent_encoding
dome = r.text
soup = bs(dome,'html.parser')
print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.a)
print(soup.a.attrs)
print(type(soup.a.attrs))
print(soup.a.attrs['href'])


 

输出结果:

当属性为字典时可以输出字典中的键对的值。

用html.parser解析后返回的对象中还有一些属性对我们整理爬取的数据很有用,当我们用prettify方法输出解析后返回的对象时,我们会看到一个树形结构:

就像这样,它有很多节点,有平行的节点,有节点里面包含节点,如上面这张图里面head节点里面包含title节点,而head节点与body节点是平行的。title节点就被称为是head节点的子节点,head节点被称为是title节点的父节点,而html节点是head节点的父节点,所以html节点是title节点的父辈节点,同样title节点为html节点的子孙节点。

看起来很复杂,所以我们应该要有方法能够整理或者说提取我们想要的东西。

下行遍历:

.contents,比如print(soup.head.contents)将会输出一个列表,这个列表为head标签下的所有子节点。

.children,用法和上面一样,只不过它返回一个迭代类型,包含儿子节点,只能通过遍历来输出全部内容。

.descendants,它也返回一个迭代类型,包含子孙节点,只能通过遍历来输出全部内容。

上行遍历:

.parent:返回当前节点的父亲节点

.parents返回当前节点的所有父辈节点

平行遍历:

.next_sibling和.previous_sibling。前者返回下一个平行节点,后者返回当前节点下所有平行节点

.next_siblings和.previous_siblings。前者返回下一个平行节点,但是是迭代类型,后者返回当前节点下所有平行节点,也是迭代类型。

import requests
from bs4 import BeautifulSoup as bs
url = 'http://www.baidu.com'
r = requests.get(url)
print(r.status_code)
r.encoding = r.apparent_encoding
dome = r.text
soup = bs(dome,'html.parser')
print(soup.prettify())
print(soup.head.contents)
print('----------------------------------------------------------------')
for chil in soup.head.children:
		print(chil)
print('----------------------------------------------------------------')
print(soup.title.parent)
print('----------------------------------------------------------------')
for si in soup.head.next_siblings:
		print(si)

 这是soup.prettify()输出的结果:

 下面是soup.prettify()之后的输出结果:

 爬取图片或小说等的一个小爬虫:

 

import requests
path = input("please input the aressds: ")
url=input("please input the url: ")
try:
	r = requests.request('get',url,timeout=30)
	r.raise_for_status()
	r.encoding=r.apparent_encoding
	print(r.request.url)
	print(r.status_code)
	with open(path,'wb') as f:
		f.write(r.content)
except:
	print("wrong")
else:
	print('successful')

其中使用了  try-except 异常处理框架,如果在爬取的过程中出现什么问题的话就将会执行except下面的内容,没有就会之前执行并且执行else 下面的内容。然后r.raise_for_status(),这行代码就是来判断我们的程序在执行过程中有没有出错,有就进行异常处理。这里我们将爬取的内容存储到我们指定的路径中,用  'wb' 方式来打开文件,就是以二进制的形式写入文件,然后r.content就是将爬取的数据转换为二进制的形式。代码执行如下:

 指定路径时如果文件夹不存在将会自己创建一个,然后我们可以打开文件夹看看是不是爬取到了里面:

爬取成功!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值