这个简单的爬虫是为了满足个人的一个需求:有时候在淘宝时,买一些组合的东西(比如一次买耳机头跟电焊,需要分开买),或者不同的吃的零食,总是出现在不同的店里。价格倒是其次,只是不喜欢反复的收包裹,那么这个爬虫可以找到这些都有得卖的店铺,至少可以帮我试一下有没有在一家店买的可能。
实现上非常简单,也不需要登录,直接通过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()
我们测试一下
同时打开第一个店铺
OK了!
本人是土法土搞,如果看到的人有什么提高效率或者更优的建议,可以告诉我,3Q for reading, 也祝中秋节快乐!