美文网首页
python3.5 + Scrapy踩过的那些坑

python3.5 + Scrapy踩过的那些坑

作者: 水瓶由希君D | 来源:发表于2017-06-10 12:00 被阅读0次

    验证码登录:

    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

    成功!

    相关文章

      网友评论

          本文标题:python3.5 + Scrapy踩过的那些坑

          本文链接:https://www.haomeiwen.com/subject/jzjbittx.html