传说中的暑假终于结束了——又是gsoap以及scrapy[2012.9.11]

首先补充一个当时记录下来的关于android的一点东西。

当时做app用到了一个抽屉效果,是民间工具集android-misc-widgets的一部分,以下是当时在网上找的方法,在这里备忘。

android-misc-widgets的google工程地址: -widgets/http://code.google.com/p/android-misc,从帖子回复中可以看出有好多人不知道怎么把这个工程下载并安装带自己的IDE里,下面我介绍下怎么安装该工程:
1,这个工程的建立需要:subverson这个工具,比如:TortoiseSVN;在自己电脑上安装好这个软件
2,安装好之后,我们可以在资源管理器里右击的时候会出现SvnCheckout菜单,点击并进入出现下面画面:
当然 ,图中的Url of repository里面的url(到工程指定的网站上面把工程路径复制下来即可)是我添加进去的,那就是远程代码仓库的路径,然后点击ok就把远程的工程下载到自己电脑上了.
最后想说下载下来的工程Import到IDE(如Eclipse)里面并不能跑,缺乏一些必须的文件,所以自己可以另建一个工程,然后把res,src这两个文件夹给替换掉,最后把AndroidManifest.xml也替换掉,就能跑了。

Style.xml里

<style name="iWindowTitleBackground"parent="android:WindowTitleBackground">   
        <item name="android:background">@drawable/title_bar</item>       
</style>


将"android:WindowTitleBackground">改为"@*android:WindowTitleBackground">然后clean重新build就可以了.
加 * 可以引用更多的属性。


然后是暑假在堕落中折腾的部分,先前的MFC问题困扰了很久,后来尝试了多重配置,首先是静态库和动态库的问题,两个工程需要一致,然后字符集也需要注意,后面主工程调成unicode就跑起来了,还有就是我的程序本身有很多绝对路径,必然要做相应改动才能正常使用。另外,普通的路径需要使用‘/’或\\',但是mdb中路径必须是x:\xx\xx,双杠目测不行。


服务器端运行以后终于可以开始网站,网页没做美化,主要是实现webservice的调用。此时又纠结很久,原因是wsdl按照网上的方法用gsoap附带工具生成时没有写get,用ie测试会报错,但网上会说那个其实是已经生效的表现,又按别人随手写了个get,于是悲剧发生了。正确的做法是要在get中打开那个wsdl文件。核心部分是在main函数中的soap_init(&soap);的下面加入:   
soap.fget  =  http_get; 即:

soap_init(&soap); 
soap.fget = http_get;
m = soap_bind(&soap, NULL, 18083, 100);

具体可以参考http://www.cnblogs.com/Laokong-ServiceStation/archive/2011/04/29/2032331.html。

网站调用wsdl用的是xfire,myeclipse有自带的,虽然也可以用自己的。


webservice运行后cmd看端口号方法:netstat -na或者-nab 后者显示创建该连接的进程。


另外在网站用到了cos组件上传。安装就是把cos.jar放到WebRoot\WEB-INF\lib下,然后写法网上一搜一堆。

可以参考http://lengyue-dick.iteye.com/blog/316950这篇。


之后又是scrapy,折腾了一周多。

实话说scrapy不难,尤其是看着写完的代码,但是对于我这种既不会python又不会xpath又不会scrapy的人会时常犯小错误。

好在真心不难,所以调着调着也调出来了。

有些东西还是趁早备忘下吧。

1.因为这次爬的是类似于社交网站的有环存在的网站,所以使用set把用户进行保存。set的作用1是保存所有用户名供后续爬虫使用,2是查重,若多套数据一起爬只需判断每次新获得的用户是否已在set中。

2.对于xpath再次推荐chrome的xpath helper,mac下按ctrl+shift+x唤出,可以在需要获得xpath的地方按shift或者在xpath编辑框中输入来查看结果。另外chrome自带option+花键+i的看源代码的工具,两者结合省事很多。但是tbody标签总是不靠谱,一般有tbody的地方我都跳过。

3.还是关于xpath,如果开头的地方是上一级直接后代则\省略,\\则继续写着

4.xpath中extract()出的是一个列表,可以用索引来取第几项,也可以手动拼接成一个字符串。yyy="".join(xxx),如果双引号中间有空格则各项间有空格连接。

5.关于有多行多列的数据,要想办法取到需要的所有行,然后用for site in sites语句取到各项。

tr[position()>3 and position()<(last()-1)]

就是从第4行取到倒数第三行。

6.取到的东西如果想提取一部分可以使用正则表达式,如hxs.select('xxx').re('\w+')可以提取单词。

7. 在for循环中定义item=xxxitem(),否则会不断覆盖,append到items中的每一项都是最后那项

8.取不固定位置的网页中aaa:bbb的bbb部分时可以查找aaa,xpath如下:hsx.select(xxxxxxxxxxxxx/ccc[contains(text(),"aaa")]/../following-sibling::zz/xxxxxxxxxxxxx).extract()。不确定的时候最好用contains而不是绝对的等于,因为我爬的这个网页其实那个aaa前后就是有换行符的,导致匹配失败,用包含就可以找到。following-sibling是同级后面节点,zz表示类型,比如td,tr这些,如果任意类型就用*。

9.调试的时候输出可以使用

 for item in items:
	print str(item)

不容易有错,其他没爬到数据或者有字符编码问题都容易报错。

10.取属性,比如img的@alt和a的@href后不需要/text()

11.在页面获得链接后再请求有两种,一种调用自己和调用别的函数都可以,

items.append(Request(url,callback=self.parsexxx))

,另一种是
items.append(self.make_request_from_url(url))

12.出于效率的考虑,尽可能高并发,不然爬起来很慢,当然有时候还是需要设置写爬行速率,不能把别人服务器爬瘫。

13.可以在函数中写文件,不过感觉还是用pipeline的好。

f=open("xx","a")
f.write("xxxxx")
f.close()

接下来把python再看看估计这部分就算结束了,继续要折腾mfc那个程序的改写以及传说中的三维网站了。

嗯,贝贝加油。






猜你喜欢

转载自blog.csdn.net/tutuguaiguai0427/article/details/7967775