简单爬虫---寻找同时卖不同商品的淘宝店铺

这个简单的爬虫是为了满足个人的一个需求:有时候在淘宝时,买一些组合的东西(比如一次买耳机头跟电焊,需要分开买),或者不同的吃的零食,总是出现在不同的店里。价格倒是其次,只是不喜欢反复的收包裹,那么这个爬虫可以找到这些都有得卖的店铺,至少可以帮我试一下有没有在一家店买的可能。

实现上非常简单,也不需要登录,直接通过url请求。首先是输入需要的模块

import requests
from bs4 import BeautifulSoup
import re
import time
import web browser
import threading

接下来对于每个物品寻找店铺的函数

#pages_searched决定对一个物品我们检索多少页
def onepagesearch(link, pages_searched=80):    
  set_userid = set()    
  for i in range(pages_searched):        
    #直接通过改变44i的值起到翻页的作用,可以看一下下一页后url的变化
    link_ini = link + str(44*i)        
    try:            
      html_ini = requests.get(link_ini)            
      soup_ini = BeautifulSoup(html_ini.text)      
      #找到店铺id                  
      b = soup_ini.find_all('script')[4]                       
      c = b.string.strip()            
      pattern = re.compile("\"user_id\"\:\"(\d*)\"")
      result = pattern.findall(c)            
      if result!=None:                
        list_userid_i=[int(ss) for ss in result]                 
        #将每一页找到的id都放入集合                
        set_userid_i = set(list_userid_i)                
        set_userid = set_userid|set_userid_i            
      else:                
        print "!!!!"        
    except:            
      print "open url error"    
  #最终返回这个物品对应的前pages_searched页的店铺id
  return set_userid

主要部分就已经完成了,为了用两个线程去找两个物品,只需要定义如下类就可以了,

class MyThread(threading.Thread):    
  def __init__(self, thread_name, target, args):        
    super(MyThread, self).__init__()        
    self.name=thread_name        
    self.target = target        
    self.args = args        
    self.store = set()    
  def run(self) :        
    self.store = self.target(self.args)

其中线程的run函数执行的target函数就是我们已经完成的onepagesearch,接下来就是主函数部分

def main():    
  #需要用户输入两个物品,编码格式需要注意
  name1 = raw_input(u"input thing's name 1")    
  name1 = name1.encode('utf8')    
  name2 = raw_input(u"input thing's name 2")    
  name2 = name2.encode('utf8')    
  start = time.clock() 
  #分别是两个物品对应的两个base link ,传入后需要跟第几页拼起来 
  link1_pre = u'http://s.taobao.com/search?q='+name1+u'&bcoffset=-4&s='    
  link2_pre = u'http://s.taobao.com/search?q='+name2+u'&bcoffset=-4&s='  
  #为了直接返回店铺地址,定义一个店铺的base link之后跟店铺id拼起来即可访问
  store_pre = u'store.taobao.com/shop/view_shop.htm?user_number_id='  
  #两个物品,创建两个线程  
  thread1 = MyThread("Thread-1", onepagesearch, link1_pre,)    
  thread2 = MyThread("Thread-2", onepagesearch, link2_pre,)    
  #start threading.run    
  thread1.start()    
  thread2.start()    
  thread1.join()    
  thread2.join() 
  #返回两个物品分别得到的店铺id,再求交集即为同时售卖的店铺   
  goods1 = thread1.store    
  goods2 = thread2.store    
  good_inter = set.intersection(goods1, goods2)    
  end = time.clock()    
  print "search is done, cost %f " %(end-start)    
  list_good = list(good_inter)    
  list_shop = [store_pre+str(x) for x in list_good]    
  if len(list_shop)!=0:   
    #返回共有的店铺,同时用webbrowser打开第一个     
    for shop in list_shop:              
      print shop        
    to_open = 'http://'+list_shop[0]               
    webbrowser.open_new_tab(to_open)    
   else:        
     print u'Did not find any shop incommon

'if __name__=='__main__':   
   main()

我们测试一下

简单爬虫---寻找同时卖不同商品的淘宝店铺_第1张图片
1.jpg

同时打开第一个店铺

简单爬虫---寻找同时卖不同商品的淘宝店铺_第2张图片
2.jpg

OK了!
本人是土法土搞,如果看到的人有什么提高效率或者更优的建议,可以告诉我,3Q for reading, 也祝中秋节快乐!

你可能感兴趣的:(简单爬虫---寻找同时卖不同商品的淘宝店铺)