Python 爬虫之 selenium 爬虫,模拟浏览器爬取天猫信息
来源:互联网 发布:淘宝怎么买食品 编辑:程序博客网 时间:2024/04/29 03:14
由于工作需要,需要提取到天猫400个指定商品页面中指定的信息,于是有了这个爬虫。这是一个使用 selenium 爬取天猫商品信息的爬虫,虽然功能单一,但是也算是 selenium 爬虫的基本用法了。
源码展示
# -*- coding: utf-8 -*-from selenium import webdriverfrom selenium.webdriver.common.by import Byfrom selenium.webdriver.support.ui import WebDriverWaitfrom selenium.webdriver.support import expected_conditions as ECfrom selenium.common.exceptions import TimeoutExceptionimport csvimport timeclass 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 += 1if __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爬虫之selenium
- PYthon Selenium 爬虫 操作浏览器
- python爬虫2之简单模拟浏览器
- Python爬虫工具之Selenium
- Python爬虫小结之Selenium
- [python爬虫]selenium+PhantomJS模拟登陆
- python selenium网络爬虫 模拟登陆
- python 针对selenium+phontomjs等模拟浏览器爬虫的反爬技术点
- python爬虫之手机模拟
- Python爬虫之模拟登陆
- python urllib2模拟浏览器请求 爬虫
- Python爬虫利器之Selenium的用法
- Python爬虫之Selenium+PhantomJS组合
- Python爬虫学习之Selenium详解
- Python爬虫利器之selenium的安装
- Python爬虫利器之selenium常用操作
- Python爬虫利器之selenium有无界面
- Maven学习(五)-- 聚合与继承
- Android四大组件之Activity<中>
- leetcode 287. Find the Duplicate Number
- (3)在Action中用request、session、application和前端简单数据、对象数据传递到后端
- MATLAB 区域生长 连通区域计算 曲线的断点查询
- Python 爬虫之 selenium 爬虫,模拟浏览器爬取天猫信息
- 获取app中所有activity集合
- Python爬虫XPATH
- 横向滑动菜单Tablayout,点击选项给下面的viewpager中的fragment传值
- Hadoop 2.8 集群的安装
- jasperReports
- 面试中常见的排序算法
- 【数据建模 缺失值处理】缺失值的处理
- 从驱动层到应用层打通Android系统通路