vlambda博客
学习文章列表

教你妙用webdriver实现某宝爬虫

            

Python点滴记录
人生苦短,何不学Python
1篇原创内容
Official Account



            selenium是爬虫工程师的一大利器,巧妙利用他,可以轻松应对大部分的Javascripts防爬,真正做到可见即可得,轻松爬下我们需要的内容。



            在开始写代码前先要确保我们配置好了相关的环境,具体如何安装webriver可以百度,在这里我不在赘述。



            下面开始介绍记录一下针对某宝的selenium爬虫,实现利用selenium登录某宝(隐藏webdriver的特征),检索商品,获取搜索结果信息等。具体实现思路如下——



  • 代码实现




class Browser(): def __init__(self, name, pwd): options = webdriver.ChromeOptions()        #options.add_argument('--proxy-server=http://' + ip)#可设置webdriver的代理 self.browser = webdriver.Chrome(options=options) self.name = name self.pwd = pwd self.login_url = 'https://login.taobao.com/member/login.jhtml'#tb的登录页面        self.wait = WebDriverWait(self.browser, 10)  #设置webdriver的最长等待时间


        这里新建了一个例,要求初始化时传入账号与密码



 def login(self): hide_script = 'Object.defineProperty(navigator, "webdriver", {get: () => false,});' self.browser.get(self.login_url)        self.browser.execute_script(hide_script) #隐藏webdriver的特征,特别重要的一步 login = self.wait.until(EC.presence_of_element_located((By.ID, 'fm-login-id'))) pw = self.browser.find_element_by_id('fm-login-password') login.send_keys(self.name) pw.send_keys(self.pwd) pw.send_keys(Keys.ENTER) self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 's-name')))


        这步定义了一个login的方法以实现登录我们的账号,其中我们通过javascripts实现了隐藏webdriver的特征,可以绕过tb的检测,从而避免了烦人的验证,这一步是至关重要的,切记。



def get_goods(self, goods): url = 'https://s.taobao.com/search?' new_script = 'window.open()'        self.browser.execute_script(new_script) #新建一个标签页        self.browser.switch_to.window(self.browser.window_handles[1]) #切换到新建的标签页 self.browser.get(url) search = self.browser.find_element_by_class_name('search-combobox-input') search.send_keys(goods) search.send_keys(Keys.ENTER)


        这里定义了get_goods的一个方法实现搜索我们需要的商品,使用时需传入商品的名字,如“口红”等之类的。



def parse_pages(self): script = 'window.scrollTo(0, document.body.scrollHeight)' self.browser.execute_script(script) page_source = self.browser.page_source doc = pq(page_source) #将webdriver获取到的网页源码利用pyquery这个库进行解析 items = doc('div.item.J_MouserOnverReq ') for item in items.items(): price = item('div.price.g_price.g_price-highlight strong').text() deal_cnt = item('div.deal-cnt').text() good_link = item('div.row.row-2.title a').attr('href') good_name = item('div.row.row-2.title a').text() good_add = item('div.location').text() good_shop = item('div.wangwang span').attr('data-nick')

 

            这一步,实现的是解析每一页搜索结果,通过pyquery这个库对网页源码进行解析,获取我们需要的信息,配合下面切换页面的代码即可实现对所有的搜索结果进行爬取解析,得到我们需要的所需要的内容啦。



def get_new_page(self, page):        try: if page > 1: input = self.wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, 'input.input.J_Input'))) submit = self.wait.until( EC.element_to_be_clickable((By.CSS_SELECTOR, 'span.btn.J_Submit'))) input.clear() input.send_keys(page) submit.click() self.wait.until(EC.text_to_be_present_in_element((By.CSS_SELECTOR, 'li.item.active > span'), str(page))) Browser.parse_pages(self) except TimeoutError: Browser.get_new_page(self, page)

 

           切换页面的代码很简单,通过接受我们需要切换到的page,在切换页面的输入框内输入page,再点击确认,从而切换到新页面。配合一个

for page in range(1, 50): get_new_page(page)

便可以实现1-49页面的切换啦。



  • 总结

        以上便是一个比较简单的爬虫案例,其中的一些实现方法可能写的不是很号,读者可自行美化完善,还可以在这些的基础上增添更多的功能,进一步完善他的功能,比如数据的保存,商品的评论爬取等等。



   

  • Python点滴记录
    人生苦短,何不学Python
    1篇原创内容
    Official Account
           
  • 更多内容请关注我,一起学习一起进步吧,后面还会更新更多的干货哦


  • 关注我提高学习效率,Please !