【python爬虫】爬虫编程技术的解密与实战

​🌈个人主页:Sarapines Programmer
🔥 系列专栏: 爬虫】网络爬虫探秘
⏰诗赋清音:云生高巅梦远游, 星光点缀碧海愁。 山川深邃情难晤, 剑气凌云志自修。

目录

🌼实验目的

🌷实验要求 

🏵️实验代码

🌿1. 爬取并下载当当网某一本书的网页内容

🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值

🌿3. 从长沙房产网爬取长沙某小区的二手房信息

🌾实验结果

🌿1. 爬取并下载当当网某一本书的网页内容

🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值

🌿3. 从长沙房产网爬取长沙某小区的二手房信息

🌺实验体会

📝总结


🌼实验目的

  • Jupyter Notebook编程工具基本用法:

    • 学习掌握Jupyter Notebook编程工具的基本用法。
  • Python读取CSV文件:

    • 理解并熟悉使用Python编程语言读取CSV文件的方法。
  • 学习使用爬虫:

    • 通过学习,熟悉爬虫技术的使用,掌握在Python环境下进行网络爬取的基本知识和技能。

🌷实验要求 

  1. 爬取并下载当当网某一本书的网页内容: 通过编写Python代码,实现对当当网上某一本书的网页内容进行爬取,并将其保存为HTML格式,这涉及到网络爬虫技术的应用。

  2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值: 运用自学的正则表达式技能,爬取豆瓣网上某本书的前50条短评内容,并计算这些评分的平均值,为数据分析提供基础。

  3. 从长沙房产网爬取长沙某小区的二手房信息: 以名都花园为例,通过网络爬虫技术从长沙房产网(长沙链家网)上获取该小区的二手房信息,并将这些信息保存到EXCEL文件中,为房产数据的整理和分析提供便利


🏵️实验代码

