Python个人学习笔记(二)

爬虫学习----爬取豆瓣Top250网页

import re
import sys
import urllib.request
import xlwt
import bs4
import sqlite3
import urllib.parse



'''
# search
pat = re.compile("West")
m = pat.search("WestAABBCCDDAADD")  # search()----只找到第一次出现的匹配模式,返回位置区间
n = pat.search('AABBCC') # 找不到返回None
print(m)
print(n)
mn = re.search("West", str) # (匹配模式,字符串)
print(mn)

# findall
nm = re.findall("[A-Z]",str)     # findall("正则表达式",字符串)-----找到str中所有符合正则表达式的匹配,返回列表
print(nm)
nn = re.findall("[a-z]+",str)    # [a-z]+    匹配多个
print(nn)

# sub  【substitute 替换函数】
str1 = r"a\nBCDE"    # r"~~~"   防转义  即   /n不会被识别成 换行转义
str2 = "a\nBCDE"
mm = re.sub("a","A",str1)    # sub("原字符","替换字符","字符串")  将字符串中的原字符换为替换字符
print(mm)
'''

# 正则表达式:(.*) 就是单个字bai符匹配任意次,即贪du婪匹配; (.*?) 是满足zhi条件的情况只匹配一次,即dao最小匹配.
# re.S 忽略换行等转义符模式
# 图片链接findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S)
# 若匹配规则里有1个括号------返回的是括号所匹配到的结果,
# 若匹配规则里有多个括号------返回多个括号分别匹配到的结果,
# findImg = re.compile(r'<img(.*)src="(.*?)"',re.S)  (.*).....(.*?) 会在返回列表时报错 ,can only concatenate str (not "tuple") to str
# 若匹配规则里没有括号------就返回整条语句所匹配到的结果
from bs4 import BeautifulSoup

findImg = re.compile(r'<img.*src="(.*?)"',re.S)                 # 图片
findTitle = re.compile(r'<span class="title">(.*)</span>')      # 标题
findInq =  re.compile(r'<span class="inq">(.*)</span>')         # 概述
findBD = re.compile(r'<p class="">(.*?)</p>',re.S)              # 信息
findLink = re.compile(r'<a href="(.*?)">')                      # 链接

def main():
    url = "https://movie.douban.com/top250?start="
    datalist = getData(url)
    # 存入Excel  .xls
    '''
    savepath = "Spider豆瓣电影Top.xls"
    saveData2excel(datalist, savepath)
    '''
    # 存入数据库sqlite3  .db
    saveconnect = sqlite3.connect("Doubanmovies.db")
    #init_DataBase(saveconnect)
    saveData2DataBase(datalist,saveconnect)

def askURL(url):
    headers = {
        "User-Agent": "Mozilla/5.0 (WindowsNT10.0; Win64; x64)"
                      "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36"
    }
    request = urllib.request.Request(url, headers=headers)
    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

def getData(baseurl):
    datalist = []
    for i in range(0, 2):
        url = baseurl + str(i * 25)
        # print("-"*100)
        html = askURL(url)
        soup = BeautifulSoup(html, "html.parser")
        j = 1
        for item in soup.find_all('div', class_="item"):  # div标签里的class_属性值为item
            data = []
            item = str(item)

            Title = re.findall(findTitle, item)[0]
            data.append(Title)

            link = re.findall(findLink, item)[0]  # findall返回的是列表,从遍历item中查找所以findLink [0]---第一个位置
            data.append(link)

            Inq = re.findall(findInq, item)
            if len(Inq)!=0:
                Inq = Inq[0].replace("。","")
                data.append(Inq)
            else:
                data.append("")

            img = re.findall(findImg, item)[0]
            data.append( img)

            BD = re.findall(findBD, item)[0]
            BD = re.sub('<br(\s+)?\/?>(\s+)?'," ",BD)   # \s  space 空格 \s+ 若干空格    \/?   \表式转义,将'/'转义成一个字符 ?0次或一次
            BD = re.sub('/'," ",BD)
            data.append(BD.strip())   # strip() 消除头尾的空格或()里的指定内容
            j += 1
            datalist.append(data)

    # for i in datalist:
    #     for ii in range(0,5):
    #         print(i[ii])
    return datalist

