网络爬虫是一种按照一定的规则自动地抓取万维网信息的程序或者脚本,被广泛应用于搜索引擎、数据挖掘、价格比较、新闻聚合等应用程序中。网络爬虫可以通过HTTP协议访问网站,并根据预定义的规则和算法来抓取网页内容,并将抓取的数据存储在数据库或文件中。网络爬虫的应用越来越广泛,但也存在一些问题,如隐私问题、版权问题和网络安全问题等。因此,网络爬虫的使用需要遵守相关法律法规和道德规范。
随着搜索引擎的流行,网络爬虫已经成了很普及的网络技术。除了熟知的Google、微软以及百度外,许多门户网站都有自己的搜索引擎,对于一个内容型驱动的网站来说,受到网络爬虫的光顾是不可避免的。网站要采用反爬虫技术的原因有两个方面:一方面,一些糟糕的网络爬虫经常并发几十上百个请求循环重复抓取,造成的网站访问压力非常大,会导致网站访问速度缓慢甚至无法访问;另一方面,网站上的数据属于公司或个人重要的资产,无论是对公司还是个人都有非常重要的意义,通过爬虫手段对网站的数据进行爬取可能会导致一些信息数据的泄露。
爬虫的流程为“发起请求—获取相应内容—解析内容—保存数据”四个步骤,本文按照这个步骤来设计爬虫程序。首先是对网页整体结构的分析,其次是对网页内容的分析。对网页整体结构的分析能让网页的布局方式更加清晰明了,有利于快速查找到需要的网页内容以及明确其标签布局,也能够在定位标签ID、NAME以及样式受到干扰无法运行时,使用多级定位成功定位到目标内容所在的标签。因此对页面整体结构的分析虽不是必要的却是重要的。
from selenium import webdriver
import time, xlwt, re
import selenium
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import ui
# 成功运行!!!:淘宝搜索任意商品,即可获取数据
# 在打开的淘宝网商品搜索栏,输入自己手动输入的商品名称,点击搜索,等待十秒,扫码登陆自己的淘宝号
def search_product():
# 3.寻找“登录”
button2 = driver.find_element(By.XPATH, "//p[@class='nlink']/a[1]")
driver.execute_script("arguments[0].click();", button2)
# 一直失败
# # 4.寻找“密码登录”
# button3 = driver.find_element(By.XPATH, "//div[@id='NormalLoginBtn']/span[3]/a")
# driver.execute_script("arguments[0].click();", button3)
# # 5.寻找"账号输入框"
# input_id = driver.find_element(By.ID, "loginname")
# input_id.send_keys("18737665716")
# # 6.寻找"密码输入框"
# input_key = driver.find_element(By.ID, "password")
# input_key.send_keys("r6yw4VCARqZ2pLf")
# 改变思路:选择扫码登录
# # 4.寻找“扫码登录”
# button3 = driver.find_element(By.XPATH, "//i[@class='passIcon']")
# driver.execute_script("arguments[0].click();", button3)
# # 7.点击"协议"按钮
# button4 = driver.find_element(By.ID, "isread_em")
# driver.execute_script("arguments[0].click();", button4)
# # 8.寻找登录按钮
# button5 = driver.find_element(By.ID, "login_btn_withPwd")
# driver.execute_script("arguments[0].click();", button5)
# 改变思路,根本不需要爬虫找到按钮,人为点开就行
time.sleep(10) # 等待十秒,扫码验证
# 点击“销售”按钮
button3 = driver.find_element(By.XPATH, "//p[@class='ht']/a[2]")
driver.execute_script("arguments[0].click();", button3)
driver.find_element(By.XPATH, '//input[@class="mytxt at"]').send_keys(product) # 定位商品搜索栏,输入自己手动输入的商品名称(比如芒果)
driver.find_element(By.XPATH, '//div[@class="ush top_wrap"]/button').click() # 定位并点击搜索按钮
next_page() # 自定义函数,根据自己想爬取的页数,一页一页的跳转
# js代码,每一页都滑动到页面最底端
def drop_down():
for x in range(1, 11, 4): # 每页滑动三下
time.sleep(0.5) # 每滑动一次,停顿0.5秒
j = x / 10 # j代表滑动条位置
js = 'document.documentElement.scrollTop = document.documentElement.scrollHeight * %f' % j
driver.execute_script(js)
# 自定义要爬取商品的页数,实现每一页的跳转
def next_page():
i = 0
for x in range(1, 5): # 自定义要爬取商品的页数
# 利用URL实现页面跳转,每一页有50个商品
driver.get('https://s.taobao.com/search?q={}&s={}'.format(product, 44 * x))
driver.implicitly_wait(10) # 跳转页面后暂停十秒
drop_down() # 调用上边自定义的函数,每一页都滑动到页面最底
# F12进入开发者模式,根据HTML代码,抓取想要的内容的标签
divs = driver.find_elements(By.XPATH, '//div[@class="grid g-clearfix"]/div/div') # 拿到所有想要内容的标签树
# 遍历标签树,拿自己想要的内容各自的标签
for div in divs:
title = div.find_element(By.XPATH, './/div[@class="row row-2 title"]/a').text
price = div.find_element(By.XPATH, './/strong').text
deal = div.find_element(By.XPATH, './/div[@class="deal-cnt"]').text
shop = div.find_element(By.XPATH, './/div[@class="shop"]/a/span[2]').text
i += 1
# 将拿到的内容写进已创建的Excel
sheet.write(i, 0, title)
sheet.write(i, 1, price)
sheet.write(i, 2, deal)
sheet.write(i, 3, shop)
book.save(save) # 保存
if __name__ == '__main__':
product = input('请输入爬取商品名称:') # 输入要爬取的名称(比如芒果)芒果会出现在淘宝搜索栏并搜索
save = str(product) + '.xls' # Excel文件命名为输入的商品名称(比如“芒果.xls”)
driver = webdriver.Chrome(r'./chromedriver.exe') # Chrome驱动,写清楚驱动地址路径
driver.get('https://www.taobao.com/') # 爬取的网页
book = xlwt.Workbook(encoding='utf-8', style_compression=0) # 创建Excel
sheet = book.add_sheet('芒果', cell_overwrite_ok=True) # 命名Excel表
# 命名第一行表头
sheet.write(0, 0, '名称')
sheet.write(0, 1, '价格')
sheet.write(0, 2, '销售量')
sheet.write(0, 3, '商店')
search_product() # 调用自定义函数,开始爬取
代码文件以及爬取的芒果、草莓、鸭舌帽数据excel文件均已上传,需要者自取,也欢迎评论留下建议和问题~