首页 > 编程语言 >python爬虫

python爬虫

时间:2024-06-13 19:21:16浏览次数:17  
标签:item python 爬虫 urllib re html data append

What's 爬虫?

简单来说:

爬虫,即网络蜘蛛,是伪装成客户端与服务器进行数据交互的程序。

代码

from bs4 import BeautifulSoup        #网页解析
import urllib.request,urllib.error   #制定URL,获取网页数据
import re                            #正则表达式  进行文字匹配
import xlwt                          #进行excel操作
from tqdm import trange              #进度条库
 
def main():
    baseurl = "https://movie.douban.com/top250?start="
    # 1.爬取网页
    # 2.逐一解析数据
    datalist =getDate(baseurl)
    # 3.保存数据
    savepath = "豆瓣top250.xls"
    savedata(datalist,savepath)
 
#影片详情链接
findLink = re.compile(r'<a href="(.*?)">')     #创建正则表达式,表示规则(字符串的模式)
#影片图片的链接
findImagesrc = re.compile( r'<img[^>]+src=["\']([^"\']+)["\']')     #ai写的正则
#影片中文片名
findName = re.compile(r'<span class="title">(.*)</span>')
#影片评分
findRating = re.compile(r'<span class="rating_num" property="v:average">(.*)</span>')
#影片热评
findComment = re.compile(r'<span class="inq">(.*?)</span>')
 
def getDate(baseurl):
    datalist = []
    # 1.爬取网页
    for i in trange(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)      #保存获取到的网络源码
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):
            # 2.逐一解析数据
            item =str(item)
            data=[]
            name = re.findall(findName,item)[0]
            data.append(name)
            link = re.findall(findLink,item)[0]
            data.append(link)
            img = re.findall(findImagesrc,item)[0]
            data.append(img)
            rating = re.findall(findRating,item)
            data.append(rating)
            comment = re.findall(findComment,item)
            if len(comment)!=0:
                comment=comment[0].replace("。","")
                data.append(comment)
            else:
                data.append("  ")
            datalist.append(data)
 
    return datalist
 
def askURL(url):
    head={
        "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
    }
    request = urllib.request.Request(url,headers=head)
    html= ""
    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)
    return html
 
def savedata(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)   #压缩样式效果,设为0
    sheet = book.add_sheet('top250',cell_overwrite_ok=True)  #每个单元在写入时覆盖以前的内容
    col = ('电影中文名','电影详情链接','图片链接','电影评分','电影热评')
    for i in range(0,len(col)):
        sheet.write(0,i,col[i])   #列名
    for i in range (0,250):
        data = datalist[i]
        for j in range (0,len(col)):
            sheet.write(i+1,j,data[j])
 
    book.save(savepath)
 
if __name__ == "__main__":
    main()
    print("爬取完成")

需要用到的库:
from bs4 import BeautifulSoup #网页解析
import urllib.request,urllib.error #制定URL,获取网页数据
import re #正则表达式 进行文字匹配
import xlwt #进行excel操作
from tqdm import trange

进度条库,当然你也可以不用,这个库只需要把for循环里的range改为trange,你就可以得到一个进度条

思路

1.获取网页的源码

def askURL(url):
    head={
        "User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0"
    }
    request = urllib.request.Request(url,headers=head)
    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

用个循环,根据网页制定一下url

找到用于伪装客户端User-Agent
在network里刷新一下网页,找到发送的标头header

这个是user-agent:Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Mobile Safari/537.36 Edg/121.0.0.0

用urllib获取你制定的url的源码
在 try 块中:

调用 urllib.request.urlopen(request) 发送HTTP请求,并获取响应对象 response。
通过 response.read() 获取服务器返回的原始二进制数据。
使用 decode("utf-8") 方法将二进制数据解码成UTF-8编码的字符串,并将其赋值给变量 html。
如果在执行 urlopen 函数过程中出现 urllib.error.URLError 异常,则进入 except 块:

判断异常对象是否包含 .code 属性,如果有则打印出HTTP状态码。
再判断异常对象是否包含 .reason 属性,如果有则打印出错误原因。
最后,无论是否发生异常,都返回抓取到的网页HTML内容(即变量 html)

2.解析数据

def getDate(baseurl):
    datalist = []
    # 1.爬取网页
    for i in trange(0,10):
        url = baseurl + str(i*25)
        html = askURL(url)      #保存获取到的网络源码
        soup = BeautifulSoup(html,"html.parser")
        for item in soup.find_all('div',class_="item"):
            # 2.逐一解析数据
            item =str(item)
            data=[]
            name = re.findall(findName,item)[0]
            data.append(name)
            link = re.findall(findLink,item)[0]
            data.append(link)
            img = re.findall(findImagesrc,item)[0]
            data.append(img)
            rating = re.findall(findRating,item)
            data.append(rating)
            comment = re.findall(findComment,item)
            if len(comment)!=0:
                comment=comment[0].replace("。","")
                data.append(comment)
            else:
                data.append("  ")
            datalist.append(data)
 
    return datalist

