pythonSpider_urllib获取豆瓣电影top250信息写入excel

简介: pythonSpider_urllib获取豆瓣电影top250信息写入excel

clientserver传递request,请求连接,发送syn报文(序号为x)需要验证headers,返回syn+ack报文(发送序号Y,确认序号x+1)ack=Y+1 seq=Z(发送序号z,确认序号Y+1)clientserver

urllib

python自带的urllib库,urllib使用request去访问url,也可以用requests库获取其它库。

思路

模仿request请求去访问网页,避免让服务器知道时python脚本写的,重写user-agent,得到html的页面代码,使用BeauSoup把html的标签信息转换为python节点对象,对想要的信息转换为字符串使用正则表达式提取想要的信息,最后使用xlwt写入excel

模拟headers

模拟headers中的user-agent(伪装成浏览器访问)

访问豆瓣网返回html

伪造request,分别访问豆瓣网页html,将html的数据保留

url="https://movie.douban.com/top250?start=22"
header = {
     "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
}
request = urllib.request.Request(url, headers=header)
request2 = urllib.request.Request(url2, headers=header)
try:
    response = urllib.request.urlopen(request)
    # html = response.read().decode("utf-8")
except urllib.error.URLError as e:
    if hasattr(e, 'code'):
        print(e.code)
    if hasattr(e, 'reason'):
        print(e.reason)

BeautifuSoup获取html节点

将html转化为python对象

soup = BeautifulSoup(html, "html.parser")  # 解析html

应用正则表达式获取相应的节点信息

findLink=re.compile(r'<a href="(.*?)">')  # 匹配规则 每一个a标签对应一部电影 获取链接
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S)# 匹配图片标签  re.忽略换行
findTitle=re.compile(r'<span class="title">(.*?)</span>')# 匹配span 片名
findScore=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')# 匹配评分
findJudge=re.compile(r'<span>(\d*?)人评价</span>')# 找到评价人数
findInfo=re.compile(r'<span class="inq">(.*?)</span>')# 描述
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)# 背景

获取豆瓣电影的信息并写入excel

import re,urllib,urllib.request
import requests,xlwt#写入excel
import random
from bs4 import BeautifulSoup
findLink=re.compile(r'<a href="(.*?)">')  # 匹配规则 每一个a标签对应一部电影 获取链接
findImgSrc=re.compile(r'<img.*src="(.*?)"',re.S)# 匹配图片标签  re.忽略换行
findTitle=re.compile(r'<span class="title">(.*?)</span>')# 匹配span 片名
findScore=re.compile(r'<span class="rating_num" property="v:average">(.*?)</span>')# 匹配评分
findJudge=re.compile(r'<span>(\d*?)人评价</span>')# 找到评价人数
findInfo=re.compile(r'<span class="inq">(.*?)</span>')# 描述
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)# 背景
def main():
    #豆瓣电影
    baseurl="https://movie.douban.com/top250?start="
    datalist=getData(baseurl)
    print(datalist)
    savepath="获取豆瓣电影表格.xls"
    savePath(datalist,savepath)#保存
def getData(baseurl):
    datalist=[] #抓取的结果返回
    for i in range(0,1):
        url=baseurl+str(i*25)
        html=askUrl(url)#逐个访问
        data=htmlData(html)#两层
        datalist.append(data)#添加变为三层
    #降级
    datalist=[x for y in datalist for x in y]#降一级
    return datalist
#解析html为soup节点对象
def htmlData(html):
    datalist = []
    soup = BeautifulSoup(html, "html.parser")  # 解析html
    for item in soup.find_all('div', class_="item"):
        data=[]
        item = str(item)  # 转化为字符串进行字符串的匹配
        link=re.findall(findLink,item)[0]
        data.append(link)
        imgsrc=re.findall(findImgSrc,item)[0]
        data.append(imgsrc)
        titles=re.findall(findTitle,item)
        if len(titles)==2:
            cn=titles[0]
            data.append(cn)
            en=titles[1].replace('/','')#把/替换
            en = "".join(en.split())#\xa0
            data.append(en)
        else:
            data.append(titles[0])
            data.append(" ")#加个空格
        score=re.findall(findScore,item)[0]
        data.append(score)
        judeNum=re.findall(findJudge,item)[0]
        data.append(judeNum)
        info=re.findall(findInfo,item)
        data.append(info[0])
        bd=re.findall(findBd,item)[0]
        bd=re.sub('<br(\s+)?/>(\s+)?','',bd)
        bd=re.sub('/',' ',bd)# 替换
        #\xa0的问题
        bd="".join(bd.split())#trip去掉前后空格拼接
        data.append(bd)#
        datalist.append(data)
    print(datalist)#打印获取的数据
    return datalist
