分类目录归档:Python

scrapy _getEndpoint() takes exactly 4 arguments (2 given)

Twisted 15.0 appears to have changed the signature of the _getEndpoint method on twisted.web.client.Agent. This causes the http11 handler to throw exceptions like so:
Traceback (most recent call last):
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/core/downloader/middleware.py”, line 38, in process_request
return download_func(request=request, spider=spider)
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/core/downloader/__init__.py”, line 123, in _enqueue_request
self._process_queue(spider, slot)
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/core/downloader/__init__.py”, line 143, in _process_queue
dfd = self._download(slot, request, spider)
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/core/downloader/__init__.py”, line 154, in _download
dfd = mustbe_deferred(self.handlers.download_request, request, spider)

File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/utils/defer.py”, line 39, in mustbe_deferred
result = f(*args, **kw)
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/core/downloader/handlers/__init__.py”, line 40, in download_request
return handler(request, spider)
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/core/downloader/handlers/http11.py”, line 36, in download_request
return agent.download_request(request)
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/scrapy/core/downloader/handlers/http11.py”, line 174, in download_request
d = agent.request(method, url, headers, bodyproducer)
File “/usr/share/python/spotify-prelude2-directed-crawlers/local/lib/python2.7/site-packages/twisted/web/client.py”, line 1560, in request
endpoint = self._getEndpoint(parsedURI)
exceptions.TypeError: _getEndpoint() takes exactly 4 arguments (2 given)

That method’s signature in Twisted 15.0.0 is def _getEndpoint(self, uri): while in version 14.0.2 it isdef _getEndpoint(self, scheme, host, port):

Celery与redis的异步任务

从官方文档,熟悉其使用:
http://docs.celeryproject.org/en/master/getting-started/first-steps-with-celery.html