BeautifulSoup
bs4是一个强大的库,用于从HTML和XML文件中提取数据,它能够将复杂的HTML结构转换成树形结构(即元素树),使得开发者可以方便地搜索、遍历以及修改网页内容。

"html.parser": 这是BeautifulSoup用来解析HTML文档的解析器。在这个案例中,它是指Python自带的标准HTML解析器。除了标准的解析器外,BeautifulSoup还可以配合其他第三方解析器如 lxml 来使用。

用bs4和re筛选信息

3.保存数据 写入excel表中

需要用到xwlt库

def savedata(datalist,savepath):
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)   #压缩样式效果,设为0
    sheet = book.add_sheet('top250',cell_overwrite_ok=True)  #每个单元在写入时覆盖以前的内容
    col = ('电影中文名','电影详情链接','图片链接','电影评分','电影热评')
    for i in range(0,len(col)):
        sheet.write(0,i,col[i])   #列名
    for i in range (0,250):
        data = datalist[i]
        for j in range (0,len(col)):
            sheet.write(i+1,j,data[j])
 
    book.save(savepath)

标签:item,python,爬虫,urllib,re,html,data,append
From: https://www.cnblogs.com/Sol9/p/18246615

相关文章

  • Python 如何将Latex转换成Word公式?
    好久没写博客啦!最近帮女朋友(数学老师)搞了个题目转成Word的小工具。情景就是,我们在一些图片里获取到数学题目时通常会使用到ocr技术,但是呢通过ocr给到的数学公式是Latex表达式,这也就是为什么我们用识图软件或者手机微信等自带的识别不了数学公式,识别了粘贴到word中又变成了......
  • 量化交易:miniQMT的可转债与正股折价套利策略python代码
    哈喽,大家好,我是木头左!套利是一种艺术,一种利用市场的价格差异来获取无风险利润的艺术。而可转债与正股之间的折价套利,更是量化交易者眼中的香饽饽。今天,我们将一起揭开这层神秘的面纱,探索如何使用miniQMT和Python来实现这一策略。......
  • 流畅的python--第十三章 接口、协议和抽象基类
    面向对象编程全靠接口。在Python中,支撑一个类型的是它提供的方法,也就是接口。在不同的编程语言中,接口的定义和使用方式不尽相同。从Python3.8开始,有4种方式,如图13-1中的类型图所示。这4种方式概述如下。鸭子类型自Python诞生以来默认使用的类型实现方式。从第1......
  • 如何利用ChatGPT辅助下处理:ENVI、GEE、Python等遥感数据
    遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。重点介绍ChatGPT在遥感中的应用,人工智能在解释复杂数据、提供见解和帮助决策过程方......
  • Python typing 的使用总结
    1. 类型提示(TypeHints):Python3.5引入了类型提示,这是一种新的语法特性,允许在函数声明中指定参数和返回值的预期类型。这些类型注解对Python解释器没有任何影响,但是可以被类型检查器、IDE、linter等工具用来捕获类型错误。defgreet(name:str)->str:return'Hello,'+......
  • 爬虫 | 多线程、多进程、协程
    进程和线程"""进程中至少有一条线程,线程和进程的开启非常类似,这里就展示线程"""fromthreadingimportThreadfrommultiprocessingimportProcess#第一种开启的方法就是直接defdeffunc(name):foriinrange(100):print(name,i)if__name__=='__ma......
  • 用于NLP的Python:使用Keras的多标签文本LSTM神经网络分类|附代码数据
    全文下载链接:http://tecdat.cn/?p=8640在本文中,我们将看到如何开发具有多个输出的文本分类模型。我们开发一个文本分类模型,该模型可分析文本注释并预测与该注释关联的多个标签。多标签分类问题实际上是多个输出模型的子集。在本文结尾,您将能够对数据执行多标签文本分类。数据集......
  • python运行js代码拿到逆向数据-execjs库
    #前提安装了node.js并且设置环境变量https://blog.csdn.net/bestyellow/article/details/119820509importsubprocessfromfunctoolsimportpartialsubprocess.Popen=partial(subprocess.Popen,encoding='utf-8')importexecjs#如果funcs_name是js代码里面的函数名字var代......
  • python 赋值后is ==遇到的问题
    在python中小整数对象池包括[-5,256]。这之间的小整数数值相同时在小整数对象池中属于同一对象即是aisb返回True。简单字符串也是如此,对于其他对象则不适用简单来说 is与notis比较的是数字的地址                ==判断的是数字的值在计算机中的......
  • Python 学习笔记
    第二章编程基础那点事2.6模块在Python用import或者from...import来导入相应的模块。一个模块就是一个文件,模块是保存代码的最小单位,在模块中可以声明变量、函数、属性和类等Python代码元素。将整个模块导入,格式为: importsomemodule 从某个模块中导入某个函数,格......