def askUrl(url):
    # 模拟header
    header = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
    }
    request = urllib.request.Request(url,headers=header)
    r=requests.get(url,headers=header)
    code=r.apparent_encoding
    r.code=code
    print(r.status_code)
    try:
        response = urllib.request.urlopen(request)
        html=""
        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
#-*- coding:utf-8 -*-
#加上编码格式
def savePath(datalist,savepath):#传入参数
    # return True
    book=xlwt.Workbook(encoding="utf-8",style_compression=0)#创建workbook对象
    sheet=book.add_sheet("获取豆瓣电影投票250",cell_overwrite_ok=True)#创建工作表
    col=["电影详情链接","图片链接","中文名","英文名","评分",'评价数',"概述","背景"]
    length=len(datalist)
    print(length)
    for i in range(0,8):
        sheet.write(0,i,col[i])#添加属性列
    for i in range(0,length):#250条,会超出
        data=datalist[i]
        print(data)
        for j in range(0,8):
            print(data[j])
            sheet.write(i+1,j,data[j])#添加
    book.save(savepath)
    return True
#执行main
main()

过滤获取成功

加入excel成功

end: 我的仓库

目录
相关文章
|
1月前
|
Python
Python—提取页面上所有信息输出excel
Python—提取页面上所有信息输出excel
|
11月前
|
数据采集 存储 安全
Python爬虫实战:利用代理IP爬取某瓣电影排行榜并写入Excel(附上完整源码)
Python爬虫实战:利用代理IP爬取某瓣电影排行榜并写入Excel(附上完整源码)
183 0
Python爬虫实战:利用代理IP爬取某瓣电影排行榜并写入Excel(附上完整源码)
|
8月前
|
DataWorks 数据处理 Python
DataWorks没有直接提供将每天的报警信息导出到Excel的接口
DataWorks没有直接提供将每天的报警信息导出到Excel的接口
51 1
|
8月前
|
数据挖掘 数据处理 Python
Python设置excel默认属性信息(作者、标题等)
更多内容关注我的微信公众号:python学习杂记
126 0
|
9月前
|
存储 数据处理 数据库
程序设计之——手把手教你如何从Excel文件中读取学生信息
在当今信息化时代,计算机技术已经深入到各个领域,而程序设计则成为推动信息化建设的关键技术之一。在众多领域中,学生信息管理系统无疑是其中一个重要的应用。本文将从学生信息管理系统的开发入手,探讨开如何高效且保证质量的完成开发。
ChatGPT结合Excel公式办公 —— ChatGPT统计富豪信息
ChatGPT结合Excel公式办公 —— ChatGPT统计富豪信息
|
Java 数据库
java语言读取Excel文件信息
最近项目中有一个表信息过大,需要手动删除,因为信息量比较大手动删除较为麻烦,所以采用使用excel读取数据的方式,然后操作数据库删除数据,其实只要是想要从Excel中获取信息都可以使用这种方式进行操作Excel,代码很简单。
193 0
|
存储 运维 小程序
基于微信小程序云开发(统计学生信息并导出excel)4.0版(稳定版)
基于微信小程序云开发(统计学生信息并导出excel)4.0版(稳定版)
269 0
基于微信小程序云开发(统计学生信息并导出excel)4.0版(稳定版)
|
存储 运维 小程序
基于微信小程序云开发(统计学生信息并导出excel)3.0版
基于微信小程序云开发(统计学生信息并导出excel)3.0版
178 0
基于微信小程序云开发(统计学生信息并导出excel)3.0版
|
1月前
|
前端开发 Java
基于Java爬取微博数据(二) 正文长文本+导出数据Excel
【5月更文挑战第12天】基于Java爬取微博数据,正文长文本+导出数据Excel