简单的新闻客户端APP开发(DCloud+thinkphp+scrapy)

前端时间花了1个月左右,搞了个新闻APP,功能很简单,就是把页面版的新闻条目定时爬到后台数据库,然后用app显示出来。

1.客户端

使用了DCloud框架,js基本是个新手,从没写过像样的代码,html5更是新手,索性直接使用现成的前端框架。APPcan,APICloud尝试过,最终选择DCloud,话说它的HBuild编辑器确实不错。

贴一部分关键代码: 使用DCloud的下拉刷新方法,使用ajax获取后台返回的json列表;

1 <!DOCTYPE html>
  2 <html>
  3 
  4     <head>
  5         <meta charset="utf-8">
  6         <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />
  7         <title></title>
  8         <script src="js/mui.min.js"></script>
  9         <link href="css/mui.min.css" rel="stylesheet" />
 10         <script type="text/javascript" charset="utf-8">
 11              //mui.init();
 12              var t;
 13              mui.init({
 14                     pullRefresh: {
 15                         container: "#pullMine", //下拉刷新容器标识,querySelector能定位的css选择器均可,比如:id、.class等
 16                         down: {
 17                             contentdown: "下拉可以刷新", //可选,在下拉可刷新状态时,下拉刷新控件上显示的标题内容
 18                             contentover: "释放立即刷新", //可选,在释放可刷新状态时,下拉刷新控件上显示的标题内容
 19                             contentrefresh: "正在刷新...", //可选,正在刷新状态时,下拉刷新控件上显示的标题内容
 20                             callback: pulldownRefresh //必选,刷新函数,根据具体业务来编写,比如通过ajax从服务器获取新数据;
 21                         }
 22                     }
 23                 });
 24                 
 25              mui.plusReady(function() {
 26                 console.log("当前页面URL:" + plus.webview.currentWebview().getURL());
 27                 mui.ajax(‘http://202.110.123.123:801/newssystem/index.php/Home/News/getlist_sd‘, {
 28                     dataType: ‘json‘,
 29                     type: ‘get‘,
 30                     timeout: 10000,
 31                     success: function(data) {
 32                         t=data;
 33                         var list = document.getElementById("list");
 34                         var finallist = ‘‘;
 35                         for (i = data.length - 1; i >= 0; i--) {
 36                             finallist = finallist + ‘<li data-id="‘ + i + ‘" class="mui-table-view-cell" ><a class="mui-navigate-right"><div class="mui-media-body">‘ + data[i].title + ‘<p class="mui-ellipsis">‘ + data[i].pubtime + ‘</p></div></a></li>‘;
 37                         }
 38                         list.innerHTML = finallist;
 39                         console.log("no1"+finallist);
 40                         mui(‘#list‘).on(‘tap‘, ‘li‘, function() {
 41                             mui.openWindow({
 42                                 url: ‘detail_sd.html‘,
 43                                 id: ‘detail_sd‘,
 44                                 extras: {
 45                                     title: t[this.getAttribute(‘data-id‘)].title,
 46                                     author: t[this.getAttribute(‘data-id‘)].author,
 47                                     pubtime: t[this.getAttribute(‘data-id‘)].pubtime,
 48                                     content: t[this.getAttribute(‘data-id‘)].content
 49                                 }
 50                             })
 51                             
 52                         })
 53                     },
 54                     error: function() {}
 55                 })
 56                 })
 57             
 58              //下拉刷新
 59 //                
 60 
 61             
 62             
 63             /**
 64              * 下拉刷新具体业务实现
 65              */function pulldownRefresh() {
 66                     setTimeout(function() {
 67                         console.log("refreshing....");
 68                         mui.ajax(‘http://202.110.123.123:801/newssystem/index.php/Home/News/getlist_sd‘, {
 69                             dataType: ‘json‘,
 70                             type: ‘get‘,
 71                             timeout: 10000,
 72                             success: function(data) {
 73                                 t=data;
 74                                 var list = document.getElementById("list");
 75                                 var finallist = ‘‘;
 76                                 for (i = data.length - 1; i >= 0; i--) {
 77                                     finallist = finallist + ‘<li data-id="‘ + i + ‘" class="mui-table-view-cell" ><a class="mui-navigate-right"><div class="mui-media-body">‘ + data[i].title + ‘<p class="mui-ellipsis">‘ + data[i].pubtime + ‘</p></div></a></li>‘;
 78                                     //                         finallist=finallist+‘<li data-id="‘+i+‘" class="mui-table-view-cell" ><a class="mui-navigate-right"><div class="mui-media-body">‘+data[i].title+‘<p class="mui-ellipsis">‘+data[i].content+‘</p></div></a></li>‘;
 79                                 }
 80                                 list.innerHTML = finallist;
 81                                  
 82                             
 83                             },
 84                             error: function() {}
 85                         });
 86                         mui(‘#pullMine‘).pullRefresh().endPulldownToRefresh(); //refresh completed
 87                     
 88                     }, 1500);
 89 }
 90         </script>
 91     </head>
 92 
 93     <body>
 94 
 95         <!--<div id="pullMine" class="mui-content mui-scroll-wrapper">
 96             <div class="mui-scroll">
 97                 <ul class="mui-table-view" id="list">
 98 
 99                 </ul>
