先使用之前的方法将返利网的数据爬取下来,scrapy框架还不熟练,明日再战scrapyhtml
查找目标数据使用的是beautifulsoup模块。ajax
1.观察网页,寻找规律app
打开值得买这块内容框架
1>分析数据来源scrapy
网页上的数据分为一打开页面就存在的数据(源代码中能够看到的数据),ide
还有随着鼠标滑动,动态加载的数据(源代码中不显示的数据)。url
2>查找规律spa
加载到最底端后,网页上面一共有50条相关数据,查看源代码,发现只有5条数据的源代码,剩下的数据所有是线程
动态加载出来的。分析这些动态数据:3d
F12打开Network这部分,刷新页面,鼠标不往下滑动时,并无出现咱们须要的后面的数据,随着鼠标滑动,
发现两个可能存有数据的项,发现只有ajaxGetItem...这个是咱们所须要的,使用filter过滤一下。
过滤后发现以下规律:
1-2是第6-10条,1-3是第11-15条......
其余页也是这个规律,发现第二页中page参数那部分page=0-2,是从0打头的,我换成page=2-2后没有影响
因此规律就是把page部分换成对应的页数就行了。
2.代码
找到规律后,就能够写代码了。因为使用的是单线程,因此爬数据获得猴年马月了。
1 # encoding=utf-8
2 import urllib2 3 from bs4 import BeautifulSoup 4 import time 5 # 返利网值得买页面的源代码中只包含5条数据,
6 # 其余的数据是动态加载的,每一个页面包含50条数据
7
8 class FanLi(): 9 def __init__(self): 10 self.user_agent='Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'
11 self.headers={'User-Agent':self.user_agent} 12 def get_url(self): 13
14 list_url=[] 15 for i in range(1,760): 16 # 可内容直接获取的url1
17 url1='http://zhide.fanli.com/p'+str(i) 18 list_url.append(url1) 19 for j in range(2,11): 20 url2='http://zhide.fanli.com/index/ajaxGetItem?cat_id=0&tag=&page='+str(i)+'-'+str(j)+'&area=0&tag_id=0&shop_id=0'
21 list_url.append(url2) 22 return list_url 23 def getHtml(self,url): 24 # url='http://zhide.fanli.com/p'+str(pageIndex)
25 try: 26 request=urllib2.Request(url,headers=self.headers) 27 response=urllib2.urlopen(request) 28 html=response.read() 29 return html 30 except urllib2.URLError,e: 31 if hasattr(e,'reason'): 32 print u"链接失败",e.reason 33 return None 34 def parse(self): 35 urls=self.get_url() 36 i=0 37 # with open('zhide.txt',a) as f:
38 # f.write()
39 for url in urls: 40 i=i+1
41 html=self.getHtml(url) 42 soup=BeautifulSoup(html,'html.parser') 43 divs=soup.find_all('div',class_='zdm-list-item J-item-wrap item-no-expired') 44
45 # for item in divs[0]:
46 # print 'item'+str(item)
47
48 for div in divs: 49 con_list=[] 50 # 商品名称
51 title=div.find('h4').get_text() 52 # 分类
53 item_type=div.find('div',class_='item-type').a.string 54 # 推荐人
55 item_user=div.find('div',class_='item-user').string 56 # 内容
57 item_cont=div.find('div',class_='item-content').get_text(strip=True) 58 # 值得买人数
59 type_yes=div.find('a',attrs={'data-type':'yes'}).string 60 # 不值得买人数
61 type_no=div.find('a',attrs={'data-type':'no'}).string 62 con_list.append(title) 63 con_list.append(item_type) 64 con_list.append(item_user) 65 con_list.append(item_cont) 66 con_list.append(type_yes) 67 con_list.append(type_no) 68
69
70 f=open('zhide.txt','a') 71 for item in con_list: 72 f.write(item.encode('utf-8')+'|') 73 f.write('\n') 74 f.close() 75 print 'sleeping loading %d'%i 76 time.sleep(3) 77
78
79
80
81 zhide=FanLi() 82 zhide.parse()