Python爬虫 - 电影Top250信息

Python爬虫 - 电影Top250信息

  • 1.需求
  • 2.基本流程
    • 2.1准备工作
    • 2.2获取数据
      • 2.2.1获取用户代理
      • 2.2.2 得到制定一个URL的网页内容
      • 2.2.3 调用10次25份数据,解析网页
    • 2.3解析内容
    • 2.4保存数据
  • 3.补充
    • 3.1 urllib
    • 3.2 BeautifulSoup
      • 3.2.1 文档的遍历
      • 3.2.2 文档的搜索
    • 3.3xlwt
  • 4.完整代码

1.需求

爬取某瓣电影Top250的基本信息

2.基本流程

2.1准备工作

#-*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  #网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作

def main():
    #基址
    baseurl="https://movie.douban.com/top250?start="
    #1.爬取网页
    datalist=getData(baseurl)
    # 保存路径
    savepath='.\\豆瓣电影Top250.xls'
    #3.保存数据
    saveData(savepath)
    
# 爬取网页    
def getData(baseurl):
    datalist=[]
    #2.逐一解析数据
    return datalist

#保存数据
def saveData(savapath):
    print()

if __name__=="__main__":#当程序执行时
# 调用函数
    main()

2.2获取数据

2.2.1获取用户代理

  • User-Agent用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)【获取方法如下】
    Python爬虫 - 电影Top250信息_第1张图片

2.2.2 得到制定一个URL的网页内容

def askURL(url):
    # head模拟浏览器头部信息,向豆瓣服务器发送消息
    head ={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}
    # 携带头部信息访问url
    request=urllib.request.Request(url,headers=head)
    html=""
    # 看3.1对urllib的补充理解
    response=urllib.request.urlopen(request)
    html=response.read().decode("utf-8")
    print(html)

记得在main里面调用askURL哈

2.2.3 调用10次25份数据,解析网页

# 爬取网页
def getData(baseurl):
    datalist=[]
    # 调用获取页面信息的函数,10次
    for i in range(0,10):
        url= baseurl +str(i*25)
        html=askURL(url) #获取一页html,保存获取到的网页源码
        #逐一解析数据【注意:是在for循环里面解析,弄到一个网页解析一下】
    return datalist

2.3解析内容

解析影片详情链接为例,可用同样方式解析其它电影信息

#影片详情链接的规则
findlink=re.compile(r'') #创建正则表达式对象,表示规则(字符串的模式)
findImgSrc=re.compile(r'"',re.S) #re.S让换行符包含字符
# 爬取网页
def getData(baseurl):
    datalist=[]
    # 调用获取页面信息的函数,10次
    for i in range(0,10):
        url= baseurl +str(i*25)
        html=askURL(url) #获取一页html,保存获取到的网页源码
        #2.逐一解析数据【注意:是在for循环里面解析,弄到一个网页解析一下】
        soup=BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表
            # print(item)#测试:查看电影item全部信息
            data=[]# 保存一部电影的所有信息
            item=str(item)
            # print(item+'HHHHHH')
            #   break
            # 影片详情的链接
            link=re.findall(findlink,item)[0]# re库用来通过正则表达式查找指定的字符串
            print(link)
    return datalist

2.4保存数据

#保存数据
def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet('司六',cell_overwrite_ok=True)  # 创建工作表
    col=("详情链接","图片链接","电影名称")
    for i in range(0,3):
        sheet.write(0,i,col[i])#列名
    for i in range(0,250):
        print("第%d条" %i)
        data=datalist[i]
        for j in range(0,3):
            sheet.write(i+1,j,data[j])#数据
    book.save(savepath)  # 保存数据表

3.补充

3.1 urllib

import urllib.request
# 获取一个get请求
response=urllib.request.urlopen("http://www.baidu.com")
print(response.read().decode('utf-8'))

Python爬虫 - 电影Top250信息_第2张图片
httpbin–请求返回网站

3.2 BeautifulSoup

BeautifulSoup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种

  • Tag
  • NavigableString
  • BeautifulSoup
  • comment
from bs4 import BeautifulSoup
file = open("./司六米希.html",'rb')
html=file.read()
bs=BeautifulSoup(html,"html.parser")
# 1.Tag   标签及其内容:拿到它找到的第一个内容
print(bs.title)
print(type(bs.title))

# 2.NavigableString  标签里的内容(字符串)
print(bs.title.string)
print(type(bs.title.string))

# 3.attrs 获得属性的键值对
print(bs.a.attrs)