🌿1. 爬取并下载当当网某一本书的网页内容
import urllib.request    
#做爬虫时要用到的库#定义百度函数  
def dangdang_shuji(url,begin_page,end_page):  #三个参数: 链接+开始页数+结束页数  for i in range(begin_page, end_page+1):  #从开始页数到结束页数,因为range性质所以要想到达end_page得到达end_page+1sName = str(i).zfill(5) + '.html'     #填充为.html文件名#zfill(5)表示数字前自动补0,加上字符转化的整型i一共占五位print ('正在下载第' + str(i) + '个网页,并将其存储为' + sName + '......')  #显示爬虫细节f = open(sName,'wb+')        #w+以纯文本方式读写,而wb+是以二进制方式进行读写              m = urllib.request.urlopen(url+str(i)) .read()  #urllib.request请求模块#urlopen实现对目标url的访问#可用参数#url:  需要打开的网址#data:Post提交的数据#timeout:设置网站的访问超时时间f.write(m)  f.close()#调用部分
bdurl = str(input('请输入您在当当网上搜索的关于某本书的网页地址:'))
# 注意输入网址 https://book.dangdang.com/
begin_page = int(input(u'请输入开始的页数:\n')) 
#将输入的字符串类型转化为整型
end_page = int(input(u'请输入终点的页数:\n'))  
#同上
dangdang_shuji(bdurl,begin_page,end_page)    
#调用函数
🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值
import requests, re, time  
#获取响应时间与超时
count = 0
i = 0
sum, count_s = 0, 0
while(count < 50):#访问前50条记录if(i==0):#首页内容try:proxies = {'http': '120.236.128.201:8060','https': '120.236.128.201:8060'}headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}url = 'https://book.douban.com/subject/3674537/comments/?limit=20&status=P&sort=score'r = requests.get(url=url,headers=headers)except Exception as err:print(err)#打印输出错误信息break#其他页的内容else:start = i*20#url中start的值try:proxies = {'http': '120.236.128.201:8060','https': '120.236.128.201:8060'}headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}url='https://book.douban.com/subject/3674537/comments/?start='+str(start)+'&limit=20&status=P&sort=score'r = requests.get(url=url,headers=headers)# print('第'+str(i)+'页内容')except Exception as err:print(err)breaksoup = BeautifulSoup(r.text, 'lxml')# comments = soup.find_all('p', 'comment-content')#查找所有tag值为p,class标签为comment-content的内容comments = soup.find_all('span', class_='short')for item in comments:count = count + 1# print(count, item.string)print(count,item.get_text())#打印用户评论if count == 50:break pattern = re.compile('<span class="user-stars allstar(.*?) rating"')#以正则表达式匹配网页中的内容p = re.findall(pattern, r.text)for star in p:count_s = count_s + 1sum += int(star)time.sleep(5)# 停顿5秒再开始i += 1
if count == 50:print("\n平均分:",sum / count_s)import requests, re, time  
#获取响应时间与超时
from bs4 import BeautifulSoup 
#html的解析器,主要功能是解析和提取数据
def douBan():score_list=[]   #用于存储得分import urllib  #做爬虫时要用到的库count=0i=0while(count<50):  #求50条评价记录#首页内容if(i==0):try:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}url = 'https://movie.douban.com/subject/35437938/comments?limit=20&status=P&sort=new_score'r = requests.get(url=url,headers=headers)except Exception as err:#返回报错的原因print(err)break#非首页内容else:start = i*20#url中start的值try:headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}url='https://movie.douban.com/subject/35437938/comments?start='+str(start)+'&limit=20&status=P&sort=new_score'r = requests.get(url=url,headers=headers)# requests.get表示向服务器请求数据,服务器返回的结果是个Response对象except Exception as err:print(err)breakreq=urllib.request.Request(url,headers=headers)#Request:构造一个基本的请求。headers可以模拟浏览器,url为目的网址#urllib.request 模块提供了最基本的构造 HTTP 请求的方法,利用它可以#模拟浏览器的一个请求发起过程,同时它还带有处理 authenticaton (授权验证),#redirections (重定向), cookies (浏览器Cookies)以及其它内容response=urllib.request.urlopen(req)#urllib.request.urlopen(url, data=None, [timeout,]*, cafile=None, capath=None, cadefault=False, context=None)。#参数解释:#url:请求网址#data:请求时传送给指定url的数据,当给出该参数时,请求方式变为POST,未给出时为GET。#timeout:设定超时时间。如果在设定时间内未获取到响应,则抛出异常。#cafile, capath分别为CA证书及其路径html=response.read().decode("utf-8")#以utf-8方式读取爬取网页的内容bs=BeautifulSoup(html,"html.parser") #beautifulSoup:提取html对象中的内容items=bs.find_all("div",class_="comment-item")findScore=re.compile('<span class="allstar(.*?) rating"')#匹配星级findName=re.compile('<img alt="(.*?)"')#正则表达式的字符串形式匹配电影名字for item in items:item=str(item)#找出对应的五十个电影的得分score=re.findall(findScore,item)[0]score=float(score)score_list.append(score)#将得分存放在score_list列表中count+=1#计数器加1,当计数器大于等于50则结束循环if(count>=50):breaki+=1#下一页time.sleep(5) # 停顿5秒print("评分表  :  ",score_list)#计算平均分length=len(score_list)print("一共%d条信息"%length)sum_score=0#计算总和,然后求平均分for i in score_list:sum_score+=iavg=sum_score/lengthprint("豆瓣前50评价 总分为:",sum_score,"平均分:",avg)
#调用函数
douBan()
🌿3. 从长沙房产网爬取长沙某小区的二手房信息
import requests as requ
import requests
#获取响应时间与超时
from bs4 import BeautifulSoup
#html的解析器,主要功能是解析和提取数据
import xlwt
#xlwt将数据和样式信息写入excel表格的库def getHouseList(url):"获取房源信息:标题、链接地址、户型、面积、朝向、总价、所属区域、套内面积"house =[]headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}   #解析内容res = requests.get(url,headers=headers)soup = BeautifulSoup(res.content,'html.parser')housename_divs = soup.find_all('div',class_='title')#查找该html网页中tag值为div、class值为title的部分#指定属性查找标签for housename_div in housename_divs:housename_as=housename_div.find_all('a')#参数解释:在原网页中,div标志下有一个叫"a"的超链接。所以次数找tag值为a的元素#返回值:对象数组,对象内容为a超链接中的属性)for housename_a in housename_as:housename=[]housename.append(housename_a.get_text())#得到超链接中的文字内容,放在housename列表中housename.append(housename_a.get('href'))house.append(housename)#获取超链接中的链接,放在house列表中huseinfo_divs = soup.find_all('div',class_='houseInfo')#参数解释:获取该网页中tag值为div,class值为houseInfofor i in range(len(huseinfo_divs)):info = huseinfo_divs[i].get_text()#获取houseInfo中的标题infos = info.split('|')#原网页以|符号分割的,这里以此做分割#小区名称house[i].append(infos[0])#户型house[i].append(infos[1])#平米house[i].append(infos[2])house_prices = soup.find_all('div',class_='totalPrice')#函数作用:获取网页中tag值为div,且class值为totalPrice的内容for i in range(len(house_prices)):price = house_prices[i].get_text()#获取文字内容house[i].append(price)return house#爬取房屋详细信息:所在区域、套内面积
def houseinfo(url):#为什么要分为两个函数?因为这个网页中,输入一个url只是得到一些基本信息#而详细信息需要到从基本信息中的链接再去提取headers = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/21.0.1180.71 Safari/537.1 LBBROWSER'}res = requests.get(url,headers=headers)soup = BeautifulSoup(res.content,'html.parser')#headers、res、soup与getHouseList()函数中一致。基本上可以作为固定不变的部分msg =[]#获取房源的所在区域areainfos = soup.find_all('span',class_='info')#获取网页中tag值为span,class为info的内容(以具体网页内容为准)for areainfo in areainfos:#只需要获取第一个a标签的内容即可area = areainfo.find('a')#找到tag值为a(超链接)的内容。返回一个对象数组#具体内容为:herf、target、textif(not area):#如果area为nullcontinue#如果没有这部分信息就跳过hrefStr = area['href']#提取该房源的链接if(hrefStr.startswith('javascript')):continuemsg.append(area.get_text())#获取房源所在的地区名称break#由于只需要获取第一个a标签的内容,所以此时就可以跳出循环#根据房屋户型计算套内面积infolist = soup.find_all('div',id='infoList')#获取tag值为div,id为infolist的内容#注意网站标注的总面积与实际的套内面积是不一样的,所以需要重新计算num = []for info in infolist:cols = info.find_all('div',class_='col')#网站中包含col列的有很多,包括面积、方位、名称等等#老师的方法是遍历所有的col,#我觉得更好的方法是将包含平米的col单独提取出来,这样就无需使用tryfor i in cols:pingmi = i.get_text()#获取标题(面积,即xxx平米)try:#尝试从string中提取数字a = float(pingmi[:-2])#从开头到距离尾部2个字符,即把"平米"汉字去掉了num.append(a)except ValueError:#如果出错就跳出continuemsg.append(sum(num))#计算各户型的总面积return msgdef writeExcel(excelPath,houses):"#将爬取数据写入excel文件"#excelPath:excel文件存储的路径,houses:包含房源基本信息的列表workbook = xlwt.Workbook()#函数作用:新建一个工作簿sheet = workbook.add_sheet('git')#添加一行row0=['标题','链接地址','户型','面积','朝向','总价','所属区域','套内面积']for i in range(0,len(row0)):sheet.write(0,i,row0[i])#作为excel表列索引for i in range(0,len(houses)):house = houses[i]print(house)for j in range(0,len(house)):sheet.write(i+1,j,house[j])#数据写完一行接上一行workbook.save(excelPath)#将excel工作簿保存到指定位置#主函数
def main():data = []for i in range(1,5):print('-----分隔符',i,'-------')#i从1到4if i==1:url ='https://cs.lianjia.com/ershoufang/c3511059937033rs%E5%90%8D%E9%83%BD%E8%8A%B1%E5%9B%AD/'#此时i=1时url指向该地址else:url='https://cs.lianjia.com/ershoufang/pg'+str(i)+'c3511059937033rs%E5%90%8D%E9%83%BD%E8%8A%B1%E5%9B%AD/'#i不等于1时url执行不同位置houses =getHouseList(url)for house in houses:link = house[1]if(not link or not link.startswith('http')):#无法连接或连接协议不是http,使用continue跳出循环continuemianji = houseinfo(link)house.extend(mianji)data.extend(houses)#将数据整合到daya里统一写入excel表writeExcel('d:/cs.xls',data)if __name__ == '__main__':main()#如果模块是被直接运行的,则代码块被运行,#如果模块是被导入的,则代码块不被运行

