Python爬取网页信息的示例


Posted in Python onSeptember 24, 2020

Python爬取网页信息的步骤

以爬取英文名字网站(https://nameberry.com/)中每个名字的评论内容,包括英文名,用户名,评论的时间和评论的内容为例。

1、确认网址

在浏览器中输入初始网址,逐层查找链接,直到找到需要获取的内容。

在打开的界面中,点击鼠标右键,在弹出的对话框中,选择“检查”,则在界面会显示该网页的源代码,在具体内容处点击查找,可以定位到需要查找的内容的源码。

注意:代码显示的方式与浏览器有关,有些浏览器不支持显示源代码功能(360浏览器,谷歌浏览器,火狐浏览器等是支持显示源代码功能)

步骤图:

1)首页,获取A~Z的页面链接

Python爬取网页信息的示例

Python爬取网页信息的示例

2)名字链接页,获取每个字母中的名字链接(存在翻页情况)

Python爬取网页信息的示例

3)名字内容页,获取每个名字的评论信息

Python爬取网页信息的示例

2、编写测试代码

1)获取A~Z链接,在爬取网页信息时,为了减少网页的响应时间,可以根据已知的信息,自动生成对应的链接,这里采取自动生成A~Z之间的连接,以pandas的二维数组形式存储

def get_url1():
 urls=[]
 # A,'B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'
 a=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
#自动生成A~Z的链接
 for i in a:
  urls.append("https://nameberry.com/search/baby_names_starting_with/%s" %i)
 dp=pd.DataFrame(urls)
 dp.to_csv("A~Z_Link1.csv",mode="a",encoding='utf_8_sig')

#循环用于在每个字母链接下,调用爬取名字链接的页面的函数,即函数嵌套
 for j in urls:
  get_pages_Html(j)
 return urls

2)获取名字链接,根据网页源码分析出包含名字链接的标签,编写代码,名字链接用直接存储的方式存储,方便读取名字链接进行对名字的评论内容的获取

#获取页数
def get_pages_Html(url1):
 req = requests.get(url1)
 soup=BeautifulSoup(req.text)
#异常处理,为解决页面不存在多页的问题,使用re正则表达式获取页面数
 try:
  lastpage = soup.find(class_="last").find("a")['href']
  str1='{}'.format(lastpage)
  b=re.findall('\\d+', str1 )
  for page in b:
   num=page
 except:
  num=1
 get_pages(num,url1)
 return num

def get_pages(n,url):
 pages=[]
 for k in range(1,int(n)+1):
  pages.append("{}?page={}".format(url,k))
 dp=pd.DataFrame(pages)
 dp.to_csv("NUM_pages_1.csv",mode="a",encoding='utf_8_sig')
  #函数调用
 for l in pages:
  parse_HTML2(l)
 return pages


# 名字的链接,根据网页源码的标签,确定名字链接的位置
def parse_HTML2(url2):
 try:
  req = requests.get(url2)
  req.encoding = req.apparent_encoding
  soup = BeautifulSoup(req.text)
 except:
  dp=pd.DataFrame(url2)
  dp.to_csv("Error_pages_1.csv",mode="a",encoding='utf_8_sig')
 name_data_l=[]
 error=[]
 li_list = soup.find_all('li',class_="Listing-name pt-15 pb-15 bdb-gray-light w-100pct flex border-highlight")
 try:
  for li in li_list:
   nameList=li.find('a',class_='flex-1')['href']
   name_data_l.append('https://nameberry.com/'+nameList)
   time.sleep(1)
  cun(name_data_l,'Name_List_1')
 except:
  dp=pd.DataFrame(name_data_l)
  dp.to_csv("Error_Name_List_1.csv",mode="a",encoding='utf_8_sig')
  # cun(url2,'Error_link_Q')
 # dp=pd.DataFrame(name_data_l)
 # dp.to_csv("Name_List.csv",mode="a",encoding='utf_8_sig')
 # for i in name_data_l:
 #  parse_HTML3(i)
 return name_data_l

3)获取名字评论的内容,采用字典形式写入文件

# 名字里的内容
def parse_HTML3(url3):
 count=0
 req = requests.get(url3)
 req.encoding = req.apparent_encoding
 soup = BeautifulSoup(req.text)
 error=[]
 try:
  Name=soup.find('h1',class_='first-header').find("a").get_text().replace(",","").replace("\n","")
 except:
  error.append(url3)
  cun(error,"Error_Link_Comment")
 li_list = soup.find_all('div',class_="comment")
 for li in li_list:
  Title=li.find("h4").get_text().replace(",","").replace("\n","")
  Time=li.find("p",class_='meta').get_text().replace(",","").replace("\n","")
  Comments=li.find("div",class_='comment-text').get_text().replace(",","").replace("\n","")
  dic2={
   "Name":Name,
   "Title":Title,
   "Time":Time,
   "Comments":Comments
  }
  time.sleep(1)
  count=count+1
  save_to_csv(dic2,"Name_data_comment")
  print(count)
 return 1