1.mkdir celerytest
2.cd celerytest
创建以下两个文件。
Tasks.py
from celery import Celery
# app = Celery(‘tasks’, broker=’amqp://guest@localhost//’)
app = Celery(‘tasks’, backend=’redis://localhost:6379/1′, broker=’redis://localhost:6379/0′)
# app = Celery(‘tasks’, broker=’redis://localhost:6379/0′) no result return

@app.task
def add(x, y):
return x + y

————
Test.py
from tasks import add
result = []
if __name__ == ‘__main__’:
for i in range(10):
for j in range(100):
result.append(add.delay(i, j))
for r in result:
print r.ready(),r.get()

在celerytest目录下执行以下命令
3.celery -A tasks worker –loglevel=info
4.运行test.py程序

Django关闭模板的autoescape功能

在django的模板中,如果你输出一些特殊字符如”<> “‘”即HTML中会出现的特殊标签及冒号引号等,则它会自动把相关符号进行转义,导致与你所需不致,故在必要的时候需要关闭它。

svcs2是我们需要通过模板输出svcs的效果,由于autoescape的作用影响,会输出如下

需要对autoescape的功能进行关闭,如下图。

终于符合预期输出了。

 

{% autoescape off %}

svcs2 = {{ servers }};

{% endautoescape %}

Pycurl在低版本centos环境安装实例全过程分享

安装pycurl,提示libcurl的库文件太旧,无法安装。


下载libcurl进行编译,http://curl.haxx.se/download/curl-7.40.0.tar.gz

http://curl.haxx.se/download.html


经编译并安装libcurl库后,使用pip install pycurl,则完成相关包了。

————————————————

测试pycurl是否安装成功,提示错误:


import pycurl

 undefined symbol: curl_multi_socket_action

这是由于使用了错误的连接库而产生的,错误的连接库有如下几种可能。

1.系统存在多个相应的同名链接库,导致使用错误的链接库。

2.编译参数设置不对,导致编译时没有把必须的组件编译进动态库中。

3.所依赖的库,依赖了更多的其它项,这些项缺失或丢失。

 

解决这问题的直接方法是检查目标程序或动态库所有依赖项是否符合预期。检查连接库的命令是:

ldd (library dynamic detect)


pycurl.so问题,指向了一个libcurl.so.3的版本,故是错误版本。正确的链接版本是libcurl.so.4如下图所示。


解决问题的办法,如果按照传统的以下四种办法是不一定能解决的,这是因为如下办法是只适用于标准的configure+make方式编译和链接的,如下图所示:


 – add LIBDIR to the `LD_LIBRARY_PATH’ environment variable  during execution 

 – add LIBDIR to the `LD_RUN_PATH’ environment variable   during linking 

 – use the `-Wl,-rpath -Wl,LIBDIR’ linker flag

 – have your system administrator add LIBDIR to `/etc/ld.so.conf’


为了避免后续有提示libcurl.so.4找不到,从而加载失败的情况,需要把/usr/local/lib动态库加入到/etc/ld.so.conf中。按以下方法

1./sbin/ldconfig
2.echo ‘/usr/local/lib’ >> /etc/ld.so.conf
3./sbin/ldconfig更新连接缓存信息。

而python的包管理工具,是可以调用gcc编译程序,那是否包的setup.py指名了编译详细办法呢???

分析setup.py的出错信息


指向setup.py源码100行位置,在其附近我们找到了关键线索PYCURL_CURL_CONFIG。


在百度上搜索该关键环境变量,我们知道它是指向一个叫curl-config的文件,在linux标准编译环境内,xxx-config是由configure命令生成的目标程序的配置文件,常包括程序安装位置以及头文件和连接库的信息,它在调用make install命令后,它应该会与执行程序存放在一起,故在源代码目标可找到该配置文件,如下图所示:


开始设置环境变量并编译:

export PYCURL_CURL_CONFIG=/home/apps/curl-7.19.7/curl-config

pip install pycurl

 

仍然出现如下悲剧错误:


我们进一步分析错误原因,显然这个文件是找到但因权限不足而不允许执行,这原因仍然要看setup.py源码。如下图:


它是把这个PYCURL_CURL_CONFIG指导向的文件,当作一个可执行程序进行操作,并传入一个参数:–version,所以应该是配置文件本身属性问题。


这说明它不是一个执行文件,因为curl-config是一段脚本程序,我们为它添上可执行文件的属性。

chmod a+x curl-config


已经可以返回版本的结果了,再次执行如下命令。

export PYCURL_CURL_CONFIG=/home/apps/curl-7.19.7/curl-config

pip install pycurl

终于顺利完成。


全过程最终使用的源码,是根据centos6.5的软件源提示而从网上下载的,这样做的主要目的自认为与centos6.5一致,可避名因为包的不兼容而产生种种希奇古怪的问题。

pycurl-7.19.5.1.tar.gzhttps://pypi.python.org/packages/source/p/pycurl/pycurl-7.19.5.1.tar.gz#md5=f44cd54256d7a643ab7b16e3f409b26b

curl-7.19.7.tar.gzhttp://curl.haxx.se/download/archeology/curl-7.19.7.tar.gz

scrapyd的调试

关于scrapyd的调试,真有一种是”踏破铁鞋无觅处,得来全不费功夫的感觉”,现记录全过程。

第一种方法:



 

第二种方法:

from twisted.scripts.twistd import run

from os.path import join, dirname

from sys import argv

import scrapyd

argv[1:1] = [‘-n’, ‘-y’, join(dirname(scrapyd.__file__), ‘txapp.py’)]

run()

然后调试该main.py,即得结果。

开源的网站漏洞扫描器

Golismero

官网:http://www.golismero.com/

Golismero是一款开源的Web扫描器,它不但自带不少的安全测试工具,而且还可导入分析市面流行的扫描工具的结果,比如Openvas,Wfuzz, SQLMap, DNS recon等,并自动分析。Golismero采用插件形式的框架结构,由纯python编写,并集成了许多开源的安全工具,可以运行在Windows,Linux, BSD,OS X等系统上,几乎没有系统依赖性,唯一的要求就是python的版本不低于2.7,其官网是:http://golismero-project.com。

消除allowed_domains的影响

在使用scrapy genspider xxx xxx.yyy时指定了一个域名,而这些域名将会记录在相应的spider中的allowed_domains参数中,这些参数会影响我们使用动态url捕获网站源码。因为在爬行某网站时,就会进使用这个域名进行判断爬行的url是否为合法的url,如果不是对应的url就会自动终止爬行。所以如果你要使用一个爬虫爬所有不同网站时,就需要屏蔽这个参数的影响。

Python单线程异步执行所有任务

经过测试和源码分析,证实scrapy是单线程异步模式进行工作。

start t = 1421317312.693043 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/1

end t = 1421317312.693043 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/1

2015-01-15 02:21:52-0800 [dmoz] DEBUG: Crawled (200) <GET http://www.baidu.com/1> (referer: None)

2015-01-15 02:21:52-0800 [dmoz] DEBUG: Crawled (200) <GET http://www.baidu.com/2> (referer: None)

start t = 1421317312.697041 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/2

end t = 1421317312.697041 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/2

xxxxxxxxxxxxxxxxxxxxxxxxxxx

————parse t = 1421317312.699310 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/1

start t = 1421317370.153754 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/3

end t = 1421317370.153754 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/3

————parse t = 1421317370.156391 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/2

2015-01-15 02:22:50-0800 [dmoz] DEBUG: Crawled (200) <GET http://www.baidu.com/3> (referer: None)

start t = 1421317370.171718 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/4

end t = 1421317370.171718 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/4

————parse t = 1421317370.175629 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/3

2015-01-15 02:22:50-0800 [dmoz] DEBUG: Crawled (200) <GET http://www.baidu.com/4> (referer: None)

start t = 1421317370.194542 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/5

end t = 1421317370.194542 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/5

————parse t = 1421317370.197380 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/4

2015-01-15 02:22:50-0800 [dmoz] DEBUG: Crawled (200) <GET http://www.baidu.com/5> (referer: None)

start t = 1421317370.213179 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/6

end t = 1421317370.213179 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/6

————parse t = 1421317370.216034 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/5

2015-01-15 02:22:50-0800 [dmoz] DEBUG: Crawled (200) <GET http://www.baidu.com/6> (referer: None)

start t = 1421317370.230415 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/7

end t = 1421317370.230415 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/7

————parse t = 1421317370.233487 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/6

2015-01-15 02:22:50-0800 [dmoz] DEBUG: Crawled (200) <GET http://www.baidu.com/7> (referer: None)

start t = 1421317370.249530 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/8

end t = 1421317370.249530 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/8

————parse t = 1421317370.252307 thread id <property object at 0x7faab1e4be10>, http://www.baidu.com/7

中文字符写文件失败解决办法

在python中虽然已经在py文件头中已经加入编码文件标识,但在写文件时,仍然是报失败的。

报错如下:

据网络大牛说,这类报错只发生在python2.7.x版本上,而2.6和3.x都没有问题,而我一般在2.7.x下开发,所以仍是要解决这类问题。

解决办法也简单,如下:

在程序入口的地方设置默认字符串编码为utf-8即可。

import sys

reload(sys) #

sys.setdefaultencoding(‘utf-8’)

网上的更详细解释: