从零开始学爬虫(爬取豆瓣),一看就会

一、 准备工作

语言:python
编辑器:pycharm
需要导的包:bs4、re、urllib、xlwt(可以通过左上角file->settings->project->interpreter->右边加号导包)
爬虫就是编写程序模拟浏览器打开网页获取需要的内容
在这里插入图片描述

二、 构建流程

from bs4 import BeautifulSoup #网站解析,获取数据
import re #正则表达式
import urllib.request,urllib.error #指定url
import xlwt #excel操作
import sqlite3 #数据库操作
def main():
    baseurl = "https://movie.douban.com/top250?start="
    #获取数据
    datalist = getData(baseurl)
    #保存文件
    savepath = ".\\豆瓣.xls"
    saveData(datalist, savepath)
    #askUrl(baseurl)
    pass

#获取爬取的网页数据
def getData(baseurl):
    datalist = []
	return datalist

#得到指定一个url的网页内容,后面会将urllib的使用
def askUrl(url):
    #用户代理  表明是什么类型的浏览器
    head = {
    
    
        "User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36"
    }
    req = urllib.request.Request(url=url,headers=head)
    html = ''
    try:
        res = urllib.request.urlopen(req)
        html = res.read().decode('utf-8')
        return html
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
            pass
        if hasattr(e,"reason"):
            print(e.reason)
            pass
    pass


#保存数据
def saveData(datalist, savepath):
	pass

main()

三、各种工具的使用

1、urllib的使用

urllib 是一个收集了多个涉及 URL 的模块的包:

urllib.request 打开和读取 URL

urllib.error 包含 urllib.request 抛出的异常

urllib.parse 用于解析 URL

urllib.robotparser 用于解析 robots.txt 文件

所以我们可以新建一个testUrllib.py文件,单独测试下urllib的使用

import urllib.request,urllib.error,urllib.parse
#首先定义一个url
url = "http://www.douban.com"
#设置header的user-agent原因是如果不设置,会显示user-agent:python-urllib,从而有时候爬取失败,所以要伪装成是用浏览器打开
headers = {
    
    
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.102 Safari/537.36"
}
#post 将传递的data数据包装起来
data = bytes(urllib.parse.urlencode({
    
    "hello":"world"}),encoding='utf-8')
#发出request请求
req = urllib.request.Request(url=url,headers=headers,method='POST',data=data)
res = urllib.request.urlopen(req)
#获取数据  可以看到获取的是豆瓣网的代码,后面我们将对这些内容进行解析获取需要的内容
print(res.read().decode('utf=8'))

在这里插入图片描述

2、bs4 BeautifulSoup的使用

Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.

下面有几个常用方法,更多详细的使用可以去看官方文档

from bs4 import BeautifulSoup
import re
file = open("./baidu.html","rb")
html = file.read()
bs = BeautifulSoup(html,"html.parser")
# print(bs.title.string)
# t_list = bs.find_all("a")
# print(t_list)
# 正则表达式搜索
# t_list = bs.find_all((re.compile("a")))
#方法搜索
# def name_is(tag):
#     return tag.has_attr("name")
# t_list = bs.find_all(name_is)
# for i in t_list:
# #     print(i)
# print(t_list)
#关键字查找
# t_list = bs.find_all(id="head")
# for i in t_list:
#     print(i)

#text参数
# t_list = bs.find_all(text="hao123")
# for i in t_list:
#     print(i)
#     pass
#
# t_list = bs.find_all(text=re.compile("\d"))
# for i in t_list:
#     print(i)

#llimit参数
t_list = bs.find_all("a",limit=3)
for i in t_list:
    print(i)

3、xlwt的使用

xlwt 是 Python 用来在 Excel 写入数据和格式化数据的工具包
下面以九九乘法表为例

import  xlwt

workbook = xlwt.Workbook(encoding='utf-8') #创建对象
worksheet = workbook.add_sheet('sheet1') #创建表单  sheet1对应下图标注处
for i in range(0,9):
    for j in range(0,i+1):
    	#将内容写进表单中
        worksheet.write(i,j,"%d * %d = %d"%(i+1,j+1,(i+1)*(j+1)))
        pass
    pass
#将写好的存放到excel中
workbook.save('student.xls')  #这里的student.xls是文件名

在这里插入图片描述

四、正式开始

from bs4 import BeautifulSoup #网站解析,获取数据
import re #正则表达式
import urllib.request,urllib.error #指定url
import xlwt #excel操作