# 4.BeautifulSoup表示整个文档
print(type(bs))
print(bs.name)

# 5.Comment  是一个特殊的NavigableString,输出的内容不包含注释符号

3.2.1 文档的遍历

print(bs.head.contents)
print(bs.head.contents[1])
  • 更多内容搜索BeautifulSoup文档

3.2.2 文档的搜索

# (1)find_all()  ()里面加入规则
# 字符串过滤:会查找与字符串完全匹配的内容
#eg: 与a字符串标签完全一样
# k_list=bs.find_all("a")

#正则表达式搜索:使用search()方法匹配内容
# 会找到所有含a的某一标签及其内容
# import re
# t_list=bs.find_all(re.compile('a'))

#方法: 传入一个函数(方法),根据函数的要求来搜索
# def name_is_exists(tag):
#     return tag.has_attr("name")
# t_list=bs.find_all(name_is_exists)
print(t_list)
for item in t_list:
    print(item)

3.3xlwt

import xlwt
workbook =xlwt.Workbook(encoding="utf-8")#创建workbook对象
worksheet=workbook.add_sheet('sheet1')#创建工作表
worksheet.write(0,0,'hello')#写入数据,第一行参数‘行’,第二个参数‘列’,第三个参数内容
workbook.save('司六米希.xls')#保存数据表

4.完整代码

#-*- codeing = utf-8 -*-
from bs4 import BeautifulSoup  #网页解析,获取数据
import re # 正则表达式,进行文字匹配
import urllib.request,urllib.error #制定URL,获取网页数据
import xlwt #进行excel操作
import sqlite3 #进行SQLite数据库操作

def main():
    #基址
    baseurl="https://movie.douban.com/top250?start="
    #1.爬取网页
    datalist=getData(baseurl)
    # 保存路径
    savepath='豆瓣电影Top250.xls'
    #3.保存数据
    saveData(datalist,savepath)
    # askURL("https://movie.douban.com/top250?start=0")
#影片详情链接的规则
findlink=re.compile(r'') #创建正则表达式对象,表示规则(字符串的模式)
findImgSrc=re.compile(r',re.S) #re.S让换行符包含字符
findTitle=re.compile(r'(.*?)')
# 爬取网页
def getData(baseurl):
    datalist=[]
    # 调用获取页面信息的函数,10次
    for i in range(0,10):
        url= baseurl +str(i*25)
        html=askURL(url) #获取一页html,保存获取到的网页源码
        #2.逐一解析数据【注意:是在for循环里面解析,弄到一个网页解析一下】
        soup=BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):#查找符合要求的字符串,形成列表
            # print(item)#测试:查看电影item全部信息
            data=[]# 保存一部电影的所有信息
            item=str(item)
            # print(item+'HHHHHH')
            #   break
            # 影片详情的链接
            link=re.findall(findlink,item)[0]# re库用来通过正则表达式查找指定的字符串
            # print(link)
            data.append(link) #添加链接

            imgSrc=re.findall(findImgSrc,item)[0]
            data.append(imgSrc)#添加图片
            # print(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('')#外国名字留空

            datalist.append(data)#把处理好的一部电影信息放入datalist
            # print(datalist)
    return datalist

# 得到制定一个URL的网页内容
def askURL(url):
    #User-Agent用户代理,表示告诉豆瓣服务器,我们是什么类型的机器,浏览器(本质上是告诉浏览器,我们可以接收什么水平的文件内容)
    # head模拟浏览器头部信息,向豆瓣服务器发送消息
    head ={"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"}
    # 携带头部信息访问url
    request=urllib.request.Request(url,headers=head)
    html=""
    # 看urllib的补充理解
    response=urllib.request.urlopen(request)
    html=response.read().decode("utf-8")
    # print(html)
    return html



#保存数据
def saveData(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)  # 创建workbook对象
    sheet = book.add_sheet('司六',cell_overwrite_ok=True)  # 创建工作表
    col=("详情链接","图片链接","电影名称")
    for i in range(0,3):
        sheet.write(0,i,col[i])#列名
    for i in range(0,250):
        print("第%d条" %i)
        data=datalist[i]
        for j in range(0,3):
            sheet.write(i+1,j,data[j])#数据
    book.save(savepath)  # 保存数据表



if __name__=="__main__":#当程序执行时
# 调用函数
    main()

Python爬虫 - 电影Top250信息_第3张图片
★,°:.☆( ̄▽ ̄)/$:.°★ 。撒花撒花

你可能感兴趣的:(python,python,爬虫,sqlite)