🌾实验结果

🌿1. 爬取并下载当当网某一本书的网页内容


🌿2. 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值


🌿3. 从长沙房产网爬取长沙某小区的二手房信息


🌺实验体会

  1. 实验学习和爬虫指令使用

    • 通过实验首次接触了使用Python进行爬虫,学到了相关爬虫指令,并成功爬取了当当网和长沙二手房的信息。
    • 发现在Linux系统下使用cat语法访问.csv文件,而在Windows系统下要使用type,需要注意斜线的差异。
  2. 对Python库的认识和意识拓展

    • 在此实验中,通过社区查阅了相关资源,附上了详细注释,深化了对爬虫的理解。
    • 意识到Python语言的强大之处,不论是机器学习的scikit-learn库还是爬虫的requests库,都涉及到Python,并体会到其调用封装在不同的库中。
  3. 爬虫问题解决和环境疑惑

    • 遇到在Jupyter Notebook中出现‘int’ object is not callable的问题,通过重新创建文件解决,但对问题原因产生疑惑。
    • 怀疑问题可能与装了PyTorch导致与Python两个虚拟环境冲突,但并未做实质修改,问题自行解决,留下疑惑。

📝总结

Python领域就像一片未被勘探的信息大海,引领你勇敢踏入Python数据科学的神秘领域。这是一场独特的学习冒险,从基本概念到算法实现,逐步揭示更深层次的模式分析、匹配算法和智能模式识别的奥秘。

