Python简单爬⾍(以爬取⾖瓣⾼分图书为例)
前⾔
浏览器或程序的⼀次请求,⽹站服务器的⼀次响应,就构成⼀次⽹络爬⾍⾏为。oracle实例
⼀个爬⾍通常通过爬⾍包完成请求HTML,通过解析包完成HTML解析和存储。
爬⾍分类:
python教材下载全⽹爬⾍爬取整个互联⽹,需要定制开发
鼠标创意图⽹站爬⾍爬取⼀个指定⽹站的所有内容,使⽤scrapy
⽹页爬⾍只爬取⽹页中需要的数据,使⽤requeset
以下笔记为爬取“⾖瓣⼩说top100”的部分信息的过程记录,属于简单的html格式⽹页的爬取
第⼀步,导⼊依赖包(爬⾍库和解析库)
这⾥使⽤到requesets库作为爬⾍库,BeautifulSoup4库作为解析库,保存到⽂件需要使⽤os库。其中requesets、BeautifulSoup4、lxml为第三⽅库,需要单独安装
1. BeautifulSoup4简介
BeautifulSoup4是⼀个能够解析xml和html的第三⽅库,能够根据xml和html的语法建⽴解析树,进⽽⾼效解析其中的内容。它采⽤了⾯向对象的思想,把每个页⾯当成⼀个对象,可以通过a.b的⽅式调⽤对象的属性。它创建的对象是⼀个树形结构,包含了页⾯⾥⾯的所有tag 元素,如head、body等。
引⼊⽅法是:from bs4 import BeautifulSoup
1.1 解析器
BeautifulSoup的使⽤,⾸先需要选择解析器
解析器使⽤⽅法优势
Python标准库BeautifulSoup(markup,“html.parser” )Python的内置标准库,执⾏速度适中,⽂档容错能⼒强lxml HTML解释器(本次使⽤)BeautifulSoup(markup,“lxml”)速度快,⽂档容错能⼒强lxml XML解释器BeautifulSoup(markup,“xml”)速度快,唯⼀⽀持XML的解释器
1.2 选择器
lxml HTML解释器下的选择器
标签选择器
选择元素、获取名称、获取属性、获取内容、嵌套选择、⼦节点和⼦孙节点、⽗节点和祖先节点、兄弟节点
soup.prettify()、soup.title.name、soup.head、soup.p.string、soup.p[‘name’]
标准选择器
soup.find_all(‘ul’)、find_parents()、find_next_siblings()、find_previous_siblings()
soup.find(‘ul’)、find_parent()、find_next_sibling()、find_previous_sibling()
CSS选择器(推荐使⽤)
通过select()、select_one()直接传⼊CSS选择器即可完成选择
1.3 select() 选择器的⽤法
CSS的select()⽤法
类访问soup.select(’.panel .panel-heading’)) .代表class
标签访问soup.select(‘ul li’)
id访问soup.select(’#list-2 .element’) #代表id
第⼆步,编写头部headers
编写headers的⽬的是为了伪装成浏览器,主要包括user-agent(伪装成不同的浏览器),cookie(识别⽤户⾝份),Referer(⽤来表⽰从哪链接到当前的⽹页,防盗链措施)
这⾥只使⽤到user-agent
1.headers的获取⽅法
打开【⽹络】,点击【刷新】
第三步,爬取并保存需要的内容
1. 填写url
2.使⽤requests库的get⽅法获取页⾯源代码
3.使⽤BeautifulSoup解析源代码
html = (url, headers=headers)
soup = ,'lxml')# lxml需要安装,否则会报错
这⾥选择了lxml解释器,需要先安装lxml库,否则会报错
4.爬取需要的数据
titles = soup.select('#content .article .title')# 爬取的书名
writers = soup.select('#content .article .abstract')# 爬取的作者
rates = soup.select('#content .article .rating_nums')# 爬取的评分
imgs = soup.select('#content .article .post img')# 爬取的图⽚链接
爬取出来的内容构成⼀个个单独的列表,需要把原有的信息匹配起来,这⾥使⽤了zip⽅法
Titles =[]
Writers =[]css样式表模板下载
Rates =[]
for title in titles:
Titles.strip())# 去除多余的空格
for writer in writers:
Writers.strip().replace('\n',',').replace(' ',''))
k8s经典版视频蘑菇视频for rate in rates:
Rates.strip())
Articles =zip(Titles, Writers, Rates)
5. 保存到csv⽂件
思莱德的英文创建⼀个单独的⽂件夹【douban】,把书名、出版信息、评分写⼊csv⽂件,保存到【douban】⽂件夹中
filepath ='douban'
if not ists(filepath):
os.mkdir(filepath)
with open(filepath +'/'+'novelTop100.csv','a', encoding='utf-8')as f:# 以追加模式打开⽂件
writer = csv.writer(f)
writer.writerows(list(Articles))
【注意】:创建csv⽂件时,需要设置编码格式为‘utf-8’,否则默认是‘gbk’格式,保存中⽂时会出现乱码的情况。zip⽅法创建的是元组,⽽csv.writerrows()⽅法参数是列表,所以需要将元组先转换为列表
6. 下载图⽚
当前⽹页爬取到的仅为图⽚的链接,所以图⽚需要再次访问链接,获取图⽚的源代码。然后保存为⼆进制⽂件
for img in imgs:
download(img['src'])
def download(url):
filepath ='douban/image'
if not ists(filepath):
os.mkdir(filepath)
html = (url, headers=headers)
filename = url.split('/')[-1]
with open(filepath+'/'+filename,'wb')as f:# 打开模式选择‘⼆进制写⼊’
f.t)
爬取多个页⾯
因为top100分成了4个页⾯,所以需要爬取4个页⾯的信息。⾸先观察url的规律
'www.douban/doulist/45004834/'
'www.douban/doulist/45004834/?start=25&sort=time&playable=0&sub_type='
'www.douban/doulist/45004834/?start=50&sort=time&playable=0&sub_type='
'www.douban/doulist/45004834/?start=75&sort=time&playable=0&sub_type='
发现每页之间的不同之处在于’start='这⼀处,第⼆、三、四页分别是25、50、75,由此推测第⼀页为0,所以⽤⼀个for循环来改变url
for i in range(0,4):
url ='www.douban/doulist/45004834/?start={}' \
'&sort=time&playable=0&sub_type='.format(25*i)
get_data(url)
写在后⾯
肆意的爬取⽹络数据并不是⽂明现象。Robots 排除协议,也被称为爬⾍协议,是⽹站管理者表达是否希望爬⾍⾃动获取⽹络信息意愿的⽅法。管理者在⽹站根⽬录放置⼀个 ⽂件,并在⽂件中列出哪些链接不允许爬⾍爬取。如果没有该⽂件则表⽰⽹站内容可以被爬⾍获得。绝⼤部分成熟的搜索引擎爬⾍都会遵循这个协议,建议个⼈也能按照互联⽹规范要求合理使⽤爬⾍技术。
源码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论