100             </div>
101 
102         </div>-->
103         
104     <div id="pullMine" class="mui-content mui-scroll-wrapper">
105 
106         <div class="mui-scroll">
107             <ul class="mui-table-view" id="list">
108                 
109             </ul>
110         </div>
111     </div>
112 
113     </body>
114

115 </html>

2.后台PHP发布端

使用了thinkphp框架

1 <?php
 2 namespace Home\Controller;
 3 use Think\Controller;
 4 class NewsController extends Controller {
 5     public function getlist(){
 6         $newsList=M(‘news‘)->order(‘pubtime asc‘)->limit(30)->select();
 7         echo json_encode($newsList);
 8     }
 9     public function getlist_sd(){
10         $newsList=M(‘newssd‘)->order(‘pubtime asc‘)->limit(30)->select();
11         echo json_encode($newsList);
12     }

13 ?>

3.后台爬虫

使用了scrapy,爬取新闻内容写入DB

pipelines.py

1 # -*- coding: utf-8 -*-
 2 
 3 # Define your item pipelines here
 4 #
 5 # Don‘t forget to add your pipeline to the ITEM_PIPELINES setting
 6 # See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
 7 
 8 from scrapy import signals
 9 import json
10 import codecs
11 from twisted.enterprise import adbapi
12 from datetime import datetime
13 from hashlib import md5
14 import MySQLdb
15 import MySQLdb.cursors
16 
17 class JsonWithEncodingtutorialPipeline(object):
18     def __init__(self):
19         self.file = codecs.open(‘qdnews.json‘, ‘w‘, encoding=‘utf-8‘)
20     def process_item(self, item, spider):
21         line = json.dumps(dict(item), ensure_ascii=False) + "\n"
22         self.file.write(line)
23         return item
24     def spider_closed(self, spider):
25         self.file.close()
26 
27 class MySQLStoretutorialPipeline(object):
28     def __init__(self, dbpool):
29         self.dbpool = dbpool
30         print("-----------init sql proc---")
31     @classmethod
32     def from_settings(cls, settings):
33         dbargs = dict(
34             host=settings[‘MYSQL_HOST‘],
35             db=settings[‘MYSQL_DBNAME‘],
36             user=settings[‘MYSQL_USER‘],
37             passwd=settings[‘MYSQL_PASSWD‘],
38             charset=‘utf8‘,
39             cursorclass = MySQLdb.cursors.DictCursor,
40             use_unicode= True,
41         )
42         dbpool = adbapi.ConnectionPool(‘MySQLdb‘, **dbargs)
43         return cls(dbpool)
44 
45     #pipeline默认调用
46     def process_item(self, item, spider):
47         d = self.dbpool.runInteraction(self._do_upinsert, item, spider)    
48         d.addErrback(self._handle_error, item, spider)
49         d.addBoth(lambda _: item)
50         return d
51     #将每行更新或写入数据库中
52     def _do_upinsert(self, conn, item, spider):
53         print (item[‘link‘][0])
54         linkmd5id = self._get_linkmd5id(item)
55         
56         print linkmd5id
57         print("--------------")
58         now = datetime.now().replace(microsecond=0).isoformat(‘ ‘)
59         #now=datetime2timestamp(datetime.datetime.now())
60         conn.execute("""
61             select 1 from tp_news where linkmd5id = %s
62         """, (linkmd5id, ))
63         ret = conn.fetchone()
64         print (‘ret=‘,ret)
65 
66         if ret:
67             print "1111111111"
68             conn.execute("""
69                 update tp_news set title = %s, content = %s, author = %s,pubtime = %s, pubtime2 = %s,link = %s, updated = %s where linkmd5id = %s    
70             """, (item[‘title‘][0][4:-5], item[‘content‘][0], item[‘pubtime‘][0][16:-4],item[‘pubtime‘][0][-14:-4], item[‘pubtime‘][0][-14:-4],item[‘link‘][0], now, linkmd5id))
71             #print """
72                 #    update tp_news_2 set title = %s, description = %s, link = %s, listUrl = %s, updated = %s where linkmd5id = %s
73                 #""", (item[‘title‘], item[‘desc‘], item[‘link‘], item[‘listUrl‘], now, linkmd5id)
74         else:
75             print ‘2222222222‘
76             conn.execute("""
77             insert into tp_news(linkmd5id, title, content, author,link, updated, pubtime, pubtime2) 
78             values(%s, %s, %s, %s, %s,%s,%s,%s)
79             """, (linkmd5id, item[‘title‘][0][4:-5], item[‘content‘][0], item[‘pubtime‘][0][16:-4],item[‘link‘][0], now,item[‘pubtime‘][0][-14:-4], item[‘pubtime‘][0][-14:-4]))
80             #print """
81                 #    insert into tp_news_2(linkmd5id, title, description, link, listUrl, updated)
82                 #    values(%s, %s, %s, %s, %s, %s)
83                 #""", (linkmd5id, item[‘title‘], item[‘desc‘], item[‘link‘], item[‘listUrl‘], now)
84         #获取url的md5编码    
85     def _get_linkmd5id(self, item):
86         #url进行md5处理,为避免重复采集设计
87         s=md5(item[‘link‘][0]).hexdigest()
88         #print (s)
89         #print(md5(item[‘link‘]).hexdigest())
90         return s
91         #异常处理
92     def _handle_error(self, failue, item, spider):

93         log.err(failure)

items.py

1 # -*- coding: utf-8 -*-
 2 
 3 # Define here the models for your scraped items
 4 #
 5 # See documentation in:
 6 # http://doc.scrapy.org/en/latest/topics/items.html
 7 
 8 import scrapy
 9 
10 
11 class DmozItem(scrapy.Item):
12     # define the fields for your item here like:
13     # name = scrapy.Field()
14     pubtime=scrapy.Field()
15     title=scrapy.Field()
16     link=scrapy.Field()
17     desc=scrapy.Field()
18     content=scrapy.Field()

19     id=scrapy.Field()

spiders.py

1 from scrapy.spider import BaseSpider
  2 from scrapy.selector import HtmlXPathSelector
  3 from tutorial.items import DmozItem
  4 from scrapy.http import Request
  5 from scrapy.utils.response import get_base_url
  6 from scrapy.utils.url import urljoin_rfc
  7 from urllib2 import urlopen
  8 from BeautifulSoup import BeautifulSoup
  9 
 10 from scrapy.spiders import CrawlSpider
 11 from scrapy.loader import ItemLoader
 12 from scrapy.linkextractors.sgml import SgmlLinkExtractor
 13 
 14 
 15 import scrapy
 16 class DmozSpider(BaseSpider):
 17     name = "dmoz"
 18     allowed_domains = ["dmoz.org"]
 19     start_urls = [
 20         "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
 21         "http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
 22     ]
 23     def parse(self, response):
 24         # filename = response.url.split("/")[-2]
 25         # open(filename, ‘wb‘).write(response.body)
 26         hxs=HtmlXPathSelector(response)
 27         sites=hxs.select(‘//ul/li‘)
 28         items=[]
 29         for site in sites:
 30             item=DmozItem()
 31             item[‘title‘]=site.select(‘a/text()‘).extract()
 32             item[‘link‘]=site.select(‘a/@href‘).extract()
 33             item[‘desc‘]=site.select(‘text()‘).extract()
 34             items.append(item)
 35         return items
 36 
 37 class DmozSpider2(BaseSpider):
 38     name = "dmoz2"
 39     allowed_domains = ["10.60.32.179"]
 40     start_urls = [
 41         "http://10.60.32.179/Site/Site1/myindex.shtml",
 42         #"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
 43     ]
 44     def parse(self, response):
 45         # filename = response.url.split("/")[-2]
 46         # open(filename, ‘wb‘).write(response.body)
 47         hxs=HtmlXPathSelector(response)
 48         sites=hxs.select(‘//*[@id="_ctl0_LblContent"]/div/div//ul/li‘)
 49         items=[]
 50         for site in sites:
 51             item=DmozItem()
 52             item[‘date‘]=site.select(‘span/text()‘).extract()
 53             item[‘title‘]=site.select(‘a/text()‘).extract()
 54             item[‘link‘]=site.select(‘a/@href‘).extract()
 55             item[‘desc‘]=site.select(‘text()‘).extract()
 56             items.append(item)
 57         return items
 58 
 59 
 60 class MySpider(BaseSpider):
 61     name = "myspider"
 62     allowed_domains = ["10.60.32.179"]
 63     start_urls = [
 64         ‘http://10.60.32.179/Site/Site1/myindex.shtml‘,
 65         #‘http://example.com/page2‘,
 66     ]
 67     def parse(self, response):
 68         # collect `item_urls`
 69         hxs=HtmlXPathSelector(response)
 70         item_urls=hxs.select(‘//*[@id="_ctl0_LblContent"]/div/div//ul/li‘)
 71         base_url = get_base_url(response)
 72         items=[]
 73         for item_url in item_urls:
 74             
 75             yield Request(url=response.url, callback=self.parse_item,meta={‘items‘: items})
 76         
 77     def parse_item(self, response):
 78         hxs=HtmlXPathSelector(response)
 79         item_urls=hxs.select(‘//*[@id="_ctl0_LblContent"]/div/div//ul/li‘)
 80 
 81         item=DmozItem()
 82         items=response.meta[‘items‘]
 83         item[‘date‘]=item_urls.select(‘span/text()‘).extract()
 84         item[‘title‘]=item_urls.select(‘a/text()‘).extract()
 85         item[‘link‘]=item_urls.select(‘a/@href‘).extract()
 86         item[‘desc‘]=item_urls.select(‘text()‘).extract()
 87         
 88         # item_details_url=item[‘link‘]
 89         # populate `item` fields
 90         relative_url=item_urls.select(‘a/@href‘).extract()
 91         print(relative_url[0])
 92         base_url = get_base_url(response)
 93         item_details_url=urljoin_rfc(base_url, relative_url[0])
 94         yield Request(url=item_details_url,callback=self.parse_details,dont_filter=True,meta={‘item‘:item,‘items‘:items})
 95         
 96     def parse_details(self, response):
 97         #item = response.meta[‘item‘]
 98         # populate more `item` fields
 99         print("***********************In parse_details()***************")
100         hxs=HtmlXPathSelector(response)
101         print("-------------------------------")
102         print(response.url)
103         item_detail=hxs.select(‘/html/body/center/div/div[4]/div[1]/p[1]‘).extract()
104         print("________________",item_detail)
105         item=response.meta[‘item‘]
106         item[‘detail‘]=item_detail
107         items=response.meta[‘items‘]
108         items.append[item]
109         return items
110 
111 
112 
113 
114 class DmozSpider3(BaseSpider):
115     name = "dmoz3"
116     allowed_domains = ["10.60.32.179"]
117     start_urls = [
118         ‘http://10.60.32.179/Site/Site1/myindex.shtml‘,
119     ]
120 
121     def parse(self, response):
122         hxs=HtmlXPathSelector(response)
123         sites=hxs.select(‘//*[@id="_ctl0_LblContent"]/div/div//ul/li‘)
124         items=[]
125         for site in sites:
126             item=DmozItem()
127             item[‘date‘]=site.select(‘span/text()‘).extract()
128             item[‘title‘]=site.select(‘a/text()‘).extract()
129             item[‘link‘]=site.select(‘a/@href‘).extract()
130             item[‘desc‘]=site.select(‘text()‘).extract()
131 
132             print(item[‘link‘][0])
133             base_url = get_base_url(response)
134             relative_url=item[‘link‘][0]
135             item_details_url=urljoin_rfc(base_url, relative_url)
136             print("*********************",item_details_url)
137             #response2=BeautifulSoup(urlopen(item_details_url).read())
138             response2=scrapy.http.Response(item_details_url)
139             hxs2=HtmlXPathSelector(response2)
140             item[‘detail‘]=hxs2.select(‘/html/body/center/div/div[4]/div[1]/p[1]‘).extract()
141             
142             items.append(item)
143         return items
144 
145 
146 
147 
148 class MySpider5(BaseSpider):
149     name = "myspider5"
150     allowed_domains = ["10.60.32.179"]
151     start_urls = [
152         ‘http://10.60.32.179/Site/Site1/myindex.shtml‘,
153         #‘http://example.com/page2‘,
154     ]
155 
156     items=[]
157     item=DmozItem()
158 
159     def parse(self, response):
160         # collect `item_urls`
161         hxs=HtmlXPathSelector(response)
162         item_urls=hxs.select(‘//*[@id="_ctl0_LblContent"]/div/div//ul/li‘)
163 
164 
165 
166         base_url = get_base_url(response)
167         
168 
169         for item_url in item_urls:
170 
171 
172             
173         
174             MySpider5.item[‘date‘]=item_url.select(‘span/text()‘).extract()
175             MySpider5.item[‘title‘]=item_url.select(‘a/text()‘).extract()
176             MySpider5.item[‘link‘]=item_url.select(‘a/@href‘).extract()
177             MySpider5.item[‘desc‘]=item_url.select(‘text()‘).extract()
178 
179             
180 
181             relative_url=MySpider5.item[‘link‘]
182             print(relative_url[0])
183             base_url = get_base_url(response)
184             item_details_url=urljoin_rfc(base_url, relative_url[0])
185             print ‘xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=‘, str(item_details_url)
186 
187             yield Request(url=item_details_url, callback=self.parse_details)
188 
189             
190 
191 
192     # def parse_item(self, response):
193     #     hxs=HtmlXPathSelector(response)
194     #     item_urls=hxs.select(‘//*[@id="_ctl0_LblContent"]/div/div//ul/li‘)
195 
196         
197 
198     #     # item_details_url=item[‘link‘]
199     #     # populate `item` fields
200     #     relative_url=item_urls.select(‘a/@href‘).extract()
201     #     print(relative_url[0])
202     #     base_url = get_base_url(response)
203     #     item_details_url=urljoin_rfc(base_url, relative_url[0])
204     #     print ‘item urls=============================================================‘
205     #     yield Request(url=item_details_url,callback=self.parse_details,dont_filter=True,meta={‘item‘:item,‘items‘:items})
206 
207     def parse_details(self, response):
208         #item = response.meta[‘item‘]
209         # populate more `item` fields
210         
211 
212         print("***********************In parse_details()***************")
213         hxs=HtmlXPathSelector(response)
214         print("----------------------------------------------------------------")
215         print(response.url)
216         item_detail=hxs.select(‘/html/body/center/div/div[4]/div[1]/p[1]‘).extract()
217         print("________________",item_detail)
218         #item=response.meta[‘item‘]
219         #item[‘detail‘]=item_detail
220         
221         #items.append(item)
222         MySpider5.item[‘detail‘]=item_detail
223         # item[‘detail‘]=item_detail
224 
225         MySpider5.items.append(MySpider5.item)
226 
227         
228 
229         return MySpider5.item
230 
231 
232     def parse_details2(self, response):
233         #item = response.meta[‘item‘]
234         # populate more `item` fields
235         bbsItem_loader=ItemLoader(item=DmozItem(),response=response)
236         url=str(response.url)
237         bbsItem_loader.add_value(‘title‘,item[‘title‘])
238         abc={
239         ‘detail‘:‘/html/body/center/div/div[4]/div[1]/p[1]‘}
240         bbsItem_loader.add_xpath(‘detail‘,abc[‘detail‘])
241         return bbsItem_loader.load_item()
242 
243 
244 
245 class MySpider6(CrawlSpider):
246     name = "myspider6"
247     allowed_domains = ["10.60.32.179"]
248     start_urls = [
249         ‘http://10.60.32.179/Site/Site1/myindex.shtml‘,
250         #‘http://example.com/page2‘,
251     ]
252     link_extractor={
253         # ‘page‘:SgmlLinkExtractor(allow=‘/bbsdoc,board,\w+\.html$‘),
254         # ‘page_down‘:SgmlLinkExtractor(allow=‘/bbsdoc,board,\w+,page,\d+\.html$‘),
255         ‘page‘:SgmlLinkExtractor(allow=‘/Article/\w+\/\w+\.shtml$‘),
256     }
257     
258     _x_query={
259         ‘date‘:‘span/text()‘,
260         ‘date2‘:‘/html/body/center/div/div[4]/p‘,
261         ‘title‘:‘a/text()‘,
262         ‘title2‘:‘/html/body/center/div/div[4]/h2‘
263     }
264     _y_query={
265         ‘detail‘:‘/html/body/center/div/div[4]/div[1]/p[1]‘,
266     }
267 
268     def parse(self,response):
269         self.t=0
270         for link in self.link_extractor[‘page‘].extract_links(response):
271             yield Request(url=link.url,callback=self.parse_content)
272             self.t=self.t+1
273 
274     
275 
276     def parse_content(self,response):
277         bbsItem_loader=ItemLoader(item=DmozItem(),response=response)
278         url=str(response.url)
279         bbsItem_loader.add_value(‘desc‘,url)
280         bbsItem_loader.add_value(‘link‘,url)
281         bbsItem_loader.add_xpath(‘title‘,self._x_query[‘title2‘])
282         bbsItem_loader.add_xpath(‘pubtime‘,self._x_query[‘date2‘])
283         bbsItem_loader.add_xpath(‘content‘,self._y_query[‘detail‘])
284         bbsItem_loader.add_value(‘id‘,self.t) #why not useful?
285         return bbsItem_loader.load_item()
286 
287 
288 class MySpider6SD(CrawlSpider):
289     name = "myspider6sd"
290     allowed_domains = ["10.60.7.45"]
291     start_urls = [
292         ‘http://10.60.7.45/SITE_sdyc_WEB/Site1219/index.shtml‘,
293         #‘http://example.com/page2‘,
294     ]
295     link_extractor={
296         # ‘page‘:SgmlLinkExtractor(allow=‘/bbsdoc,board,\w+\.html$‘),
297         # ‘page_down‘:SgmlLinkExtractor(allow=‘/bbsdoc,board,\w+,page,\d+\.html$‘),
298         ‘page‘:SgmlLinkExtractor(allow=‘/Article/\w+\/\w+\.shtml$‘),
299         #http://10.60.32.179/Site/Col411/Article/201510/35770_2015_10_29_8058797.shtml
300         #http://10.60.7.45/SITE_sdyc_WEB/Col1527/Article/201510/sdnw_2110280_2015_10_29_91353216.shtml
301     }
302     
303     _x_query={
304         ‘date‘:‘span/text()‘,
305         ‘date2‘:‘/html/body/center/div/div[4]/p‘,
306 
307         ‘title‘:‘a/text()‘,
308         #‘title2‘:‘/html/body/center/div/div[4]/h2‘
309         ‘title2‘:‘/html/body/div[4]/div[1]/div[2]/div[1]/h1[2]/font‘
310         #‘author‘:‘/html/body/div[4]/div[1]/div[2]/div[1]/div/span[1]‘
311         #‘pubtime2‘:‘/html/body/div[4]/div[1]/div[2]/div[1]/div/span[2]‘
312 
313     }
314     _y_query={
315         #‘detail‘:‘/html/body/center/div/div[4]/div[1]/p[1]‘,
316         ‘detail‘:‘//*[@id="Zoom"]‘
317     }
318 
319     def parse(self,response):
320         self.t=0
321         for link in self.link_extractor[‘page‘].extract_links(response):
322             yield Request(url=link.url,callback=self.parse_content)
323             self.t=self.t+1
324 
325     
326 
327     def parse_content(self,response):
328         bbsItem_loader=ItemLoader(item=DmozItem(),response=response)
329         url=str(response.url)
330         bbsItem_loader.add_value(‘desc‘,url)
331         bbsItem_loader.add_value(‘link‘,url)
332         bbsItem_loader.add_xpath(‘title‘,self._x_query[‘title2‘])
333         bbsItem_loader.add_xpath(‘pubtime‘,self._x_query[‘date2‘])
334         bbsItem_loader.add_xpath(‘content‘,self._y_query[‘detail‘])
335         bbsItem_loader.add_value(‘id‘,self.t) #why not useful?

336         return bbsItem_loader.load_item()

时间: 2024-08-11 07:43:09

简单的新闻客户端APP开发(DCloud+thinkphp+scrapy)的相关文章

史上最简单的个人移动APP开发入门--jQuery Mobile版跨平台APP开发

书是人类进步的阶梯. ——高尔基 习大大要求新新人类要有中国梦,鼓励大学生们一毕业就创业.那最好的创业途径是什么呢?就是APP.<构建跨平台APP-jQuery Mobile移动应用实战>就是一本写给没钱没身份没资历的创业小白看的APP书,看完这本书你可以拥有自己的一个APP,不用花钱就能移植到其他移动平台,支持iOS,Android,Windows Phone!!!!!!!!找个最便宜的来练手吧!  小白APP交流Q群:  348632872 清华大学出版社推出的<构建跨平台APP:j

OuNews 简单的新闻客户端应用源码

一直想练习MVP模式开发应用,把学习的RxJava.Retrofit等热门的开源库结合起来,于是写了这么一款新闻阅读软件, 有新闻.图片.视频三大模块,使用Retrofit和Okhttp实现无网读缓存,有网根据过期时间重新请求, 还有边缘或整页侧滑.夜间模式切换等小功能,还写了几个自定义小控件,虽然无啥卵用,但是学到了很多东西,很有收获. 源码下载:http://code.662p.com/view/13095.html 二.运行截图 <ignore_js_op>  <ignore_js

android开发笔记之网络编程—简易新闻客户端

今天我们来对前面讲过的知识综合运用一下,包括xml的PULL解析,listView的万能适配器等知识.... 那先来看一个组件-->智能图片加载器(smart-image-view),它可以很方便的加载一张网络图片. SmartImageView的设计初衷是来取代Android自带的ImgageView组件,另外它还提供了一些附加功能,如: 支持通过URL来加载图片: 支持从电话簿中加载图片: 异步加载图片: 图片被缓存在内存,以便下次快速加载显示: SmartImageView类可以被很容易扩

开源:我的Android新闻客户端,速度快、体积小、支持离线阅读、操作简便、内容展现形式丰富多样、信息量大、功能全面 等(要代码的留下邮箱)

分享:我的Android新闻客户端,速度快.体积小.支持离线阅读.操作简便.内容展现形式丰富多样.信息量大.功能全面 等(要代码的留下邮箱) 历时30天我为了开发这个新闻客户端APP,以下简称觅闻 http://m.yunxunmi.com/ 由于本人比较愚钝,不太擅长各种开源代码的运用,因此全部从0开始开发,期间开发了: 一个新闻采集器(C++),截止目前为止已经连续运行20多天没出现任何故障,采集接近150个大中型新闻分类网站,采集器下载及介绍网站预计下周免费发布,风格类似我的即时通讯网站 

IOS版新闻客户端应用源码项目

IOS版新闻客户端应用源码,这个是一款简单的新闻客户端源码,该应用实现没采用任何第三方类库的 ,并且这个应用的UI做得很不错的,值得我们的参考和学习,希望大家可以更加完善这款新闻类的应用吧. 源码下载: http://code.662p.com/view/6343.html 详细说明: http://ios.662p.com/thread-1471-1-1.html

谷歌眼镜Mirror app开发之简单新闻浏览页面

Mirror app和Google glass其他APP一样,UI简洁很重要,所以我们需要设计一下怎么布局. 本人的布局如下: 有个绿色的标题,白色的简介还有蓝色的来源,布局很简单,代码如下 1 <article> 2 <img src="http://static.freebuf.com/2014/07/weixing-220x150.jpg" width="100%" height="100%"> 3 <div

移动新闻网站,掌上移动新闻,移动新闻客户端,jQuery Mobile移动新闻网站,移动新闻网站demo,新闻阅读器开发

我们坐在地铁上,常常拿出手机查看新浪移动新闻,腾讯新闻,或者刷微信看新闻等等功能.你们有没有想过他们是如何实现的.移动互联网,越来越热闹了. 因为HTML5来了,jQuery Moblie来了.今天我就用jqm来给大家做一个简单的移动新闻网站. 先看效果图: 好吧,我们来看看实现的代码: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <

博客园客户端(Universal App)开发随笔 - Setting Page的实现方法与经验

前言 几乎所有的移动 App 都会为用户提供一个设置页面(Setting Page 或 Preference Page),来满足大家对于一个 App 众口难调的需求.虽然有一种说法表示,最好的 App 不需要设置,一切默认呈现给用户的就是最好的选择.但是对于大多数开发人员来说,这样的境界不是可以简单达到的:而且对于部分“设置控”用户来说,没有设置页面怎么看都觉得少了些什么.所以对于大部分 App 来说,设置页面还是一个必备品. 本文将分别介绍 Windows 和 Windows Phone 的设

博客园客户端(Universal App)开发随笔 – App也需要物流前的打包

想起来一个笑话:唐僧一行千辛万苦来到佛祖面前,准备取经,佛祖轻声问了一句:汝等带U盘了吗?师徒4人立刻昏倒在地.好吧,扯远了,不过是想告诉大家准备工作一定要到位. Universal App 的打包发布其实与传统的 Windows Phone / Windows Store App 项目并无太大不同,但是鉴于总有人会在这些步骤中遇到问题,而且即使是发布过几个应用的开发者也不例外,所以对这个看起来比较繁琐的过程做一个小结还是必要的. 打包前的准备工作 1. 修改编译模式 在调试程序时,我们通常会选