Python爬虫学习笔记----基础篇练习

#coding=utf-8
#!/user/bin/python

'''
#字符串重载
#print('he said "today\'s weather is good." ')
#print (r"hello \n makabaka")
'''

'''
#条件判断
#a = input('a=')
#if a>3:
#print ('a>3')
#elif a==3:
#print ('a=3')
#elif a<3:
#print  ('a<3')
'''

'''
# 列表、点名册
namelist=["jery","makabaka","joker"]
print("添加前的名单:")

for name in namelist:
#print(namelist[0])
    print(name)

newstuden=raw_input("添加学生名:")     #raw_input函数才能同时接收字符串和数字/input只能接收数字
namelist.append(newstuden)           #append增加元素到表的末尾

print("添加后的名单:")
for name in namelist:
    print(name)
'''

'''
# 循环输出第1-10天
for x in range(1,11):
   print ('第{}天'.format(x))
'''

'''
#打印除2外1-5 break跳出循环、continue跳过循环中的本次流程
a=0
while a<10:
    a+=1
    if a == 2:
        continue
    elif a>5:
        break
    print(a)
'''
'''
#逢7跳过
for x in range(1,101):
    if x%10==7 or x==7 or x//10==7 or x%7==0:
        continue
    else :
        print('{}'.format(x))
'''

'''
#字符串拼接与截取
N="makabaka"
print (N[0:8])
print (N[0:7:2])
print (N[:5])
print (N[5:])
print ("hello "+N)
print (N  * 3)
'''

'''
#八个老师随机分配到3个办公室
import random
office=[[],[],[]]
names=[1,2,3,4,5,6,7,8]
for name in names:                                #在names中顺序取name进循环
      index=random.randint(0,2)                   #随机生成0-2的整数
      office[index].append(name)                  #将name添加到office列表3个办公室的随机一个的末尾
i=1
for name in office:
    print ("办公室%d的人是:%s" %(i,name))
print ("\n")
'''

'''
#顺序打印产品a,b,c,d,e,f
products = [["a"],["b"],["c"],["d"],["e"],["f"]]
for goods in products:
    print (goods)
'''

'''
#元组操作
test1 = (2,"makabaka")
test2 = (1,"joker")
test = test1 + test2
print (test)
del test
print (test)
'''

'''
#字典操作
info = {"name": "makabaka"}
print (info.get("kala",":x") )
num = input("新增的编号:")                    #新增键值对
info["id"]=num
print (info)
del info["name"]                             #删除键值对
print (info)
#info.clear()  #清空字典内容
#print (info)
info["id"] = 20
print(info.keys())                              #查找键
print(info.values())                            #查找值
print(info.items())                             #查找键值对
print (info)
'''

'''
#使用枚举函数同时拿到列表下标和元素内容
list=["a","b","c","d","e"]
for i,x in enumerate(list) :
    print (i+1,x)
'''

'''
#定义函数输出一条横线
def hengxian():
    print ("-------------------")
def hengxian1():
    a=input("输出几条横线:")
    while a!=0:
        print (hengxian())
        a-=1
print hengxian1()
'''

'''
定义函数求三数之和-1
def sum(a,b,c):
   return a+b+c
a=input("输入第一个数:")
b=input("输入第二个数:")
c=input("输入第上个数:")
print (sum(a,b,c))
'''

'''
定义函数求三数平均值
def avarage():
    return (sum(a,b,c))/3.0
print  avarage()
'''

'''
#f=open("test.txt","w")                 #打开文件,w(写模式),文件不存在就新建
#f.close()                              #关闭文件
'''

'''
#读文件,打印文件内容
f=open("test.txt","r")                    #读文件
content=f.readlines()                     #取文件内容  可以看界文件读取的结果是一个列表  
print (content)             
i=1
for temp in content:                      #添加编号并循环输出列表
    print ("%d %s"%(i,temp))
    i+=1
f.close()
'''

'''
#捕获异常,跳过异常
try:
    print ("---------test-----------1")
    f = open("123.txt","r")
    print  ("---------test-----------2")        #只写以上三句,会因为123.txt不存在而报错
except IOError:                                 #未找到文件属于IO异常(输入输出异常)
    print  ("---------test-----------3")        #这一行未捕获异常后执行的代码
'''

'''
#try.........finally...和嵌套
import time
try:
    f = open("test.txt","r")
    try:
        while True:                                 #当test.txt文件存在时
            content = f.readline()
            if len(content) == 0:                   #当某行内容为空时
                break
            time.sleep(2)
            print (content)
    finally:
        f.close()                                   #最终保证文件关闭
        print ("文件关闭")
except Exception as result:                         #如果代码出现异常则输出出现异常
    print ("发生异常。。。")
'''

