上周老师开会,突然就去承包了个商业项目,让我负责提供数据。所以最近任务就是---写爬虫
已经很久没有碰过爬虫了,这几天按照甲方的要求弄了一下下~
发现不涉及到登陆的爬虫做起来还是比较简单滴,特此记录一下下。
关于要登陆的网站,比如微博,人人网之类的爬虫,涉及到模拟登陆之类的知识点的详情请见我的另一篇文章啦~
https://blog.csdn.net/qq_40589051/article/details/98368420
本爬虫的实现用的工具包是 python requests+beautifulsoup,本文只记录了我使用到的部分,其他的功能还是得看官方文档哟!
requests是一个超级好用的http第三方库,用在爬虫和服务器客户端通信之类的项目上都很方便。本爬虫只需要用到它来发送http的get请求,获取网页源代码。
涉及到的代码:
r = requests.get(url, timeout=30)
r.raise_for_status() #HTTP请求返回状态码,200表示成功
r.encoding = r.apparent_encoding
#r.encoding从HTTP header中猜测的响应内容的编码方式
#r.apparent_encoding从内容中分析响应内容的编码方式(备选编码方式)
r.text #HTTP响应的字符串形式,即,url对应的页面内容
得到了网页源代码之后,就可以用beautifulsoup来解析啦~
beautifulSoup是将网页源代码转换为树的形式,网页源代码中的标签,就是树的节点,节点中就会有我们所需要的内容。
所以,爬虫就是将网页源代码中的节点(tag)找出来,然后get其中的text。
首先将r.text转换成bs的树形结构:
soup = BeautifulSoup(r.text, "html.parser")
我们都知道HTML源码中有很多标签,比如head、body、title、a标签、p标签....等等,要获取他们当中的内容只需要:
soup.head
soup.title
soup.a
即可~
而每个标签都有自己的属性attr,要将属性中的信息得到,只需要像使用python-字典那样就行啦:
soup.a['class'] #获得a标签下属性为class的值。
soup.a.attrs可以查看a标签下的所有属性。
另外常用的解析网页源代码的方式有三,find()、find_all()、select()
find和find_all区别在官网里面有,没啥大的区别,我只使用了find_all和select所以就不讲find()啦!
find_all的用法:
soup.find_all('h1',{'class':'t_s'})#寻找属性class为t_s的h1标签。
soup.find_all('a')#寻找a标签
soup.find_all(['a','b'])#寻找a和b标签
soup.find_all(id = 'link1')
soup.find_all('a',text='e')#寻找字符串中有e的a标签
soup.find_all('a',text=['e','a'])#寻找字符串中有e或者a的a标签
import re #引入正则表达式
soup.find_all('a',text=re.compile('elll')#寻找字符串中有elll的a标签
select选择器的用法:
soup.select('title')#获取title标签
soup.select('title > p')#获取title下的p标签
select和find_all返回的是结果list,list中都是bs对象tag。只需用tag.get_text()就可以从中取出字符串,像字典一样索引tag中的属性也能够提取出所需要的内容。
介绍了这么多,来个例子~爬取https://blog.csdn.net/github_38885296/article/details/90544542上的内容和图片~
首先先上源代码!
# -*- coding:utf-8 -*-
import requests,urllib
from bs4 import BeautifulSoup
url = 'https://blog.csdn.net/github_38885296/article/details/90544542'
r = requests.get(url, timeout=30)
print(r.apparent_encoding)#在爬取过程中发现中文乱码,所以要看看网页编码是不是utf-8,如果不是就得改
r.encoding = 'utf-8'
soup = BeautifulSoup(r.text, "html.parser")
title = soup.find_all('h1',{'class':'title-article'})[0].get_text()#标题
content = soup.find_all('div',{'class':'htmledit_views'})#文字内容
for c in content:
print(c.get_text())
img = soup.find_all('img')#图片
for i in range(len(img)):
image = urllib.request.urlopen(img[i]['src']).read()#下载图片
with open('%s.jpg' % i, 'wb') as a:#保存图片
a.write(image)
再放结果~
这是爬取下来的文字:
这是爬取下来的图片~都是可以打开滴~
代码其实挺固定的,主要是理解用法,要爬取什么网页就要去看源代码,寻找所要爬取部分的内容到底在哪些标签下面。
祝大家学习顺利~✿✿ヽ(°▽°)ノ✿