本文主要介绍基于python的爬虫的介绍。文中有非常详细的代码示例,对正在学习python爬虫的朋友很有帮助。有需要的可以参考一下。
目录
前言1。简单静态网页的抓取1.1选择爬虫策略3354缩略图1.2选择爬虫策略3354高清大图2。动态加载网站的抓取2.1选择爬虫策略——selenium2.2选择爬虫策略——api III。selenium模拟登录
前言
Python爬虫主要是针对一些反爬机制比较简单的网站,是一个了解爬虫全过程和爬虫策略的熟练过程。
爬虫分为四个步骤:请求,解析数据,提取数据,存储数据。本文也将从这四个角度介绍基础爬虫的案例。
一、简单静态网页的爬取
我们想抓取一个壁纸网站的所有壁纸。
http://www.netbian.com/dongman/
1.1 选取爬虫策略——缩略图
首先打开开发者模式,观察网页结构,找到每张图片对应的图片标签。我们可以发现,只要获取标记为黄色的img标签,并向其发送请求,就可以获得壁纸的预览图片。
然后注意到网站不止一页,打开前三页的网站观察网址是否正规。
http://www.netbian.com/dongman/index.htm#第1页
http://www.netbian.com/dongman/index_2.htm#第2页
http://www.netbian.com/dongman/index_3.htm#第3页
我们发现除了第一页之外的所有页面的URL都有一个固定的规则,所以我们首先建立一个所有页面URL的列表。
URL _ start=' http://www . net bian . com/dong man/'
URL _ list=[' http://www . net bian . com/dong man/index . htm ']
如果不是os.path.exists('。/exercise):
os.mkdir('。/练习’)
对于范围内的I(2,133):
url=url_start 'index_' str(i)'。' htm '
url _列表.追加(url)
到目前为止,我们的基本爬行策略已经确定。
网页请求
对于url_list中的url:
标题={
用户代理':' Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/87 . 0 . 4280 . 88 Safari/537.36 '
}
response=requests.get(url=url,headers=headers)。文本
解析数据
这里我们选择etree来分析数据。
tree=etree。HTML(响应)
提取数据
这里我们选择xpath来提取数据。
leaf=tree . XPath('//div[@ class=' list ']//ul/Li/a/img/@ src ')
对于叶中的l:
打印(左)
h=requests.get(url=l,headers=headers)。内容
存储数据
i='exercise/' l.split('/')[-1]
用open(i,' wb ')作为fp:
fp.write(h)
完整代码
导入请求
从lxml导入etree
导入操作系统
URL _ start=' http://www . net bian . com/dong man/'
URL _ list=[' http://www . net bian . com/dong man/index . htm ']
# http://www . net bian . com/dong man/index _ 2 . htm
如果不是os.path.exists('。/exercise):
os.mkdir('。/练习’)
对于范围内的I(2,133):
url=url_start 'index_' str(i)'。' htm '
url _列表.追加(url)
打印(url_list)
对于url_list中的url:
标题={
用户代理':' Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/87 . 0 . 4280 . 88 Safari/537.36 '
}
response=requests.get(url=url,headers=headers)。文本
tree=etree。HTML(响应)
leaf=tree . XPath('//div[@ class=' list ']//ul/Li/a/img/@ src ')
对于叶中的l:
打印(左)
h=requests.get(url=l,headers=headers)。内容
i='exercise/' l.split('/')[-1]
用open(i,' wb ')作为fp:
fp.write(h)
1.2 选取爬虫策略——高清大图
在刚才的爬虫中,我们得到的只是壁纸的缩略图。如果我们想爬到高清版,我们需要改变我们的策略。重新打开开发者工具进行观察,发现在原先爬取的img标签之上还有一个href标签,打开之后就会跳转高清大图。
那么此时我们的爬取策略就变成了提取这个href标签的内容,向这个标签中的网站发送请求,随后在该网站中找到img标签进行再一次请求。
我们使用正则表达式来提取href标签的内容。正则表达式是比xpath语法更简单的数据提取方法。具体语法请参考以下文档。
对于url_list中的url:
标题={
用户代理':' Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/87 . 0 . 4280 . 88 Safari/537.36 '
}
response=requests.get(url=url,headers=headers)。文本
leaf=re.findall('desk/\d*。' htm ',响应,回复s)
对于叶中的l:
URL=' http://www . net bian . com/' str(l)
h=requests.get(url=url,headers=headers)。文本
leaf _=re。查找全部(' div class=' pic ').*?(http://img.netbian.com/file/\d*/\d*/\w*。jpg)',h,re .s)
这样输出的叶子_就是我们要找的高清大图的img标签,此时我们只需要再次发送请求随后再保存数据就可以了。
存储数据
对于叶子中的l_来说:
打印(l_)
h=requests.get(url=l_,headers=headers).内容
我='行使/' l_ .split('/')[-1]
用打开(I,“wb”)作为fp:
fp.write(h)
完整代码
导入请求
导入操作系统
进口关于
URL _ start=' http://www。网扁。com/dong man/'
URL _ list=[' http://www。网扁。com/董漫/index。htm ']
如果不是os.path.exists(./练习):
os.mkdir(' ./练习')
对于范围内的一(2133):
url=url_start 'index_' str(i)' .' htm '
url _列表.追加(网址)
打印(url_list)
对于url_list中的网址:
标题={
用户代理:' Mozilla/5.0(Windows NT 10.0;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/87。0 .4280 .88 Safari/537.36 '
}
response=requests.get(url=url,headers=headers).文本
leaf=re.findall('desk/\d* .' htm ',响应,回复s)
对于叶中的l:
URL=' http://www。网扁。com/'字符串(l)
h=requests.get(url=url,headers=headers).文本
leaf _=re。查找全部(' div class=' pic ').*?(http://img.netbian.com/file/\d*/\d*/\w*。jpg)',h,re .s)
对于叶子中的l_来说:
打印(l_)
h=requests.get(url=l_,headers=headers).内容
我='行使/' l_ .split('/')[-1]
用打开(I,“wb”)作为fp:
fp.write(h)
二、动态加载网站的爬取
我们要爬取的是另一个壁纸网站的所有壁纸
https://sucai.gaoding.com/topic/9080?
2.1 选取爬虫策略——selenium
首先打开开发者模式,观察网页结构,此时我们会发现一页上的所有壁纸并不是全部都加载出来了的,也就是说随着我们下拉滚动条,内容会不断实时加载出来,查看网页元素时也能看到lazy-image这个代表动态加载的标签。
由于是动态加载,因此不能用之前的直接发送请求的办法来爬取数据了,面对这种情况我们就需要模拟浏览器发送一个请求,并且下拉页面,来实现爬取一个实时加载网页的目的。
观察完网页结构之后我们又来观察页数,这次就不多说了,想必大家也能发现规律
url_list=[]
对于范围(1,4)内的我:
网址='https://sucai.gaoding.com/topic/9080?p={} ' .格式(一)
url _列表.追加(网址)
网页请求
在这里我们用到了硒这个自动化测试框架
对于url_list中的网址:
driver=webdriver .铬合金()
driver.get(url)
driver.maximize_window()
时间.睡眠(2)
i=0
而i10:#下拉滚动条加载页面
i=1
司机。执行脚本('窗口。滚动(0,500)')
driver.implicitly_wait(5)#显式等待
解析提取数据
项目=驱动程序。find _ elements _ by _ XPath('//*[@ class=' GDD-lazy-image _ _ img GDD-lazy-image _ _ img-loaded ']')
对于项目中的项目:
href=item.get_attribute('src ')
打印(href)
至于数据的存储只需要再请求我们爬下来的href标签的网站就可以了。
完整代码
从硒导入网驱动程序
导入时间
导入操作系统
如果不是os.path.exists(./练习):
os.mkdir(' ./练习')
标题={
用户代理:' Mozilla/5.0(Windows NT 10.0;win 64x 64)apple WebKit/537.36(KHTML,像壁虎一样)Chrome/77。0 .3865 .75 Safari/537.36 '
}
url_list=[]
url_f_list=[]
对于范围(1,4)内的我:
网址='https://sucai.gaoding.com/topic/9080?p={} ' .格式(一)
url _列表.追加(网址)
对于url_list中的网址:
driver=webdriver .铬合金()
driver.get(url)
driver.maximize_window()
时间.睡眠(2)
i=0
而i10:
i=1
司机。执行脚本('窗口。滚动(0,500)')
driver.implicitly_wait(5)#显式等待
项目=驱动程序。find _ elements _ by _ XPath('//*[@ class=' GDD-lazy-image _ _ img GDD-lazy-image _ _ img-loaded ']')
对于项目中的项目:
href=item.get_attribute('src ')
打印(href)
2.2 选取爬虫策略——api
众所周知,api接口是个好东西,如果找到了它,我们就无需担心动态加载,请求美国石油学会(美国石油协会)返回给我们的是json格式的字典,里面或许有我们需要的东西也说不定。那么我们重新打开开发者工具搜索一番吧!
从元素切换到网络我们可以在这里发现很多奇怪的东西,但是打开预览的时候好像没有什么可以用的。
这时候不要灰心,切换到下一页,加载第二页的时候,终于多了一个xhr文件。点击预览,我们惊喜地发现,这个文件中有每个图片id的信息!
搜索了一下,发现字典中唯一的有效值是id,那么id对于我们的图片抓取有什么意义呢?通常URL id是可以定位到具体图片的,于是我点进了一张壁纸,惊讶的发现和我想象的一样!
最后是我们老生常谈的页码链接。看到这个api的请求url后,有没有观察到它有两个参数,page_num=2page_size=100,看起来很像页码?再往下,我们可以看到这两个值也恰好在参数里!也就是说我们只需要改变page_num=2就可以翻页了!
URL=' https://API-sucai . gaoding . com/API/CSC-API/topics/9080/modules/18928/templets?'
标题={
用户代理':' Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/87 . 0 . 4280 . 88 Safari/537.36 '
}
params_list=[]
对于范围(1,4)内的I:
参数={
' page_num': i,
' page_size': 100
}
参数_列表.追加(参数)
解析提取数据
对于params_list中的param:
response=requests.get(url=url,params=param,headers=headers)。json()
对于范围内的I(100):
尝试:
dict=响应[i]
id=dict['id']
URL _ f=' https://sucai . gaoding . com/material/' str(id)
url_f_list.append
除了:
及格
存储数据
对于url_f_list中的l:
打印(左)
h=requests.get(url=l,headers=headers)。内容
i='exercise/' l.split('/')[-1]
用open(i,' wb ')作为fp:
fp.write(h)
完整代码
导入操作系统
导入请求
如果不是os.path.exists('。/exercise):
os.mkdir('。/练习’)
URL=' https://API-sucai . gaoding . com/API/CSC-API/topics/9080/modules/18928/templets?'
标题={
用户代理':' Mozilla/5.0(Windows NT 10.0;Win64x64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/87 . 0 . 4280 . 88 Safari/537.36 '
}
params_list=[]
url_f_list=[]
对于范围(1,4)内的I:
参数={
' page_num': i,
' page_size': 100
}
参数_列表.追加(参数)
对于params_list中的param:
response=requests.get(url=url,params=param,headers=headers)。json()
对于范围内的I(100):
尝试:
dict=响应[i]
id=dict['id']
URL _ f=' https://sucai . gaoding . com/material/' str(id)
url_f_list.append
除了:
及格
对于url_f_list中的l:
打印(左)
#h=requests.get(url=l,headers=headers)。内容
#i='exercise/' l.split('/')[-1]
#用open(i,' wb ')作为fp:
# fp.write(h)
三、selenium模拟登录
我们要抓取的网站永远是登录的关键环节,所以模拟登录也是一大爬虫基础。
我们想要模拟登录的网站如下
https://www.icourse163.org/course/BIT-268001
选择爬虫策略
既然是用selenium来模拟着陆,那么首先要明确我们要模拟的具体内容,可以归纳如下
单击登录|注册。
单击其他登录方法。
点击手机号码登录。
输入帐户
输入口令
单击登录。
知道该怎么做之后,我们打开开发者模式,观察这个登录框。
不知道看不看。看到这里有一个iframe框架,我很震惊,这意味着如果我们不经过任何处理就去找元素,可能什么都找不到。这就相当于在王家找李家的东西。首先,我们需要切换到当前的iframe。
driver . switch _ to . frame(driver . find _ element _ by _ XPath('//*[@ id=' j-urs container-1 ']/iframe '))
这样操作之后,我们就可以一步一步的模拟着陆了!
完整代码
从selenium导入web驱动程序
导入时间
URL=' https://www . icourse 163 . org/course/BIT-268001 '
driver=webdriver。铬合金()
driver.get(url)
driver.maximize_window()
#时间.睡眠(2)
司机。find _ element _ by _ XPath('//div[@ class=' unlog in ']/a ').单击()
司机。find _ element _ by _ class _ name(' UX-登录-设置-扫描-代码_返回').单击()
司机。find _ element _ by _ XPath('//ul[@ class=' UX-tabs-underline _ HD ']/Li[2]').单击()
司机。切换到。框架(驱动程序。find _ element _ by _ XPath('//*[@ id=' j-urs container-1 ']/iframe '))
司机。隐式等待(2)#给登录框一些加载的时间
司机。find _ element _ by _ CSS _ selector(' input[type=' tel ']').send_keys('15201359153 ')
司机。find _ element _ by _ CSS _ selector(' input[class=' j-input text dlemail ']').send_keys('Asdasd123 ')
司机。隐式等待(2)#如果不等待的话可能密码还没输入结束就点按登录键了
司机。按标识查找元素('提交BTN ').单击()
到此这篇关于大蟒基础之爬虫入门的文章就介绍到这了,更多相关大蟒入门爬虫内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。