当前位置: 首页 > news >正文

Python爬虫学习完整版

一、什么是爬虫

网络爬虫,是一种按照一定规则,自动抓取互联网信息的程序或者脚本。由于互联网数据的多样性和资源的有限性,根据用户需求定向抓取相关网页并分析也成为如今主流的爬取策略。


1 爬虫可以做什么


你可以爬取网络上的的图片,爬取自己想看的视频等等,只要你能通过浏览器访问的数据都可以通过爬虫获取。


2 爬虫的本质是什么


模拟浏览器打开网页,获取网页中我们想要的那部分数据

学习案例:爬取豆瓣电影 Top 250的基本信息

引入第三方模块

# 引入第三方模块
from bs4 import BeautifulSoup #网页解析,获取数据
import re    #正则表达式,进行文字匹配
import urllib.request,urllib.error   #制定URL,获取网页数据
import xlwt    #进行Excel操作
import sqlite3   #进行数据库操作

正则表达式——制定获取数据规则

# 影片详情链接规则
findLink=re.compile(r'<a href="(.*?)">')   #创建正则表达式对象,表示规则(字符串模式)
findImg=re.compile(r'<img.*src="(.*?)?"',re.S)  #影片图片
findTitle=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>')   #影片评价人数
findIng=re.compile(r'<span class="ing">(.*)</span>')   #找到概况
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)   #找到影片的相关内容

 完整代码


# 引入第三方模块
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=".\\豆瓣电影Top250.xls"# 影片详情链接规则
findLink=re.compile(r'<a href="(.*?)">')   #创建正则表达式对象,表示规则(字符串模式)
findImg=re.compile(r'<img.*src="(.*?)?"',re.S)  #影片图片
findTitle=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>')   #影片评价人数
findIng=re.compile(r'<span class="ing">(.*)</span>')   #找到概况
findBd=re.compile(r'<p class="">(.*?)</p>',re.S)   #找到影片的相关内容def getData(baseurl):dataList=[]for i in range(0,10):# 调用获取页面信息的函数 10次url=baseurl+ str(i*25)html=askURL(url)   # 保存获取到的源码soup=BeautifulSoup(html,"html.parser")for item in soup.find_all('div',class_="item"):  #查找符合要求的字符串data=[] #保存电影信息item =str(item)#获取影片详情链接link=re.findall(findLink,item)[0]   #re库用来通过正则表达式查找指定的字符串data.append(link)    #添加链接imgSrc=re.findall(findImg,item)[0]data.append(imgSrc)  #添加图片titles=re.findall(findTitle, item)[0]if(len(titles)==2):              #片名可能有两个名字,一个中文,一个外文ctitle=titles[0]data.append(ctitle)           #添加中文名otitle=titles[1].replace("/","")data.append(otitle)            #添加外文名else:data.append(titles[0])  # 添加图片data.append(' ')            #留空,保持Excel数据一致性rating=re.findall(findRating, item)[0]data.append(rating)  # 添加评分judgeNum = re.findall(findJudge, item)[0]data.append(judgeNum)  # 添加评分人数ing = re.findall(findIng, item)if len(ing)!=0:ing=ing[0].replace("。","")data.append(ing)  # 添加概述else:data.append(" ")bd = re.findall(findBd, item)[0]bd=re.sub('<br(\s+)?/>(\s+)?'," ",bd)bd=re.sub('/'," ",bd)data.append(bd.strip())  # 添加影片的相关内容dataList.append(data)    #把处理好的电影信息放入dataListprint(dataList)return dataList# 得到指定一个URL的网页内容
def askURL(url):# head用户代理,本质上告诉浏览器我们接收什么水平的数据head={"User-Agent": "Mozilla / 5.0(Linux;Android6.0;Nexus5 Build / MRA58N) AppleWebKit / 537.36(KHTML, like Gecko) Chrome / 80.0.3987.87 Mobile Safari / 537.36"}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 htmldef saveData(savepath):print("save.....")if __name__ =="__main__":# 调用函数main()

相关文章:

  • Rust 实战练习 - 4. 网络 TCP/UDP/Channel
  • 两台电脑简单的通信过程详解(经过两个路由器,不同网段)
  • Vue js封装接口
  • Mybatis-01
  • 51单片机学习笔记10 IIC通讯和EEPROM
  • 2024/3/23 蓝桥杯
  • 洁盟、苏泊尔、希亦超声波清洗机哪家好?全方位实测对比谁更强
  • 网络七层模型:理解网络通信的架构(〇)
  • Spring 面试——restcontroller/requestmapping
  • git新建一个项目如何合并其他项目
  • 异步引入组件
  • 机器学习 - 神经网络分类
  • 【牛客】SQL146 0级用户高难度试卷的平均用时和平均得分
  • HashMap---数据结构
  • 开发npm上传发布
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2018一半小结一波
  • Docker容器管理
  • Git学习与使用心得(1)—— 初始化
  • java小心机(3)| 浅析finalize()
  • JWT究竟是什么呢?
  • node.js
  • Quartz初级教程
  • Sass 快速入门教程
  • SQLServer之创建显式事务
  • TCP拥塞控制
  • webpack+react项目初体验——记录我的webpack环境配置
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 小程序01:wepy框架整合iview webapp UI
  • 异步
  • Hibernate主键生成策略及选择
  • 带你开发类似Pokemon Go的AR游戏
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #13 yum、编译安装与sed命令的使用
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (cljs/run-at (JSVM. :browser) 搭建刚好可用的开发环境!)
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (zz)子曾经曰过:先有司,赦小过,举贤才
  • (一)为什么要选择C++
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)树状数组
  • (状压dp)uva 10817 Headmaster's Headache
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET框架
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .php文件都打不开,打不开php文件怎么办
  • @软考考生,这份软考高分攻略你须知道
  • [100天算法】-不同路径 III(day 73)
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BZOJ4010]菜肴制作
  • [CentOs7]图形界面