渴望挑战Python信息领域的技术?不妨点击下方链接,一同探讨更多Python数据科学的奇迹吧。我们推出了引领趋势的💻 Python数据科学专栏:【爬虫】网络爬虫探秘,旨在深度探索Python模式匹配技术的实际应用和创新。🌐🔍

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648138.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字孪生系统的难点

数字孪生系统的开发和实施涉及一些技术难点&#xff0c;这些难点需要综合应用多个领域的知识和技术来克服。以下是一些数字孪生系统开发中的技术难点&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1…

【每日一题】4.LeetCode——杨辉三角

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ &#x1f64f;小杨水平有限&#xff0c;欢迎各位大佬指点&…

监听元素宽高变化---new ResizeObserver

参考&#xff1a;ResizeObserver API详解-CSDN博客 有的时候需要监听某个元素的宽高变化&#xff0c;这个时候可以使用JS的 resizeObserver 钩子函数。 用于监视元素的大小变化。它可以观察一个或多个 DOM 元素&#xff0c;以便在元素的大小或形状发生变化时触发回调函数。R…

安全用电管理平台方案介绍——Acrelcloud-6000

安全用电管理平台是一个针对电力系统安全管理的平台&#xff0c;旨在提供对电力设备和用电行为进行监控、分析和管理的解决方案。该平台结合了物联网技术、数据分析和远程监控等技术手段&#xff0c;能够实时监测、分析和预警电力系统的安全状况&#xff0c;以便及时采取措施防…

广州工业元宇宙赋能新型工业化,推动工业制造业数字化转型发展

随着科技的飞速发展&#xff0c;新型工业化的概念逐渐成为全球关注的焦点。在数字化转型的浪潮中&#xff0c;工业制造业的发展面临着巨大的机遇和挑战。广州作为中国南方的重要工业基地&#xff0c;积极探索工业元宇宙的赋能作用&#xff0c;以推动工业制造业的数字化转型发展…

[蓝桥学习] 前缀和与差分

前缀和原理 特点 求区间和 如果要实现一边修改一边查询&#xff0c;需要使用树状树组和线段树。 例题 题目很简单&#xff0c;但是代码实现惊艳到我了&#xff0c;是L就加1&#xff0c;是Q就减1&#xff0c;如果区间 [i,j] 是平衡子串的话&#xff0c;那它会在前缀prefix i …

基于Kubernetes(K8s)构建企业容器云基础运行环境

cncfstack 新 文章上线&#xff1a; 书名&#xff1a;《云原生解决方案》 地址&#xff1a;https://zhaowenyu.com/cncf-solution 访问&#xff1a;文章底部“阅读原文”或访问域名 云原生计算是云计算发展新的里程碑阶段&#xff0c;是当今与未来很长一段时间中 IT 发展的技…

【学网攻】 第(10)节 -- 路由器单臂路由配置

系列文章目录 目录 系列文章目录 文章目录 前言 一、单臂路由是什么&#xff1f; 二、实验 1.引入 实验拓扑图 PC配置 Sw配置 Router配置 实验验证 总结 文章目录 【学网攻】 第(1)节 -- 认识网络【学网攻】 第(2)节 -- 交换机认识及使用【学网攻】 第(3)节 -- 交…

【医学图像隐私保护】PLAN方法:解决 GAN 生成医学图像 Latent 空间中的隐私保护

