python
网络爬虫
爬虫:爬虫步骤:1、通过网络地址获取网络页面。2、对网络页面内容的解析。3、爬取数据放到本地。4、使用爬取的本地数据。。
1、示例:获取网页内容。
import requests as rq
url='https://www.guazi.com/sh/buy/'
def gethtmlcontent(url):
try:
#请求方式和设置超时
r=rq.get(url=url,timeout=30)
#异常捕获
r.raise_for_status()
return r.text
except:
return ''
print(gethtmlcontent(url))
结果
1、示例:对网页内容解析,并保持数据到本地。
import requests as rq
import re
#爬取路径URL
url='https://www.ivsky.com/tupian/index_2.html'
data=rq.get(url).text
#分析所需要的内容
reg=r'<img src=\"(.*?.jpg)\"'
#形成对象,是下载速度提高
pa=re.compile(reg)
#获取匹配的所有结果
m=re.findall(pa,data)
i=1
for iurl in m:
print('正在爬取http:'+iurl)
#获取独立内容
idata=rq.get('http:'+iurl)
with open('E:\\python\\Infrastructure\\第七章\\img\\'+str(i)+'.jpg','wb') as f:
try:
#保存所需内容,如果出错将继续往下执行
f.write(idata.content)
except:
continue
f.close()
i += 1
print('爬取完毕')
结果
内容将保存到我们定义的路径下面。
爬取电影网站并保存图片到本地
下载电影图片:以2345影视网站为主。获取本页电影名称,主演,上映时间,简介和保存图片到本地文件。其次,点进去查看获取推荐的电影名称,主演以及评分。新建一个文件用于存储图片。例如film文件。
getHTML:获取网站全部脚本。saveInfo:解析网站,获取需要的数据。child:跳转子网站获取对应数据。main:函数入口。main()启动函数。
示例
import requests
from bs4 import BeautifulSoup
import random
img=[]
#获取整个页面内容函数
def getHTML(url):
try:
#获取页面,延时设为20秒,time为限制请求时间
rq=requests.get(url,timeout=20)
#判断返回的状态码是否为200,如果是返回正确内容,不是则产生页面请求异常
rq.raise_for_status()
#编码格式,可以用gb2312或者gbk,如果用utf-8则会乱码,已亲测。
rq.encoding='gb2312'
#判断是否请求到,可以先打印出整个页面脚本
#print(rq.text)
return rq.text
except:
return ""
def saveInfo(html):
#解析的网站,解析是按照html解析,以下是常见的。详情见官网文档
#html.parser:内置库,速度适中,容错能力强
#lxml:速度快,容错能力强,但是需要C语音库支持
#html5lib生成HTML5文档格式,速度慢,无外部扩展依赖
soup=BeautifulSoup(html,'html.parser')
#找到需要内容位置,用类选择器选择,<ul class='picList clearfix'>
m_ls=soup.find('ul',class_='picList clearfix')
#我们需要的是li下面二个div标签里面数据,
ms=m_ls.find_all('li')
#打印出所有li标签及其内容数据
#print(ms)
for top in ms:
#查看所有图片,获取图片路径src的地址
img_url=top.find('img')['src']
#获取li div p span的标签,<span class='sTit'>的文本也就是电影名称
name=top.find('span',class_='sTit').get_text()
#获取下一个页面存在的位置
child_span=top.find('span',class_='sTit')
#获取下一个页面部分路径
parmurl=child_span.find('a')['href']
img.append('http:'+parmurl)
#图片对应下一个页面
#'http://dianying.2345.com/detail/207868.html' 下一个页面地址
#print(parmurl)
try:
# 获取li div p span的标签,<span class='sIntro'>的文本也就是电影上映时间
#有的没有上映时间,所以加个过滤
tm=top.find('span',class_='sIntro').get_text()
except:
tm='上映时间'
try:
#获取主演数据,
actors=top.find('p',class_='pActor')
actor=''
for act in actors.contents:
#把主演放在一起拼接
actor=actor+act.string+','
except:
actor='无演员'
#电影简介,如果存在隐藏简介的,直接获取全部显示数据。如果不存在直接获取。
if top.find('p',class_='pTxt pIntroHide'):
intro=top.find('p',class_='pTxt pIntroHide').get_text()
else:
intro=top.find('p',class_='pTxt pIntroShow').get_text()
#print('影片:{}\t{}\n{}\n{}\n\n'.format(name,tm,actor,intro))
with open('E:/python/Infrastructure/film/'+name+'.jpg','wb+')as f:
img_url='http:'+img_url
imgdata=requests.get(img_url).content
f.write(imgdata)
def child(parmurl):
htmlcontent=getHTML(parmurl)
sp = BeautifulSoup(htmlcontent, 'html.parser')
m_ls = sp.find('ul', class_='v_picTxt pic167_223 clearfix')
ms = m_ls.find_all('li')
for tp in ms:
#图片
img_url = tp.find('img')['data-src']
#电影名称
nme = tp.find('span', class_='sTit').get_text()
#主演
acs = tp.find('span', class_='sDes').get_text()
#打分
sco = tp.find('p', class_='pRightBottom').get_text()
#print('影片:{}\t{}\n{}\n\n'.format(nme,acs,sco))
with open('E:/python/Infrastructure/film/'+nme.strip().replace("\n", "")+ '.jpg','wb+')as f:
img_url = 'http:' + img_url
imgd = requests.get(img_url).content
#'http://imgwx1.2345.com/dypcimg/img/e/67/sup201474_223x310.jpg'
f.write(imgd)
def main():
url='http://dianying.2345.com/top/'
html=getHTML(url)
saveInfo(html)
for curl in img:
child(curl)
main()
结果
。
如有错误请联系更改:微信 sy157715743