def main():
    baseurl = "https://movie.douban.com/top250?start="
    #获取数据
    datalist = getData(baseurl)
    #保存文件
    savepath = ".\\豆瓣.xls"
    saveData(datalist, savepath)
    pass


#这里使用正则表达式,导入的re包,解析获取的网页内容
#找到链接
findLink = re.compile(r'<a href="(.*?)">')#创建正则表达式对象,表示规则
#找到海报
findImgSrc = re.compile(r'<img .* src="(.*?)"',re.S)
#找到标题
findTitle = re.compile(r'<span class="title">(.*)</span>')
#找到评分
findRate = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#找到评价人数
findPerson = re.compile(r'<span>(\d*)人评价</span>')
#找到概况
findInq = re.compile(r'<span class="inq">(.*)</span>')
#找到影片相关内容
findBd = re.compile(r'<p class="">(.*?)</p>', re.S)


#爬取网页
def getData(baseurl):
    datalist = []
    for i in range(0, 10): #获取10次   这里是因为爬取的是top250 所以知道有250个
        url = baseurl + str(i*25)
        html = askUrl(url) #保存爬取的网页
        #2.逐一解析数据
        soup = BeautifulSoup(html, "html.parser")
        for item in soup.find_all('div', class_="item"):#查找符合要求的字符串  这里的class后要加个下划线
            data = [] #保存一部电影的信息
            item = str(item)
            # print(item)
            #获取到影片详情的链接
            link = re.findall(findLink, item)[0] #正则表达式查找指定的字符串
            data.append(link) #添加链接

            imgSrc = re.findall(findImgSrc, item)[0]  # 正则表达式查找指定的字符串
            data.append(imgSrc)#添加海报

            title = re.findall(findTitle, item)
            if(len(title) == 2):#添加片名
                ctitle = title[0]
                data.append(ctitle) #添加中文名
                otitle = title[1].replace("/", "")
                data.append(otitle)#添加外文名
                pass
            else:
                data.append(title[0])
                data.append(' ')#留空  为了excel处可以对齐
                pass
            per = re.findall(findPerson, item)[0]
            data.append(per)#添加评价人数

            rating = re.findall(findRate, item)[0]
            data.append(rating)#添加评分

            inq = re.findall(findInq, item) #添加概述
            if len(inq):
                inq = inq[0].replace("。", "")
                data.append(inq)
                pass
            else:
                data.append(" ")
                pass
            bd = re.findall(findBd, item)[0]
            bd = re.sub('<br(\s+)?/>(\s+)?', " ", bd)
            bd = re.sub('/', " ", bd)
            data.append(bd.strip()) #添加
            datalist.append(data)
            pass
        pass
    print(datalist)
    return datalist

#得到指定一个url的网页内容
def askUrl(url):
    #用户代理  表明是什么类型的浏览器
    head = {
    
    
        "User-Agent":"Mozilla / 5.0(Windows NT 10.0;Win64;x64) AppleWebKit / 537.36(KHTML, likeGecko) Chrome / 85.0.4183.102Safari / 537.36"
    }
    req = urllib.request.Request(url=url,headers=head)
    html = ''
    try:
        res = urllib.request.urlopen(req)
        html = res.read().decode('utf-8')
        return html
    except urllib.error.URLError as e:
        if hasattr(e,"code"):
            print(e.code)
            pass
        if hasattr(e,"reason"):
            print(e.reason)
            pass
    pass


#保存数据
def saveData(datalist, savepath):
    workbook = xlwt.Workbook(encoding='utf-8', style_compression=0)  # 创建对象
    worksheet = workbook.add_sheet('豆瓣电影250', cell_overwrite_ok=True)  # 创建表单
    col = ('电影详情链接', "图片链接", "影片中文名", "影片外文名", "评分", "评分数", "概况", "相关信息")
   #设置表头
    for i in range(0, 8):
        worksheet.write(0, i, col[i])
        pass
    #将解析后的内容写入excel表中
    for i in range(0, 250):
        print("第{}条".format(i))
        data = datalist[i]
        for j in range(0, 8):
            worksheet.write(i+1, j, data[j])
            pass
        pass
    workbook.save(savepath)
    pass
#运行
main()

结果图如下:
在这里插入图片描述
初识爬虫,还存在各种问题,希望大家可以批评指正
我感觉就是解析网页时候可能会有点问题吧

猜你喜欢

转载自blog.csdn.net/Two_Bits/article/details/108561338