验证码登录:
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
成功!