2、爬虫思路的完整叙述
这个章节主要讲述的是我的整个爬虫思路。会的人就挑重点看看,不会的人就仔细看看。
1)定位输入框、搜索框
你想要获取笔记本电脑的数据信息。就必须要利用selenium自动化测试工具,自动输入“笔记本电脑”,然后点击“搜索”,获取我们想要的页面。
下图展示的是“输入框”的定位信息:
下图展示的是“搜索框”的定位信息:
第一次测试代码如下:
from selenium import webdriver import time # 搜索商品 def search_product(key_word): # 定位输入框 browser.find_element_by_id("q").send_keys(key_word) # 定义点击按钮,并点击 browser.find_element_by_class_name('btn-search').click() # 最大化窗口:为了方便我们扫码 browser.maximize_window() # 等待15秒,给足时间我们扫码 time.sleep(15) # 获取数据 def get_data(): pass def main(): browser.get('https://www.taobao.com/') search_product(key_word) if __name__ == '__main__': key_word = input("请输入你要搜索的商品:") browser = webdriver.Chrome() main()
注意:在自动点击“搜索框”后,系统会提示“需要登陆信息”。登陆方式很多,我推荐的是使用“二维码登录”的方式,因为其他方式很复杂,也不建议你们尝试,除非你想研究爬虫。
2)获取“总页数”信息
这个操作是为我们后来的“翻页”操作做准备的。对于淘宝页面来说,进行翻页操作,有如下两种方式,下面我们一一进行说明,我们先看下图。
思路一:从第一页开始,一直点击下一页;
思路二:获取总页码,进行url的拼接后,进行翻页操作;
这里我们选择的是“第二种思路”。因为不同的商品页码不同(有的可能没有100页),因此为了便于代码的书写,我们选择了第二种。
from selenium import webdriver import time # 搜索商品,获取商品页码 def search_product(key_word): # 定位输入框 browser.find_element_by_id("q").send_keys(key_word) # 定义点击按钮,并点击 browser.find_element_by_class_name('btn-search').click() # 最大化窗口:为了方便我们扫码 browser.maximize_window() # 等待15秒,给足时间我们扫码 time.sleep(15) # 定位这个“页码”,获取“共100页这个文本” page_info = browser.find_element_by_xpath('//div[@class="total"]').text # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。 page = re.findall("(\d+)",page_info)[0] return page # 获取数据 def get_data(): pass def main(): browser.get('https://www.taobao.com/') page = search_product(key_word) print(type(page)) print(page) if __name__ == '__main__': key_word = input("请输入你要搜索的商品:") browser = webdriver.Chrome() main()
定位“总页面”,我们可以看一下图中的定位信息,这里的总页面信息是一个文本“共100页”,我们需要利用“正则表达式”提取数字100,代码如上。
3)获取商品信息(第一页的信息)
我们要获取商品信息,首先要找到商品信息的具体定位信息。老生常谈的话,怎么定位?这里就不详细说明了,下图中可以看出:整个笔记本的信息都存在于div[@class=“items”]下。
其次,获取具体各部分的信息,我们使用的是xpath语法,这一直是我最喜欢使用的一个获取数据的方式。
代码如下:
from selenium import webdriver import time # 搜索商品,获取商品页码 def search_product(key_word): # 定位输入框 browser.find_element_by_id("q").send_keys(key_word) # 定义点击按钮,并点击 browser.find_element_by_class_name('btn-search').click() # 最大化窗口:为了方便我们扫码 browser.maximize_window() # 等待15秒,给足时间我们扫码 time.sleep(15) # 定位这个“页码”,获取“共100页这个文本” page_info = browser.find_element_by_xpath('//div[@class="total"]').text # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。 page = re.findall("(\d+)",page_info)[0] return page # 获取数据 def get_data(): # 通过页面分析发现:所有的信息都在items节点下 items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq "]') for item in items: # 参数信息 pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text # 价格 pro_price = item.find_element_by_xpath('.//strong').text # 付款人数 buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text # 旗舰店 shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text # 发货地 address = item.find_element_by_xpath('.//div[@class="location"]').text print(pro_desc, pro_price, buy_num, shop, address) def main(): browser.get('https://www.taobao.com/') page = search_product(key_word) print(page) get_data() if __name__ == '__main__': key_word = input("请输入你要搜索的商品:") browser = webdriver.Chrome() main()
据(第一页的数据)
保存数据我们使用的是csv模块,我们先保存第一页的数据,后面采用追加的方式,将每一页的数据,一次次保存进行。
from selenium import webdriver import time import csv # 搜索商品,获取商品页码 def search_product(key_word): # 定位输入框 browser.find_element_by_id("q").send_keys(key_word) # 定义点击按钮,并点击 browser.find_element_by_class_name('btn-search').click() # 最大化窗口:为了方便我们扫码 browser.maximize_window() # 等待15秒,给足时间我们扫码 time.sleep(15) # 定位这个“页码”,获取“共100页这个文本” page_info = browser.find_element_by_xpath('//div[@class="total"]').text # 需要注意的是:findall()返回的是一个列表,虽然此时只有一个元素它也是一个列表。 page = re.findall("(\d+)",page_info)[0] return page # 获取数据 def get_data(): # 通过页面分析发现:所有的信息都在items节点下 items = browser.find_elements_by_xpath('//div[@class="items"]/div[@class="item J_MouserOnverReq "]') for item in items: # 参数信息 pro_desc = item.find_element_by_xpath('.//div[@class="row row-2 title"]/a').text # 价格 pro_price = item.find_element_by_xpath('.//strong').text # 付款人数 buy_num = item.find_element_by_xpath('.//div[@class="deal-cnt"]').text # 旗舰店 shop = item.find_element_by_xpath('.//div[@class="shop"]/a').text # 发货地 address = item.find_element_by_xpath('.//div[@class="location"]').text #print(pro_desc, pro_price, buy_num, shop, address) with open('{}.csv'.format(key_word), mode='a', newline='', encoding='utf-8-sig') as f: csv_writer = csv.writer(f, delimiter=',') csv_writer.writerow([pro_desc, pro_price, buy_num, shop, address]) def main(): browser.get('https://www.taobao.com/') page = search_product(key_word) print(page) get_data() if __name__ == '__main__': key_word = input("请输入你要搜索的商品:") browser = webdriver.Chrome() main()
注意:在使用csv保存数据的时候,一定要将数据编码设置为“utf-8-sig”形式,不要问为什么,因为我以前碰到过保存为“utf8”格式,仍然出现乱码的情况。只有保存成这个编码还没有遇见任何问题。
5)翻页操作获取整个数据(完整代码)
我们想要知道怎么翻页,就必须了解每个页面的“url”是怎么变化的,下图我截取了第2,3,4页的url信息,进行分析。