3、测试代码

1)代码编写完成后,具体的函数调用逻辑,获取链接时,为直接的函数嵌套,获取内容时,为从文件中读取出名字链接,在获取名字的评论内容。避免因为逐层访问,造成访问网页超时,出现异常。

如图:

Python爬取网页信息的示例

2)测试结果

Python爬取网页信息的示例

 4、小结

在爬取网页内容时,要先分析网页源码,再进行编码和调试,遵从爬虫协议(严重者会被封号),在爬取的数据量非常大时,可以设置顺序部分请求(一部分的进行爬取网页内容)。

总之,爬虫有风险,测试需谨慎!!!

以上就是Python爬取网页信息的示例的详细内容,更多关于Python爬取网页信息的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
详细介绍Ruby中的正则表达式
Apr 10 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
Django返回json数据用法示例
Sep 18 Python
Linux 下 Python 实现按任意键退出的实现方法
Sep 25 Python
Python利用正则表达式实现计算器算法思路解析
Apr 25 Python
解决python测试opencv时imread导致的错误问题
Jan 26 Python
Python数据类型之String字符串实例详解
May 08 Python
Python将string转换到float的实例方法
Jul 29 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
Django models文件模型变更错误解决
May 11 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
python实现手机推送 代码也就10行左右
Apr 12 Python
详解用python -m http.server搭一个简易的本地局域网
Sep 24 #Python
Python中的None与 NULL(即空字符)的区别详解
Sep 24 #Python
python绘制分布折线图的示例
Sep 24 #Python
PyCharm 2020.1版安装破解注册码永久激活(激活到2089年)
Sep 24 #Python
python 如何调用 dubbo 接口
Sep 24 #Python
python matplotlib绘制三维图的示例
Sep 24 #Python
python使用matplotlib:subplot绘制多个子图的示例
Sep 24 #Python
You might like
php下批量挂马和批量清马代码
2011/02/27 PHP
PHP与Java进行通信的实现方法
2013/10/21 PHP
php实现文件下载简单示例(代码实现文件下载)
2014/03/10 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
PHP 5.3和PHP 5.4出现FastCGI Error解决方法
2015/02/12 PHP
php实现数据库的增删改查
2017/02/26 PHP
php检查函数必传参数是否存在的实例详解
2017/08/28 PHP
可在线编辑网页文字效果代码(单击)
2013/03/02 Javascript
JavaScript导出Excel实例详解
2014/11/25 Javascript
简介AngularJS的视图功能应用
2015/06/17 Javascript
jquery实现简单的轮换出现效果实例
2015/07/23 Javascript
基于zepto.js简单实现上传图片
2016/06/21 Javascript
JS如何设置iOS中微信浏览器的title
2016/11/22 Javascript
微信小程序上滑加载下拉刷新(onscrollLower)分批加载数据(二)
2017/05/11 Javascript
Angular4 中内置指令的基本用法
2017/07/31 Javascript
sublime text配置node.js调试(图文教程)
2017/11/23 Javascript
JavaScript实现左侧菜单效果
2017/12/14 Javascript
python2.7的编码问题与解决方法
2016/10/04 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
2018/05/04 Python
Python中循环后使用list.append()数据被覆盖问题的解决
2018/07/01 Python
使用Flask集成bootstrap的方法
2018/07/24 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
基于Python实现全自动下载抖音视频
2020/11/06 Python
浅析css3中matrix函数的使用
2016/06/06 HTML / CSS
工程类专业自荐信范文
2014/03/09 职场文书
优秀学生党员先进事迹材料
2014/05/29 职场文书
英语课前三分钟演讲稿(6篇)
2014/09/13 职场文书
校园文化艺术节宣传标语
2014/10/09 职场文书
万能检讨书2000字
2014/10/17 职场文书
2014年质量工作总结
2014/11/22 职场文书
贪污检举信范文
2015/03/02 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
个人工作失误的保证书怎么写?
2019/06/21 职场文书
JavaScript控制台的更多功能
2021/04/28 Javascript
python实现三次密码验证的示例
2021/04/29 Python
idea下配置tomcat避坑详解
2022/04/12 Servers