大数跨境
0
0

只要三招,学会简单网站爬虫全部技能!

只要三招,学会简单网站爬虫全部技能! 数据分析与统计学之美
2022-08-09
1

大家好,我是黄同学🧐

今天分享收藏三个爬虫网站的小技能,希望对你们有所帮助~

  1. 查看网页源代码和检查元素

  2. requests使用

  3. BeautifulSoup使用





查看网页源代码和检查元素

不要觉得很简单,这两招是爬虫的基础。如果你熟悉这两招,简单网站的爬虫,你就学会了一半。

一般来说,检查元素中看到的内容都会在网页源代码中出现。今天我选取的这个例子,情况特殊,检查元素中看到的内容部分会在网页源代码中出现

比如爬北京的白天和夜间温度


北京天气的网址:

http://www.weather.com.cn/weather1d/101010100.shtml


下面是源代码,我会有注释的,跟着一起读一读

Talk is cheap. Show you the code

# -*- coding: utf-8 -*-

__author__ = 'duohappy'

import requests # 导入requests模块

from bs4 import BeautifulSoup # 从bs4包中导入BeautifulSoup模块

# 设置请求头

# 更换一下爬虫的User-Agent,这是最常规的爬虫设置

headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/57.0.2987.110 Safari/537.36'}

# 需要爬取的网址

url ="http://www.weather.com.cn/weather1d/101010100.shtml"

# 发送请求,获取的一个Response对象

web_data = requests.get(url,headers=headers)

# 设置web_data.text会采用web_data.encoding指定的编码,一般情况下不需要设置,requests会自动推断

# 鉴于网页大部分都是采取utf-8编码的,所以设置一下,省去一些麻烦

web_data.encoding = 'utf-8'

# 得到网页源代码

content = web_data.text

# 使用lxml解析器来创建Soup对象

soup = BeautifulSoup(content, 'lxml')

# 为什么要创建一个Soup对象,还记得浏览器中的检查元素功能嘛

# Soup对象可以方便和浏览器中检查元素看到的内容建立联系,下面会有动画演示

# 使用css selector语法,获取白天和夜间温度,下面有动画演示

tag_list = soup.select('p.tem span')

# tag_list[0]是一个bs4.element.Tag对象

# tag_list[0].text获得这个标签里的文本

day_temp = tag_list[0].text

night_temp = tag_list[1].text

print('白天温度为{0}℃n晚上温度为{1}℃'.format(day_temp, night_temp))

"Soup对象可以方便和浏览器中检查元素看到的内容建立联系"是什么意思?

简单点解释就是检查元素看到的样子和Soup对象中元素的样子差不多(这只是简单化理解)




  • css seletor语法

值得提出的是当搜索'p.temem'时,刚好有2个匹配的对象,分别对应白天温度和夜间温度,这一点非常重要,如果匹配个数大于或者小于2,那么说明你的css selector写错了!

爬多个城市的白天和夜间温度,搜索不同的城市天气,观察网址的变化。观察网址的变化是爬虫中最主要的本领之一~

# -*- coding: utf-8 -*-

__author__ = 'duohappy'

import requests

from bs4 import BeautifulSoup

headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/57.0.2987.110 Safari/537.36'}

# 建立城市和网址特殊部分的对应关系

weather_code = {'北京':'101010100','上海':'101020100','深圳':'101280601', '广州':'101280101', '杭州':'101210101'}

city = input('请输入城市名:') # 仅仅能输入北京,上海,广州,深圳,杭州

url ="http://www.weather.com.cn/weather1d/{}.shtml".format(weather_code[city])

web_data = requests.get(url,headers=headers)

web_data.encoding = 'utf-8'

content = web_data.text

soup = BeautifulSoup(content, 'lxml')

tag_list = soup.select('p.tem span')

day_temp = tag_list[0].text

night_temp = tag_list[1].text

print('白天温度为{0}℃n晚上温度为{1}℃'.format(day_temp, night_temp))




BeautifulSoup

BeautifulSoup是一个Python提供的一个第三方HTML网页解析工具包。对于一个网址,可以使用beautifulSoup对象的成员函数,直接找到相应的组件内容。对于像文本、资讯这样的内容,往往都是直接写进网页文本代码的。利用Google浏览器的开发者工具,我们可以直接阅读网页源码:



可以使用右边那个小箭头直接定位到需要爬取的位置,就可以发现这些资讯都直接写在右边的源码当中。文字类资讯也不需要实时更新,也没有方便的数据维护方式。


使用bs对象进行find和处理,因此我们可以写出一个简单的代码:


1.bs = BeautifulSoup(html_news,'html.parser')

2.title = bs.find('h1').text

3.content= bs.find('div',class_='content-article').text //注意参数带下划线

4.content_str = "".join(re.findall('[0-9\u4e00-\u9fa5]', content))


但是我们可以看到,所有的段落都是在p组件里面的,那么代码也可以这样写:代码如下(示例):


1.cur_str = ""

2.bs = BeautifulSoup(html_news,'html.parser')

3.title = bs.find('h1').text

4.paras = bs.find_all('p',class_='one-p') //返回一个列表

5.for para in paras:

6.cur_str += "".join(re.findall('[0-9\u4e00-\u9fa5]', para.text))


这里使用了正则表达式来提取文字和数字。特别注意的是,find函数找到的是一个元素,而find_all返回的则是一个列表。re.find_all找到的也是一个列表,返回的时候要用””.join来拼接为一个字符串。实际上,BeautifulSoup的底层就是正则表达式,因此在成员函数上也很像。

推荐"经典原创"文章    点击标题可跳转

0. 深度对比Python4大文件/文件夹处理库!
1. Python快速实现分列转到行!
2. 全网讲解 "Python编码" 最全的教程了!
3. 手把手制作 "签名设计" 的Tkinter图形界面!
4. pprint漂亮的打印,强烈推荐大家学习这个库!
5. 纯肝货,详解Tkinter图形化界面"制作"流程!
6. 有了这款Python神器,新手也会调试代码!
7. Pandas与openpyxl库的 "完美" 融合!
8. Python提取PDF简历中的信息,写入Excel
9. Linux系列:完美收官,一共22个课时!
10. Python操作MySQL数据库!
11. 一个「神奇」的Python库,99%的人都爱!

【声明】内容源于网络
0
0
数据分析与统计学之美
免费领10w字"Python知识手册",共400页,后台回复“十万”领取!
内容 1080
粉丝 0
数据分析与统计学之美 免费领10w字"Python知识手册",共400页,后台回复“十万”领取!
总阅读210
粉丝0
内容1.1k