Python爬虫之selenium爬虫,模拟浏览器爬取天猫信息
由于工作需要,需要提取到天猫400个指定商品页面中指定的信息,于是有了这个爬虫。这是一个使用 selenium 爬取天猫商品信息的爬虫,虽然功能单一,但是也算是 selenium 爬虫的基本用法了。
源码展示
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
import csv
import time class TM_itemdetail(object):
def __init__(self,readname='ids.txt',savename='info.csv'):
'''传入2个参数,分别是读取ID的文本名称和保存信息的表格名称,给予默认值'''
self.readname = readname
self.savename = savename
self.driver = webdriver.Chrome()
self.driver.maximize_window()
# 设置一个智能等待
self.waiter = WebDriverWait(self.driver,5)
self.get_csv() def get_csv(self):
'''创建一个表格,并且给表格添加标题行'''
with open(self.savename,'w',newline='') as f:
fieldnames = ['id','info']
writer = csv.DictWriter(f,fieldnames=fieldnames)
writer.writeheader() def write_info(self,info_dic):
'''写入单个信息,传入的参数是一个字典,字典的key跟表格的标题对应'''
with open(self.savename,'a',newline='') as f:
fieldnames = ['id', 'info']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writerow(info_dic) def get_ids(self):
'''读取文本的ID,形成一个列表'''
with open(self.readname,'r') as f:
lines = f.readlines()
ids = [k.replace('\n','').strip() for k in lines]
return ids def get_info(self,id):
'''爬虫的主要操作,模拟打开浏览器,找到信息的标签,提取后写入表格'''
dic = {}
url = 'https://detail.tmall.com/item.htm?id={}'.format(id)
self.driver.get(url)
# html = self.driver.page_source
# print(html)
try:
location = self.waiter.until(
EC.presence_of_element_located((By.XPATH,'//li[@class="J_step4Time"]'))
)
info = location.text.strip()
dic['id'] = id
dic['info'] = info if info else '信息为空白'
self.write_info(dic)
except TimeoutException as e:
print(e)
dic['id'] = id
dic['info'] = '{}超时,未找到信息'.format(e).strip()
self.write_info(dic) def main(self):
'''主函数,循环爬取,并打印相应的操作过程'''
ids = self.get_ids()
counter = len(ids)
i = 1
for id in ids:
self.get_info(id)
print('总计{}个,已经爬取{}个'.format(counter,i))
i += 1 if __name__ == '__main__':
start = time.time()
tm = TM_itemdetail()
tm.main()
tm.driver.close()
end = time.time()
print('运行结束,总耗时:{:.2f}秒'.format(end-start))
源码解析
这个爬虫主要由三个步骤构成:
- 读取文本中商品ID
- 循环爬取每个商品的信息
- 将信息保存到csv表格中
读取文本中的信息
由于是爬取给定的商品ID的宝贝的信息,所以需要一份包含商品ID的文本,文本中每行放入一个商品ID即可。
然后使用 Python 内置的方法,读取所有的商品ID并形成一个列表返回即可,这个过程可以封装到一个函数中,也即是下面这个:
def get_ids(self):
'''读取文本的ID,形成一个列表'''
with open(self.readname,'r') as f:
lines = f.readlines()
ids = [k.replace('\n','').strip() for k in lines]
return ids
这个函数看似没有传入参数,实际上因为是类的函数,所以有个参数是使用的类的属性,也就是文本的名称 self.readname。文件的读写可以使用 with...as... 语句,这种操作比较简洁方便。
爬取页面信息
下面截图中红色部分即使要提取的信息部分:

