python 爬虫入门

案例,爬取豆瓣电影网页面数据,电影名,评分,图片icon,评论人数等数据,并存储到本地xls表格中

# 这是一个示例 Python 脚本。

# 按 Shift+F10 执行或将其替换为您的代码。
# 按 双击 Shift 在所有地方搜索类、文件、工具窗口、操作和设置。
# 导入内置模块
import sys
# 导入标准库
import os
# 导入第三方库(需要安装:pip install bs4)
import bs4
from bs4 import BeautifulSoup

# 打印当前工作目录
# print(os.getcwd())
# import bs4 导入整个模块
# print(bs4.BeautifulSoup.getText)
# from bs4 import BeautifulSoup 导入指定模块的部分属性至当前工作空间
# print(BeautifulSoup.getText)
import urllib.request, urllib.error  # 定制URL,获取网页数据
from bs4 import BeautifulSoup  # 网页解析,获取数据
import re  # 正则表达式,进行文件匹配
import xlwt  # 进行excel操作
import sqlite3  # 进行SQLite数据库操作

baseurl = 'https://movie.douban.com/top250?start='
# 定义一个函数gethtmlbyrul,得到指定的rul 网页内容
def geturl(url):

    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.82 Safari/537.36'
    }
    #利用Request类来构造自定义头的请求
    req=urllib.request.Request(url=url, headers=headers)
    #定义一个接收变量,用于接收
    html=""
    try:
        # urlopen()方法的参数,发送给服务器病接收响应
        resp=urllib.request.urlopen(req)
        # urlopen()获取页面内容,返回的数据格式为bytes类型,需要decode()解码,转换成str类型
        html=resp.read().decode('utf-8')
    except urllib.error.URLError as e:
        if hasattr(e, 'code'):
            print(e.code)
        if hasattr(e, 'reason'):
            print(e.reason)
    return html

# 定义正则对象获取指定内容
# 提取链接(链接的格式都是<a herf='开头的'>)
findLink = re.compile(r'<a href="(.*?)">')

# 提取图片  re.S让 ’.‘特殊字符匹配任何字符,包括换行符
findImgSrc =re.compile(r'<img.*src="(.*?)"',re.S)

# 提取影片名称
finTitle =re.compile(r'<span class="title">(.*)</span>')

# 提取影片评分
findRating =re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')

# 提取影片评价人数
findJudge =re.compile(r'<span>(\d*)人评价</span>')

# 提取影片简介
inq =re.compile(r'<span class="inq">(.*)</span>')

# 提取相关内容
findBd=re.compile(r'<p class="">(.*)</p>(.*)<div',re.S)

dataList=[]
# 定义一个函数,并解析这个网页
def analysisData(baseurl):
    for i in range (0,10):
        url=baseurl+str(i*25)
        html=geturl(url)
        soup=BeautifulSoup(html,'html.parser')
        for item in soup.findAll('div',class_='item'):
            item=str(item)
            print(item)
            data=[]
            # findall 返回的是一个列表,这里提取链接
            link =re.findall(findLink,item)[0]
            data.append(link)
            img=re.findall(findImgSrc,item)[0]
            data.append(img)
            title =re.findall(finTitle,item)[0]
            if len(title)==2:
                # ['肖申克的救赎',’、xa0/\xa0The shawhank Redmption‘]
                tillename=title[0]+title[1].replace(u'\xa0','')
            else:
                tillename=title[0]+""
            data.append(tillename)
            pf=re.findall(findRating,item)[0]
            data.append(pf)
            pjrs=re.findall(findJudge,item)[0]
            data.append(pjrs)
            inqInfo=re.findall(inq,item)
            if len(inqInfo)==0:
                data.append(' ')
            else:
                data.append(inqInfo[0])
            bd=re.findall(findBd,item)[0]
            bd[0].replace(u'\xa0','').replace('<br/>','')
            bd = re.sub('<\\s*b\\s*r\\s*/\\s*>',"",  bd[0])
            bd=re.sub('(\\s+)?',"",bd)
            data.append(bd)
            dataList.append(data)
    return dataList


def main():
    analysisData(baseurl)
    savepath='E:\Program Files\loadFile\豆瓣250.xls'
    book = xlwt.Workbook(encoding="utf-8", style_compression=0)  # 创建Workbook对象
    sheet = book.add_sheet("豆瓣电影Top250", cell_overwrite_ok=True)  # 创建工作表
    col = ("电影详情链接", "图片链接", "电影中/外文名", "评分", "评论人数", "概况", "相关信息")
    # print(len(dataList))
    for i in range(0, 7):
        sheet.write(0, i, col[i])
    for i in range(0, 250):
        # print('正在保存第' + str((i + 1)) + '条')
        data = dataList[i]
        for j in range(len(data)):
            sheet.write(i + 1, j, data[j])
    book.save(savepath)





# 按装订区域中的绿色按钮以运行脚本。
if __name__ == '__main__':
    main()
# 访问 https://www.jetbrains.com/help/pycharm/ 获取 PyCharm 帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值