'''


```python
#师从b站老师学的简单爬虫
#coding=utf-8
#!/user/bin/python
#1.请求网站 2.锁定数据 3.爬取(解析)数据 4.保存数据
import re
from bs4 import BeautifulSoup
import urllib.request
import urllib.response
import urllib
import xlwt

def main():
    baseurl = "https://movie.douban.com/top250?start"
    # 1.爬取网页
    datalist = getData(baseurl)
    # 3.保存数据
    savepath="电影top250.xls"
    saveData(datalist,savepath)
    askURL("https://movie.douban.com/top250?start=0")
#影片详情链接的规则
findLink = re.compile(r'<a href="(.*?)">')  #创建正则表达式对象,表示规则(字符串的模式)
#影片图片
findImgSrc = re.compile(r'<img.*src="(.*?)"',re.S) #re.S让换行符包含在字符中
#影片片名
findTitle = re.compile(r'<span class="title">(.*)</span>')
#影片评分
findRating = re.compile(r'<span class="rating_num"> property="v:average"(.*)</span>',re.S)
#评价人数
findJudge = re.compile(r'<span>(\d*)人评价</span>',re.S)
#概况
findInq = re.compile(r'<span class="inq">(.*)<p>',re.S)
#找到影片相关内容
findBd = re.compile(r'<p class="">(.*)</p>',re.S)


#爬取网页
def getData(baseurl):
    datalist=[]
    for i in range(0,10):                                    #调用获取页面信息的函数10次
        url = baseurl + str(i*25)
        html=askURL(url)
    # 2.逐一解析数据
        soup = BeautifulSoup(html,"html.parser")            #声明使用BS库,使用其中的hrml.parser这一解析器来解析html这一数据
        for item in soup.find_all('div',class_="item"):     #查找符合要求的字符串,形成列表,class是个属性要加下划线
            #print(item) #查看电影的全部item信息
            data = []   #保存一部电影的所有信息
            item = str(item)

            #link返回的是影片详情链接
            link = re.findall(findLink,item)[0]                 #re库用来通过正则表达式查找指定的字符串
            data.append(link)                               #添加链接

            imgSrc = re.findall(findImgSrc, item)[0]        #添加图片
            data.append(imgSrc)

            titles = re.findall(findTitle,item)             #片名可能只要一个中文名,没有外文名
            if(len(titles) == 2):
                ctitle = titles[0]
                data.append(ctitle)                         #添加中文名
                otitle = titles[1].replace("/","")         #去掉无关外文名
                data.append(otitle)                         #添加外国名
            else:
                data.append(titles[0])
                data.append('')                             #外文名留空

            rating = re.findall(findRating,item)        #添加评分
            data.append(rating)

            judgeNum = re.findall(findRating,item)
            data.append(judgeNum)                           #添加评价人数

            inq = re.findall(findInq,item)                  #添加概述
            if len(inq) != 0:
                inq = inq[0].replace("。",",")               #去掉句号
                data.append(inq)
            else:
                data.append("")                             #留空
            bd = re.findall(findBd,item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?'," ",bd)          #去掉<br/>
            bd = re.sub('/'," ",bd)                         #替换/
            data.append(bd.strip())                         #去掉前后空格

            datalist.append(data)                           #把处理好的一部电影的信息储存在datalist

    #print(datalist)
    return datalist                                         #保存获取的网页

#得到指定一个URL的网页内容
def askURL(url):
    head = {
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:98.0) Gecko/20100101 Firefox/98.0"
    }
    request = urllib.request.Request(url,headers=head)
    html = ""
    try:
        response = urllib.request.urlopen(request)
        html = response.read().decode('utf-8')
        #print(html)
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e,"code")
        if hasattr(e,"reason"):
            print(e, "reason")

    return html


#3.保存数据
def saveData(datalist,savepath):
    print("saving")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)      #创建workbook对象
    sheet = book.add_sheet('电影Top250',cell_overwrite_ok=True)        #创建工作表
    col = ("电影详情链接","图片链接","影片中文名","影片外国名","评分","评价数","概况","相关信息")
    for i in range(0,8):
        sheet.write(0,i,col[i])             #列名
    for i in range(0,250):
        print("第%d条" %(i+1))
        data = datalist[i]
        for j in range (0,8):
            sheet.write(i+1,j,data[j])      #数据

    book.save('电影top250.xls')       #保存

#当程序执行时,调用以下函数
if __name__=="__main__":
    main()
    print("爬取完毕")
    '''

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值