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 相关文章推荐
python实现360的字符显示界面
Feb 21 Python
python多线程用法实例详解
Jan 15 Python
利用Python中的mock库对Python代码进行模拟测试
Apr 16 Python
python实现指定字符串补全空格的方法
Apr 30 Python
Python编写Windows Service服务程序
Jan 04 Python
Python生成器generator用法示例
Aug 10 Python
python3 实现验证码图片切割的方法
Dec 07 Python
Python 函数返回值的示例代码
Mar 11 Python
Python稀疏矩阵及参数保存代码实现
Apr 18 Python
python如何将图片转换素描画
Sep 08 Python
python两种获取剪贴板内容的方法
Nov 06 Python
Pandas自定义选项option设置
Jul 25 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
实现树状结构的两种方法
2006/10/09 PHP
PHP下几种删除目录的方法总结
2007/08/19 PHP
PHP将两个关联数组合并函数提高函数效率
2014/03/18 PHP
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
跨域表单提交状态的变相判断代码
2009/11/12 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
JSON.stringify 语法实例讲解
2012/03/14 Javascript
ActiveX控件与Javascript之间的交互示例
2014/06/04 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
浅谈JavaScript正则表达式分组匹配
2015/04/10 Javascript
jQuery实现字符串全部替换的方法
2016/12/12 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
ajax 提交数据到后台jsp页面及页面跳转问题
2017/01/19 Javascript
vue-router2.0 组件之间传参及获取动态参数的方法
2017/11/10 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
JavaScript实现读取与输出XML文件数据的方法示例
2018/06/05 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
[52:37]完美世界DOTA2联赛循环赛 Forest vs DM BO2第一场 10.29
2020/10/29 DOTA
Python常用列表数据结构小结
2014/08/06 Python
python 处理dataframe中的时间字段方法
2018/04/10 Python
解决phantomjs截图失败,phantom.exit位置的问题
2018/05/17 Python
Python Web编程之WSGI协议简介
2018/07/18 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
python实现图片素描效果
2020/09/26 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
推荐10个HTML5响应式框架
2016/02/25 HTML / CSS
台湾租车首选品牌:IWS艾维士租车
2019/05/03 全球购物
草莓网官网:StrawberryNET
2019/08/21 全球购物
恐龙的灭绝教学反思
2014/02/12 职场文书
财务主管岗位职责
2014/02/28 职场文书
食堂采购员岗位职责
2014/03/17 职场文书
计算机专业毕业生求职信
2014/04/30 职场文书
投标授权委托书范文
2014/08/02 职场文书
创先争优活动党员公开承诺书
2014/08/29 职场文书
在 Golang 中实现 Cache::remember 方法详解
2021/03/30 Python