本来想着可以直接找到 URL 构造的规律去使用 requests 来爬的,但是最终还是遇到了难度,于是没有办法,只好祭出 selenium 这个大杀器!
selenium 爬虫的本质就是模拟浏览器的操作,所以这个爬虫很简单,只需要模拟浏览器打开以下网页,然后找到自己要的信息,提取就行了。
具体代码也封装到了一个函数中,这个函数需要传递一个参数,也就是一个商品ID,用来构成 URL 以便爬虫使用。
def get_info(self,id):
'''爬虫的主要操作,模拟打开浏览器,找到信息的标签,提取后写入表格'''
dic = {}
url = 'https://detail.tmall.com/item.htm?id={}'.format(id)
self.driver.get(url)
# html = self.driver.page_source
# print(html)
try:
location = self.waiter.until(
EC.presence_of_element_located((By.XPATH,'//li[@class="J_step4Time"]'))
)
info = location.text.strip()
dic['id'] = id
dic['info'] = info if info else '信息为空白'
self.write_info(dic)
except TimeoutException as e:
print(e)
dic['id'] = id
dic['info'] = '{}超时,未找到信息'.format(e).strip()
self.write_info(dic)
这个函数主要进行的操作流程为:
- 打开浏览器
- 输入一个 URL
- 等待页面刷新之后查找信息标签
- 提取指定信息,然后使用封装好的函数写入表格
其中最重要的步骤是提取信息的过程,这个使用了智能等待,也就是设定一个超时,然后浏览器会在这个超时的时间内智能的多次查找指定的信息,直到找到信息就进行下一步,否则继续刷新页面查找,直到超时时间到达报错。
保存信息到表格
信息已经提取,就需要保存起来,因为这个爬虫是工作需要,而且量也比较小,所以最佳的保存信息的方式就是 CSV 的表格形式了,直接使用 Python 自带的 csv 模块就可以。
信息保存分为2个部分:
- 在程序运行的最初,创建一个表格,并且给表格写入标题
- 在每次爬完一个页面,就在表格中写入一条信息
所以,写入表格的代码其实就是分成2个部分来的。
第一部分:
def get_csv(self):
'''创建一个表格,并且给表格添加标题行'''
with open(self.savename,'w',newline='') as f:
fieldnames = ['id','info']
writer = csv.DictWriter(f,fieldnames=fieldnames)
writer.writeheader()
这个部分创建了一个表格,并且可以看到,在爬虫类的的初始化中,已经运行了这个函数,也就是说,在爬虫创建的时候,就创建了一个表格。
self.get_csv()
第二部分:
def write_info(self,info_dic):
'''写入单个信息,传入的参数是一个字典,字典的key跟表格的标题对应'''
with open(self.savename,'a',newline='') as f:
fieldnames = ['id', 'info']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writerow(info_dic)
这个函数就是封装的写入信息,需要传入一个参数,也就是已经提取到的信息,这个信息需要写成字典的格式,因为在表格中已经创建了标题,所以可以直接使用标题的值来作为字典的 key。
循环爬取
最后,将整个爬虫的逻辑封装到一个主函数 main() 中即可,并且,为了可以及时看到爬虫的运行进度,可以在控制台中打印爬虫的进度信息。
def main(self):
'''主函数,循环爬取,并打印相应的操作过程'''
ids = self.get_ids()
counter = len(ids)
i = 1
for id in ids:
self.get_info(id)
print('总计{}个,已经爬取{}个'.format(counter,i))
i += 1
后记:不得不说,Python真的是个神器,很多需要花大量的时间去重复操作的一个事情,只需要花一点点时间写一个爬虫代码就能做到。
所以,那句话怎么说来着,人生苦短,快用 Python !
原创文章,装载请注明出处,文章内容来自 http://www.stopfollow.com/article/selenium-crawler-get-tmall-information/
Python爬虫之selenium爬虫,模拟浏览器爬取天猫信息的更多相关文章
- Python Requests库入门——应用实例-京东商品页面爬取+模拟浏览器爬取信息
京东商品页面爬取 选择了一款荣耀手机的页面(给华为打广告了,荣耀play真心不错) import requests url = "https://item.jd.com/7479912.ht ...
- Selenium+Chrome/phantomJS模拟浏览器爬取淘宝商品信息
#使用selenium+Carome/phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏 ...
- 爬虫之Selenium 动态渲染页面爬取
Selenim 是一个自动化测试工具,可以利用它驱动浏览器执行特定的动作,如点击.下拉等操作,同时可以获取浏览器当前呈现的页面的源代码,做到可见及可爬 1.使用流程 1)声明浏览器对象 Seleniu ...
- python模拟浏览器爬取数据
爬虫新手大坑:爬取数据的时候一定要设置header伪装成浏览器!!!! 在爬取某财经网站数据时由于没有设置Header信息,直接被封掉了ip 后来设置了Accept.Connection.User-A ...
- selenium+谷歌无头浏览器爬取网易新闻国内板块
网页分析 首先来看下要爬取的网站的页面 查看网页源代码:你会发现它是由js动态加载显示的 所以采用selenium+谷歌无头浏览器来爬取它 1 加载网站,并拖动到底,发现其还有个加载更多 2 模拟点击 ...
- scrapy模拟浏览器爬取验证码页面
使用selenium模块爬取验证码页面,selenium模块需要另外安装这里不讲环境的配置,我有一篇博客有专门讲ubuntn下安装和配置模拟浏览器的开发 spider的代码 # -*- coding: ...
- 关于爬虫的日常复习(10)—— 实战:使用selenium模拟浏览器爬取淘宝美食
- 使用PHP curl模拟浏览器抓取网站信息
curl是一个利用URL语法在命令行方式下工作的文件传输工具.curl是一个利用URL语法在命令行方式下工作的文件传输工具.它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER ...
- 3.使用Selenium模拟浏览器抓取淘宝商品美食信息
# 使用selenium+phantomJS模拟浏览器爬取淘宝商品信息 # 思路: # 第一步:利用selenium驱动浏览器,搜索商品信息,得到商品列表 # 第二步:分析商品页数,驱动浏览器翻页,并 ...
随机推荐
- Adobe Photoshop CC 2017-18.0安装教程
Adobe Photoshop CC 2017-18.0安装教程 注:下载链接在文章后面 第一步:首先请将电脑的网络断开,很简单:禁用本地连接或者拔掉网线,这样就可以免除登录Creative Clou ...
- Java_正则表达式&时间日期
正则表达式 1.概念 正则表达式(英语:Regular Expression,在代码中常简写为regex). 正则表达式是一个字符串,使用单个字符串来描述.用来定义匹配规则,匹配一系列符合某个句法规则 ...
- Java使用AES加密解密
AES加密机制: 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准. 这个标准用来替代原先的 ...
- Python 中的面向对象和异常处理
在之前我们已经说过了 Python 中内置的主要的几种对象类型,(数,字符串,列表,元组和字典).而面向对象的核心人物还没出场呢 .那么我们常说的对象是什么类型的呢,其实他的类型就是“类”.继承封装和 ...
- Openstack-开发基础 stevedore学习
在给openstack-N版加路由的时候发现怎么都无法搞定,原来现在用这个模块来处理了 stevedore是用来实现动态加载代码的开源模块.它是在OpenStack中用来加载插件的公共模块.可以独立于 ...
- 安装部署VMware vSphere 5.5文档 (6-5) 安装配置vCenter
部署VMware vSphere 5.5 实施文档 ########################################################################## ...
- mysql常见知识点
最近整理了一些数据库常见的面试题,对自己也是个复习,希望对大家也有所帮助. 1.触发器的作用? 触发器是一类特殊的存储过程,主要是通过事件来触发而被执行的.它可以强化约束,来维护数据的完整性和一致性, ...
- WSGI剖析
在一个 HTTP 请求到达服务器时, 服务器接收并调用 web 应用程序解析请求, 产生响应数据并返回给服务器. 这里涉及了两个方面的东西: 服务器(server)和应用程序(application) ...
- BOM知识梳理
学过前端开发的地球人应该都了解,JavaScript分为三个部分:ECMAScript(JS语言本身基础语法),DOM(文档对象模型,应用程序编程接口),BOM(浏览器对象模型). BOM,实际上与浏 ...
- BZOJ 2959: 长跑 lct 双联通分量 并查集 splay
http://www.lydsy.com/JudgeOnline/problem.php?id=2959 用两个并查集维护双联通分量的编号和合并. #include<iostream> # ...