爬虫(09)bs4(下) select()方法+修改文档树+天气信息案例

文章目录

  • 1. select()方法
    • 1.1 通过标签来提取
    • 1.2 通过类名来查找
    • 1.3 通过ip来查找
    • 1.4 组合提取
    • 1.5 案例
      • 1.5.1 获取所有的tr标签
      • 1.5.2 获取第二个tr标签
      • 1.5.3 获取所有class等于even的tr标签
      • 1.5.4 获取所有a标签的href属性
      • 1.5.5 获取职位信息
  • 2. 修改文档树
    • 2.1 修改tag的名称和属性
    • 2.2 修改string值
    • 2.2 append()添加值
    • 2.3 删除值
  • 3. 爬取天气信息
    • 3.1 思路分析
    • 3.2 实践步骤
      • 3.2.1 初试代码
      • 3.2.2 找寻数据
      • 3.2.3 解决两个问题
        • 3.2.3.1 省会城市名字问题
        • 3.2.3.2 港澳台地区乱码问题
      • 3.2.4 扩展功能
      • 3.3 写入csv文件
  • 4. selenium介绍

1. select()方法

我们也可以通过css选择器来提取数据,但需要我们掌握一些css语法。具体可以参考网页
css选择器参考手册。
示例代码(后面的代码都是在这个代码的基础上继续的):

from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

""" soup = BeautifulSoup(html_doc,'lxml')

1.1 通过标签来提取

# 提取并打印所有的标签a
print(soup.select('a'))

结果以列表返回所有的标签a,可以通过遍历列表取出所需元素。

[Elsie, Lacie, Tillie]

1.2 通过类名来查找

比如我们要查找所有类名为"sister"的a标签。

# 提取并打印所有class="sister"的标签
print(soup.select('.sister'))

结果以列表形式返回

[Elsie, Lacie, Tillie]

1.3 通过ip来查找

# 通过id来提取   #id
print(soup.select('#link1'))

结果

[Elsie]

1.4 组合提取

我们提取p标签下的所有a标签

# 组合标签提取
print(soup.select('p>a'))

结果以列表返回

[Elsie, Lacie, Tillie]

# 提取p标签下的id=link1的标签
print(soup.select('p #link1'))

结果

[Elsie]

选择所有p元素和a元素

# 选取所有p元素和a元素
print(soup.select('p,a'))

结果选出了所有p标签和a标签,以列表返回

[

The Dormouse's story

,

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

, Elsie, Lacie, Tillie,

...

]

选择所有p元素内的a元素

# 选取所有p元素下的a元素
print(soup.select('p a'))

结果以列表返回

[Elsie, Lacie, Tillie]

选取所有带有href属性的元素

# 选取所有带有href属性的元素
print(soup.select('[href]'))

结果以列表返回

[Elsie, Lacie, Tillie]

# 选取所有class = "sister"的元素
print(soup.select('[class=sister]'))

结果以列表返回

[Elsie, Lacie, Tillie]

# 从属性为title的标签中取出文本
print(soup.select('.title')[0].get_text())

因为print(soup.select(’.title’))返回的是列表,所以这里需要取出列表里面的元素再.get_text()。

The Dormouse's story

1.5 案例

我们把上节课的示例用select()方法操作一下

from bs4 import BeautifulSoup
html = """
职位名称 职位类别 人数 地点 发布时间
22989-金融云区块链高级研发工程师(深圳) 技术类 1 深圳 2017-11-25
22989-金融云高级后台开发 技术类 2 深圳 2017-11-25
SNG16-腾讯音乐运营开发工程师(深圳) 技术类 2 深圳 2017-11-25
SNG16-腾讯音乐业务运维工程师(深圳) 技术类 1 深圳 2017-11-25
TEG03-高级研发工程师(深圳) 技术类 1 深圳 2017-11-24
TEG03-高级图像算法研发工程师(深圳) 技术类 1 深圳 2017-11-24
TEG11-高级AI开发工程师(深圳) 技术类 4 深圳 2017-11-24
15851-后台开发工程师 技术类 1 深圳 2017-11-24
15851-后台开发工程师 技术类 1 深圳 2017-11-24
SNG11-高级业务运维工程师(深圳) 技术类 1 深圳 2017-11-24
""" soup_2 = BeautifulSoup(html,'lxml')

1.5.1 获取所有的tr标签

# 获取所有的tr标签
print(soup_2.select('tr'))

结果以列表返回

[
职位名称
职位类别
人数
地点
发布时间
, 
22989-金融云区块链高级研发工程师(深圳)
技术类
1
深圳
2017-11-25
, 
22989-金融云高级后台开发
技术类
2
深圳
2017-11-25
, 
SNG16-腾讯音乐运营开发工程师(深圳)
技术类
2
深圳
2017-11-25
, 
SNG16-腾讯音乐业务运维工程师(深圳)
技术类
1
深圳
2017-11-25
, 
TEG03-高级研发工程师(深圳)
技术类
1
深圳
2017-11-24
, 
TEG03-高级图像算法研发工程师(深圳)
技术类
1
深圳
2017-11-24
, 
TEG11-高级AI开发工程师(深圳)
技术类
4
深圳
2017-11-24
, 
15851-后台开发工程师
技术类
1
深圳
2017-11-24
, 
15851-后台开发工程师
技术类
1
深圳
2017-11-24
, 
SNG11-高级业务运维工程师(深圳)
技术类
1
深圳
2017-11-24
]

1.5.2 获取第二个tr标签

print(soup_2.select('tr')[1])

结果


22989-金融云区块链高级研发工程师(深圳)
技术类
1
深圳
2017-11-25

1.5.3 获取所有class等于even的tr标签

# 获取所有class等于even的tr标签
trs = soup_2.select('.even')
for tr in trs:
    print(tr)

结果


22989-金融云区块链高级研发工程师(深圳)
技术类
1
深圳
2017-11-25


SNG16-腾讯音乐运营开发工程师(深圳)
技术类
2
深圳
2017-11-25


TEG03-高级研发工程师(深圳)
技术类
1
深圳
2017-11-24


TEG11-高级AI开发工程师(深圳)
技术类
4
深圳
2017-11-24


15851-后台开发工程师
技术类
1
深圳
2017-11-24

1.5.4 获取所有a标签的href属性

# 获取所有a标签的href属性
a_lst= soup_2.select('a')
for a in a_lst:
    # href = a['href']
    href = a.get('href')
    print(href)

结果

position_detail.php?id=33824&keywords=python&tid=87&lid=2218
position_detail.php?id=29938&keywords=python&tid=87&lid=2218
position_detail.php?id=31236&keywords=python&tid=87&lid=2218
position_detail.php?id=31235&keywords=python&tid=87&lid=2218
position_detail.php?id=34531&keywords=python&tid=87&lid=2218
position_detail.php?id=34532&keywords=python&tid=87&lid=2218
position_detail.php?id=31648&keywords=python&tid=87&lid=2218
position_detail.php?id=32218&keywords=python&tid=87&lid=2218
position_detail.php?id=32217&keywords=python&tid=87&lid=2218
position_detail.php?id=34511&keywords=python&tid=87&lid=2218

1.5.5 获取职位信息

# 获取职位信息
trs = soup_2.select('tr')[1:] # 因为第一个tr标签内无职位信息,故过滤掉。
for tr in trs:
    pos_info = list(tr.stripped_strings) # 由于tr.stripped_strings返回的是一个生成器,所以这里需要转化为列表才能提取其中的元素
    print(pos_info[0])

结果

22989-金融云区块链高级研发工程师(深圳)
22989-金融云高级后台开发
SNG16-腾讯音乐运营开发工程师(深圳)
SNG16-腾讯音乐业务运维工程师(深圳)
TEG03-高级研发工程师(深圳)
TEG03-高级图像算法研发工程师(深圳)
TEG11-高级AI开发工程师(深圳)
15851-后台开发工程师
15851-后台开发工程师
SNG11-高级业务运维工程师(深圳)

2. 修改文档树

作为一个了解知识点,一般不主张修改。
示例代码(以下的代码是这个代码的继续):

from bs4 import BeautifulSoup
html_doc = """
The Dormouse's story

The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

""" soup = BeautifulSoup(html_doc,'lxml')

2.1 修改tag的名称和属性

tag_p = soup.p
print(tag_p)
tag_p.name = 'w'  # 修改标签名称
print(tag_p)
tag_p['title'] = 'age' # 修改属性值为"title"
print(tag_p)

结果

The Dormouse's story

The Dormouse's story The Dormouse's story

2.2 修改string值

tag_p = soup.p
print(tag_p.string)
tag_p.string = 'you need python'  # 修改string值
print(tag_p.string)

结果对比

The Dormouse's story
you need python

2.2 append()添加值

tag_p = soup.p
print(tag_p)
tag_p.append('abcd')  # 添加值
print(tag_p)

结果对比

The Dormouse's story

The Dormouse's storyabcd

2.3 删除值

r =  soup.find(class_='title')
print(r)
print('-'*100)
r.decompose()   # 删除这个标签
print(soup)

结果对比

The Dormouse's story

---------------------------------------------------------------------------------------------------- The Dormouse's story

Once upon a time there were three little sisters; and their names were Elsie, Lacie and Tillie; and they lived at the bottom of a well.

...

通过与示例代码对比发现,虚线上方的那个标签被删除了。

3. 爬取天气信息

我们下面做一个项目,爬取一个网站上的天气信息。
我们的需求是获取全中国城市的名字,以及对应的温度,保存到csv文件中。

3.1 思路分析

我们先以华北地区为例,华北地区共五个城市:北京、天津、河北、内蒙古、石家庄。我们分析一下源码:
爬虫(09)bs4(下) select()方法+修改文档树+天气信息案例_第1张图片
如上图,我们找到了每个区域所有的数据都在class = "conMidtab"的一个大标签里,而城市名在table标签下的第三个tr标签里的第一个或第二个td标签里,温度在倒数第二个td标签里。

我们打算定义三个模块,第一个用来解析网页数据,第二个来写入数据,第三个是主函数。

import requests
from bs4 import BeautifulSoup
import csv
def parse_page(url):
	pass
def writeData(list):
	pass
def main():
	pass 
if __name__ == '__main__':
    main()

3.2 实践步骤

我们来写代码吧。

3.2.1 初试代码

下面我们我们一步一步的写代码:

import requests
from bs4 import BeautifulSoup
import csv
def parse_page(url):
	headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
	response = requests.get(url,headers = headers)
	html = response.content.decode('utf-8')
	print(html)
def writeData(list):
	pass
def main():
	url = 'http://www.weather.com.cn/textFC/hb.shtml'
	parse_page(url)
if __name__ == '__main__':
    main()

我们可以运行一下程序,看看打印结果:

D:\Python38\python.exe D:/work/爬虫/Day09/weather_2.py

结果是正确的,我们可以把这个结果复制下来,重新定义一个html,令其等于这个结果,以后每次测试就不用再次打扰该网站的服务器了,推荐这样做,道德爬网。等所有的代码检测没有问题了,我们再向服务器发起请求。

3.2.2 找寻数据

html = '''... ...'''
soup = BeautifulSoup(html,'lxml')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        print(table)
        print('*-'*60)

结果我们发现有五个省份的数据,继续提取出五个省份城市的名字:

html = '''... ...'''
soup = BeautifulSoup(html,'lxml')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]
        for tr in trs:
            tds = tr.find_all('td')
            city_td = tds[0]
            city = city_td.strings
            print(city)

结果就是这样的
是一个生成器。
需要转化成列表

 # html = '''... ...'''
    soup = BeautifulSoup(html,'lxml')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]
        for tr in trs:
            tds = tr.find_all('td')
            city_td = tds[0]
            city = list(city_td.strings)
            print(city)

这一次结果出来了:

['\n', '北京', '\n']
['\n', '海淀']
['\n', '朝阳']
['\n', '顺义']
... ...

发现里面有不必要的字符,可以去除一下。而且我们发现结果是列表,我们需要提取其中的城市名字,于是:

    html = '''... ...'''
    soup = BeautifulSoup(html,'lxml')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]  # 过滤掉前两个tr标签,里面是表头内容
        for tr in trs:
            tds = tr.find_all('td')
            city_td = tds[0]
            city = list(city_td.stripped_strings)[0]
            print(city)

结果:

北京
海淀
朝阳
顺义
怀柔
...

出现了我们想要的结果。
下面我们补充上温度的数据就可以了,发现温度在倒数第二个td标签里面。于是:

    html = '''... ...'''
    soup = BeautifulSoup(html,'lxml')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]
        for tr in trs:
            tds = tr.find_all('td')
            city_td = tds[0]
            temp_td = tds[-2]
            city = list(city_td.stripped_strings)[0]
            temp = list(temp_td.stripped_strings)[0]

            print('city',city,'temp',temp)

结果出来了:

city 北京 temp -6
city 海淀 temp -6
city 朝阳 temp -5
city 顺义 temp -7
city 怀柔 temp -9
city 通州 temp -8
... ...

3.2.3 解决两个问题

下面这两个问题让我们学会到:

  • 一个新的函数:enumerate()
  • 一个容错率比较高的解析器:html5lib
  • 当然还有一个换源安装方法

3.2.3.1 省会城市名字问题

本来以为万事大吉了,没想到在测试其他区域时出现了新的问题。比如,在测试华东地区的时候,第一个城市的名字不是“哈尔滨”,而是“黑龙江”。后来检查网页的源代码发现,第一个td里显示的是省份的名字,第二个td里显示的才是该省份的省会城市。而北京是直辖市,两个td里显示的相同。不仅北京,上海,天津,所有的直辖市都是如此。但如果碰到不是直辖市的省份就出错了。怎么解决这个问题呢?如果我们只取第二个td标签里的城市可以吗?不可以,因为,其他的城市第二个标签是天气状况,是阴天和是晴天这样的信息。只有每个table里第一个tr标签里的第二个td是省会城市名。如果我们全都提取第二个td标签的内容,那么其他的城市的名字都显示成天气状况了。这样怎么办呢?既然只有第一个tr标签的第二个td是省会城市名,那么我们只需要当index(tr)==0的时候(即每个省份的第一个tr标签)取第二个td标签里的信息就可以了。于是我们只需要加一个判断就可以了,这里我们需要一个新的函数来帮助,enumerate()函数,它返回两个值,第一个返回值是列表里的元素的索引值,第二个返回值是元素本身。用法举例:

w_lst = ['a','b','c','d','e']
for index,i in enumerate(w_lst):
    print(index,i)

输出的结果:

0 a
1 b
2 c
3 d
4 e

所以我们把url地址换成东北地区的,我们的代码就可以改变成这样的了:

url = 'http://www.weather.com.cn/textFC/db.shtml'
def parse_page(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
    response = requests.get(url,headers = headers)
    html = response.content.decode('utf-8')
soup = BeautifulSoup(html,'lxml')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]    # 过滤掉前两个tr标签,里面是表头内容
        for index,tr in enumerate(trs):  # 使用enumerate()函数来判断tr标签的索引值
            tds = tr.find_all('td')
            city_td = tds[0]
            if index == 0:    # 当tr的索引值为0时,即第一个tr标签时,
                city_td =tds[1]  # 城市名取第二个td标签里的内容。
            temp_td = tds[-2]
            city = list(city_td.stripped_strings)[0]
            temp = list(temp_td.stripped_strings)[0]
            print('city',city,'temp',temp)
parse_page(url)

结果:

city 哈尔滨 temp -18
city 齐齐哈尔 temp -21
city 牡丹江 temp -25
city 佳木斯 temp -22
city 绥化 temp -20
... ...

第一个城市名字就是哈尔滨了。

3.2.3.2 港澳台地区乱码问题

本以为这次应该没有问题了,可是当我们把url换成港澳台地区的时候结果是这样子地:

city 香港 temp 16
city 省/直辖市 temp 周三(1月20日)夜间
city 天气现象 temp 风向风力
city 澳门 temp 15
city 省/直辖市 temp 周三(1月20日)夜间
city 天气现象 temp 风向风力
city 台湾 temp 17
city 高雄 temp 19
city 台中 temp 12
city 省/直辖市 temp 周四(1月21日)夜间
city 天气现象 temp 风向风力
city 香港 temp 17

信息是错乱的,完全驴头对不住马嘴。这是什么原因呢?经过分析网页源代码发现,代码的标签不完整,也就是说源代码有错误。而浏览器的解析会自动补充这些标签代码的缺失,所以渲染出来仍然没有问题。是不是程序员偷懒了,给我们造成了麻烦。不过不要紧,我们有另一个解析器大家还记得吗?html5lib,他老人家就是按照浏览器的解析方式来解析代码的。缺点是慢,但优点是容错率贼高。所以我们试试吧?不过要先安装html5lib解析器才能使用哦。我安装的时候发现直接用pip install html5lib贼慢,而且失败了。于是用了一次从没有用过的方式,传说中的换源安装。简单介绍:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple html5lib

这里我用的是清华的源,你也可以用其他的,格式就是这么个格式。发现瞬间安装成功了。
然后我们的代码就把解析器换成这个就行了,其他的都不用改。

soup = BeautifulSoup(html,'html5lib')   # 只需要改这一句就可以了。

于是乎,我们的问题解决了。

soup = BeautifulSoup(html,'html5lib')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]
        for index,tr in enumerate(trs):  # 使用enumerate()函数来判断tr标签的索引值
            tds = tr.find_all('td')
            city_td = tds[0]
            if index == 0:    # 当tr的索引值为0时,即第一个tr标签时,
                city_td =tds[1]  # 城市名取第二个td标签里的内容。
            temp_td = tds[-2]
            city = list(city_td.stripped_strings)[0]
            temp = list(temp_td.stripped_strings)[0]
            print('city',city,'temp',temp)
           

结果

city 香港 temp 16
city 澳门 temp 15
city 台北 temp 17
city 高雄 temp 19
city 台中 temp 12

很规矩的数据。

3.2.4 扩展功能

在这里我们需要将代码扩展一下,使得能够适用于爬取所有地区的数据。这里可以把所有的url制作成一个列表,然后用循环的方式提取url就可以了。扩展后的完整代码是这样子的:

import requests
from bs4 import BeautifulSoup
import csv

url = 'http://www.weather.com.cn/textFC/gat.shtml'
def parse_page(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
    response = requests.get(url,headers = headers)
    html = response.content.decode('utf-8')
soup = BeautifulSoup(html,'html5lib')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    for table in tables:
        trs = table.find_all('tr')[2:]   # 过滤掉前两个tr标签,里面是表头内容
        for index,tr in enumerate(trs):  # 使用enumerate()函数来判断tr标签的索引值
            tds = tr.find_all('td')
            city_td = tds[0]
            if index == 0:    # 当tr的索引值为0时,即每个省(每个table是一个省)的第一个tr标签时,
                city_td =tds[1]  # 城市名取第二个td标签里的内容。
            temp_td = tds[-2]
            city = list(city_td.stripped_strings)[0]
            temp = list(temp_td.stripped_strings)[0]

            print('city',city,'temp',temp)

def main():
    url_head = 'http://www.weather.com.cn/textFC/{}.shtml'
    end_lst = ['hb','db','hd','hz','hn','xb','xn','gat']
    for i in end_lst:
        url = url_head.format(i)
        parse_page(url)
        print('*()*_'*20)


if __name__ == '__main__':
    main()

运行后结果:

... ...
city 巴彦淖尔 temp -12
city 锡林郭勒 temp -17
city 呼伦贝尔 temp -23
city 兴安盟 temp -20
city 阿拉善盟 temp -7
*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_*()*_
city 哈尔滨 temp -18
city 齐齐哈尔 temp -21
city 牡丹江 temp -25
city 佳木斯 temp -22
city 绥化 temp -20
city 黑河 temp -26
... ...

结果太长了,我就复制这么多。

3.3 写入csv文件

我们仍然采用字典的方式写入,代码如下:

import requests
from bs4 import BeautifulSoup
import csv

url = 'http://www.weather.com.cn/textFC/gat.shtml'
def parse_page(url):
    headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.141 Safari/537.36'}
    response = requests.get(url,headers = headers)
    html = response.content.decode('utf-8')
soup = BeautifulSoup(html,'html5lib')
    conMidtab = soup.find('div',class_='conMidtab')
    tables = conMidtab.find_all('table')
    info_list = [] # 先定义一个空列表用来盛装要写入的数据
    for table in tables:
        trs = table.find_all('tr')[2:]
        for index,tr in enumerate(trs):  # 使用enumerate()函数来判断tr标签的索引值
            info_Dict = {}  # 先定义一个空字典,后面把对应城市和天气信息作为键值对添加
            tds = tr.find_all('td')
            city_td = tds[0]
            if index == 0:    # 当tr的索引值为0时,即第一个tr标签时,
                city_td =tds[1]  # 城市名取第二个td标签里的内容。
            temp_td = tds[-2]
            info_Dict['city'] = list(city_td.stripped_strings)[0]
            info_Dict['temp'] = list(temp_td.stripped_strings)[0]
            info_list.append(info_Dict)
    return info_list

def writeData(inf_list):
    with open('China_weather.csv','w',encoding='utf-8',newline='') as f:
        writer = csv.DictWriter(f,fieldnames=['city','temp'])
        writer.writeheader()
        writer.writerows(inf_list)

def main():
    lst = []
    url_head = 'http://www.weather.com.cn/textFC/{}.shtml'
    end_lst = ['hb','db','hd','hz','hn','xb','xn','gat']
    for i in end_lst:
        url = url_head.format(i)
        lst += parse_page(url)
        writeData(lst)
        print('正在写入'+i+'地区的信息')

if __name__ == '__main__':
    main()

运行结果:

正在写入hb地区的信息
正在写入db地区的信息
正在写入hd地区的信息
正在写入hz地区的信息
正在写入hn地区的信息
正在写入xb地区的信息
正在写入xn地区的信息
正在写入gat地区的信息

在我的对应文件夹里多出来了一个csv文件
爬虫(09)bs4(下) select()方法+修改文档树+天气信息案例_第2张图片
在我的文件管理器里打开是这样子地:
爬虫(09)bs4(下) select()方法+修改文档树+天气信息案例_第3张图片
这个项目到此就完成了。

4. selenium介绍

selenium本身是一款网站自动化测试的工具,并非为爬虫开发。但被借用来为爬虫解决一些问题。比如,一些数据是用ajax加载的,从网页的url里请求不到,所以,就可以用selenium工具模仿人工操作。好处是,所见即所得。坏处就是速度太慢,而且容易被识别。因为现在很多网站,如某宝,都能识别出这个工具,就用不了了。它常常和chromedriver一起使用。selenium+chromedriver
chromedriver是一款浏览器驱动程序,可以驱动chrome浏览器。当然,不同的浏览器有不同的驱动器。

  • Chrome:https://sites.google.com/a/chromium.org/chromedriver/downloads
  • Firefox:https://github.com/mozilla/geckodriver/releases
  • Edge:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
  • Safari:https://webkit.org/blog/6900/webdriver-support-in-safari-10/
  • 下载chromedriver
  • 百度搜索:淘宝镜像(https://npm.taobao.org/)
  • 安装总结:https://www.jianshu.com/p/a383e8970135
  • 安装Selenium:pip install selenium
    要求安装的驱动要和安装的浏览器对应。
    下节课我们再继续讲selenium的应用。

你可能感兴趣的:(爬虫)

省/直辖市 城市 周三(1月20日)白天 周三(1月20日)夜间
天气现象 风向风力 最高气温 天气现象 风向风力 最低气温