def saveData2excel(datalist,savepath):
    print("Loading to Save......")
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # xlwt.Workbool(解码标准)  创建excel对象
    sheet = book.add_sheet("douban-Top250-movie",cell_overwrite_ok=True)  # 创建一个单元sheet1
    Lie_name = ("影片名","影片链接","影片概述","图片链接","相关信息")
    for i in range(0,5):
        sheet.write(0,i,Lie_name[i])
    for j in range(0,50):
        print("爬取到第%d条"%(j+1))
        data = datalist[j]
        for k in range(0,5):
            sheet.write(j+1,k,data[k])

    book.save(savepath)
    print("获取完毕~")

def init_DataBase(saveconnect):
    c = saveconnect.cursor()
    Sql = '''
        create table Doubanmovies
        (id int primary key not null,
        title text not null,
        link text not null,
        inq text not null,
        img text not null,
        bd text not null
        );
        '''
    c.execute(Sql)  # 执行操作请求
    saveconnect.commit()  # 对象提交数据库的操作
    saveconnect.close()
    print("创建数据库表成功~")

def saveData2DataBase(datalist,saveconnect):
    print("已成功连接到数据库~")
    c = saveconnect.cursor()

    # # 方法1:
    # for data in datalist:
    #     for i in range(len(data)):
    #         data[i] = '"'+data[i]+'"'      #字符化
    #     sql = '''
    #         insert into doubanmovies(id,title,link,inq,img,bd)
    #         values(%d,%s)'''%",".join(data)     # .join  将数据拼接
    #     '''
    #     print(sql)

    for j in range(0,50):
        print("-----------")
        data = datalist[j]

        # 方法2:还可以在数据库直接执行操作:
        # DataBase->目标数据库.db->schemas->main->目标名->右键->SQL Scripts-> Source Editor-> 删除内容->写以下执行语句
        # 方法3
        c.execute(  'insert into doubanmovies(id,title,link,inq,img,bd)values("%d","%s","%s","%s","%s","%s")'
                    %(j, data[0], data[1], data[2], data[3], data[4])  )
        saveconnect.commit()  # 提交数据库的操作
        print("爬取到第%d条"%(j+1))

    saveconnect.close() # 关闭数据库

if __name__ == '__main__':
    main()


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python学习笔记|字符串与正则表达式练习题答案 1. 练习题1: 题目:给定一个字符串s,找出其中的连续的最长的数字串。 答案:可以通过正则表达式来匹配数字串,然后使用max函数找出最长的。 代码示例: import re def find_longest_num_str(s): num_str_list = re.findall('\d+', s) longest_str = max(num_str_list, key=len) return longest_str s = "ab1234c56789def" print(find_longest_num_str(s)) 输出:56789 2. 练习题2: 题目:给定一个字符串s,将其中的每个空格替换为"%20"。 答案:可以通过正则表达式的sub函数来实现替换。 代码示例: import re def replace_space(s): new_s = re.sub(' ', '%20', s) return new_s s = "Hello World" print(replace_space(s)) 输出:Hello%20World 3. 练习题3: 题目:给定一个字符串s,判断它是否为回文字符串。 答案:可以使用切片操作将字符串反转,然后与原字符串进行比较。 代码示例: def is_palindrome(s): return s == s[::-1] s = "abcba" print(is_palindrome(s)) 输出:True ### 回答2: 以下是关于字符串和正则表达式练习题的答案: 1. 给定一个字符串s,编写一个函数,返回该字符串的反转字符串。 def reverse_string(s): return s[::-1] 2. 给定一个字符串s,编写一个函数,返回是否是回文字符串。 def is_palindrome(s): return s == s[::-1] 3. 给定一个字符串s和一个字符c,编写一个函数,返回字符串s中字符c的出现次数。 def count_char(s, c): return s.count(c) 4. 给定一个字符串s,编写一个函数,返回字符串s中的所有单词列表。 def split_words(s): return s.split() 5. 给定一个字符串s,编写一个函数,返回字符串s中的所有数字列表。 import re def extract_numbers(s): return re.findall(r'\d+', s) 这只是一些可能的答案,其中的解决方法可以有很多种。每个问题都有不同的解决方案,具体取决于个人的编程风格和需求。希望这些答案能够帮助你理解和学习Python中的字符串和正则表达式

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值