python3.5 + Scrapy踩过的那些坑

验证码登录:

scrapy 通过 xpath 模块可以轻松解析出所需的标签,这个暂且不提。项目中遇到一个问题,在解析图形验证码的过程中发现其url只一个固定值,我们通过Request直接获取到图片地址, 然后我试图使用urllib.urlretrieve 来下载图片然后登录,然后发现每一次验证码都不正确。经过分析发现,每一次download的图片都会变化,所以得出结论:服务器是通过cookie判断身份的唯一性,因此请求页面的request需和download图片的request保持一致性,至少cookie需一致。因为我配置相同的headers直接使用get请求下载图片,结果正确。

此外,需注意cookie的时效性,做了一个过期自动登录的策略。

使用脚本运行scrapy脚本

scrapy官方推荐使用scrapy crawl spiderName 来运行脚本,我们需要需要根据需求做一个通过api调用执行的脚本。

1、首先尝试使用CrawlerProcess

搭建一个简易的flask框架

“`py

        app = flask(__name__)

        @route(‘/login’)

            def login():

            process.run()`</blockquote>`

“`

报错:processor必须在主线程运行

2、之后改用CrawlerRunner,成功!

然而,当第二次调用login时报错:Scrapy – Reactor not Restartable

reactor是单例,一旦创建无法重启,所以无法可持续。

3、第二种方法或许有解决方案,并没有深究。于是想到最简单的一种方案,直接使用os.system(cmd),岂不美哉?想一想还有点小兴奋呢! So, CrawlerScript.py为scrapy启动器。

 另写一个run.py

“`python

@app.route(‘/login_chezhibao/username=&password=’,methods=[‘GET’,’POST’])

        def login(username, password):

            cmd =’python CrawlerScript.py’

            print(os.system(cmd))

            return ‘success’

“`

运行,还是报错…  这次是 no module name scrapy

无法识别scrapy!明明已经装了, Why??

于是在Terminal手动敲 python CrawlerScript.py 同样的错!

最后恍然大悟, 我用的scrapy是基于python3安装的,于是改成python3 CrawlerScript.py

成功!

    原文作者:水瓶由希君D
    原文地址: https://www.jianshu.com/p/d2523244613d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