PLAN方法&#xff1a;解决 GAN 生成医学图像 Latent 空间中的隐私保护方法 PLAN 原理StyleGAN 生成视网膜图k-SALSA 生成视网膜图PLAN方法 生成视网膜图 总结 PLAN 原理 论文&#xff1a;https://arxiv.org/abs/2307.02984 代码&#xff1a;https://github.com/perceivelab/P…

电商价格监测准确率如何保证

品牌做电商价格监测的前提是为了找出网络渠道中的破价链接&#xff0c;只有精准到筛选出破价链接&#xff0c;才能进行针对性的治理&#xff0c;比如经销渠道&#xff0c;只有当品牌拿出其破价的证据&#xff0c;才能对授权渠道进行规则管控&#xff0c;非授权渠道也是如此&…

HTML5与App封装技术将网站一键打包成App

HTML5&#xff1a;跨平台的利器HTML5作为一种先进的网页标记语言&#xff0c;其最大的优势在于跨平台性。开发者仅需编写一次代码&#xff0c;即可在各种操作系统和设备上运行&#xff0c;无需为每个平台单独开发App。这种“编写一次&#xff0c;运行处处”的模式&#xff0c;大…

系统架构15 - 软件工程(3)

软件过程模型 瀑布模型特点缺点 原型化模型特点两个阶段不同类型注意 螺旋模型V 模型特点 增量模型特点 喷泉模型基于构件的开发模型(CBSD)形式化方法模型敏捷模型特点“适应性” (adaptive) 而非“预设性” (predictive)“面向人的” (People-oriented) 而非“面向过程的” (P…

如何使用 WebRTC 与 Kurento 建立视频会议 App

本文作者 WebRTC Ventures 工程师。在 RTC 2018 实时互联网大会上&#xff0c;WebRTC Ventures 的资深软件工程师&#xff0c;将围绕 WebRTC 开发带来经验分享。欢迎访问RTC 开发者社区&#xff0c;与更多WebRTC开发者交流经验。 了解 WebRTC 如何工作的一种简单方式是通过学习…

golang入门

学习方法 1、在实践中学 2、适当的囫囵吞枣&#xff0c;有可能学到后面&#xff0c;对前面的疑问焕然大悟 3、注重整体&#xff0c;刚开始不要去扣细节 安装 需要配置3个环境变量&#xff0c;如果.msi文件安装时设置好了就不需要了&#xff0c;自己可以检查下 GOROOT&…

VUE--VUEX

一、什么是Vuex Vuex就是一个vue的状态&#xff08;数据&#xff09;管理工具&#xff0c;是vue项目实现大范围数据共享的技术方案。能够方便、高效的实现组件之间的数据共享。 Vuex的好处&#xff1a; &#xff08;1&#xff09;数据的存储一步到位&#xff0c;不需要层层传递…

权威媒体报道 | 百分点科技谈“数据要素×”

近日&#xff0c;国家数据局等17部门联合印发《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》&#xff0c;引起广泛关注&#xff0c;作为数据要素技术厂商代表&#xff0c;百分点科技CTO刘译璟接受经济日报、中国高新技术产业导报采访&#xff0c;结合产业现…

<蓝桥杯软件赛>零基础备赛20周--第17周--并查集

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

《微信小程序开发从入门到实战》学习九十三

7.1 视图容器组件 7.1.3 swiper与swiper-item组件 swiper组件的显示效果如下图所示&#xff1a; indicator-dots、indicator-color和indicator-active-color三个属性用于设置swiper组件下方的指示点。设置指示点的颜色时&#xff0c;可以使用HexColor&#xff0c;也可以使用r…

读懂比特币—bitcoin代码分析(五)

今天的代码分析主要是 bitcoin/src/init.cpp 文件中的三个函数&#xff1a;AppInitSanityChecks、AppInitLockDataDirectory、AppInitInterfaces&#xff0c;下面我们来说明这三个函数是用来干什么的&#xff0c;并逐行解读函数代码&#xff0c;先贴出源代码如下&#xff1a; …

C++ 程序使用 OpenCV 库来创建一个图像金字塔,然后将这些图像合并成一张大图

文章目录 源码文件功能解读编译文件 源码文件 #include <iostream> #include <vector> #include <string> #include <opencv2/opencv.hpp>int main() {// 这里应该有代码来生成或加载一系列图像到 imagePyramidstd::vector<cv::Mat> imagePyram…