PyCharm调试运行Scrapy教程
PyCharm调试运行Scrapy教程
一、使用scrapy创建一个项目
这里使用scrapy官方第一个示例
scrapy startproject tutorial
使用PyCharm打开项目,在tutorial/tutorial/spiders目录下创建quotes_spider.py
文件并写入,以下代码
二、复制cmdline.py到项目主目录
找到scrapy下的cmdline.py文件(比如我这里是D:\Language\Miniconda3\envs\default\Lib\site-packages\scrapy\cmdline.py)
复制一份到tutorial项目的根目录下(scrapy.cfg文件的同一目录下)
三、编缉文件调试运行配置
Name--和上边创建的spider文件相同,我这里叫quotes_spider
Script path--选择当前项目下的cmdline.py,我这里是F:\PycharmProjects\tutorial\cmdline.py
Parameters--crawl+要调试运行的spider名称,我这里是crawl quotes
Working directory--填项目所在主目录,我这里是F:\PycharmProjects\tutorial
最后要注意点“Apply”,不要直接点“OK”
四、调示和运行演示
选择调试,程序成功停在断点处
选择运行,程序也成功通行
pycharm下打开、执行并调试scrapy爬虫程序
-
首先得有一个Scrapy项目,我在Desktop上新建一个Scrapy的项目叫test,在Desktop目录打开命令行,键入命令:
scrapy startproject test1
目录结构如下:
-
打开Pycharm,选择open
-
选择项目,ok
-
打开如下界面之后,按alt + 1, 打开project 面板
-
在test1/spiders/,文件夹下,新建一个爬虫spider.py, 注意代码中的
name="dmoz"
。这个名字后面会用到。 -
在test1目录和scrapy.cfg同级目录下面,新建一个begin.py文件(便于理解可以写成main.py),注意箭头2所指的名字和第5步中的
name='dmoz'
名字是一样的。
-
from scrapy import cmdline
-
-
cmdline.execute("scrapy crawl dmoz".split())
7. 上面把文件搞定了,下面要配置一下pycharm了。点击Run->Edit Configurations
8. 新建一个运行的python模块
9. Name:改成spider; script:选择刚才新建的那个begin.py文件;Working Direciton:改成自己的工作目录
10. 至此,大功告成了,点击下图,右上角的按钮就能运行了。
调试
可以在其他代码中设置断点,就可以debug运行
转载1:http://www.jianshu.com/p/f85120fcbca0
转载2:http://blog.csdn.net/wangsidadehao/article/details/52911746
pip install Protego
截至2018.1,这变得容易得多。现在Module name
,您可以在项目的中进行选择Run/Debug Configuration
。将此设置为,scrapy.cmdline
并将其设置Working directory
为scrapy项目的根目录(其中有一个目录settings.py
)。
像这样:
现在,您可以添加断点来调试代码。
intellij的想法也可以。
创建main.py:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
#coding=utf-8
import sys
from scrapy import cmdline
def main(name):
if name:
cmdline.execute(name.split())
if __name__ == '__main__':
print('[*] beginning main thread')
name = "scrapy crawl stack"
#name = "scrapy crawl spa"
main(name)
print('[*] main thread exited')
print('main stop====================================================')
显示如下:
根据文档https://doc.scrapy.org/en/latest/topics/practices.html
import scrapy
from scrapy.crawler import CrawlerProcess
class MySpider(scrapy.Spider):
# Your spider definition
...
process = CrawlerProcess({
'USER_AGENT': 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)'
})
process.crawl(MySpider)
process.start() # the script will block here until the crawling is finished
import sys
from scrapy import cmdline
cmdline.execute(f"scrapy crawl {sys.argv[1]}".split())
----------
from scrapy.crawler import CrawlerProcess
from scrapy.utils.project import get_project_settings
process = CrawlerProcess(get_project_settings())
process.crawl('your_spider_name')
process.start()
爬虫出现Forbidden by robots.txt
先说结论,关闭scrapy自带的ROBOTSTXT_OBEY功能,在setting找到这个变量,设置为False即可解决。
使用scrapy爬取淘宝页面的时候,在提交http请求时出现debug信息Forbidden by robots.txt,看来是请求被拒绝了。开始因为是淘宝页面有什么保密机制,防止爬虫来抓取页面,于是在spider中填入各种header信息,伪装成浏览器,结果还是不行。。。用chrome抓包看了半天感觉没有影响简单页面抓取的机制(其他保密机制应该还是有的,打开一个页面时,向不同服务器递交了很多请求,还设定了一些不知道干啥的cookies),最后用urllib伪造请求发现页面都能抓取回来。于是上网查了一下robot.txt是什么,发现原来有个robot协议,终于恍然大悟:
我们观察scrapy抓包时的输出就能发现,在请求我们设定的url之前,它会先向服务器根目录请求一个txt文件:
2016-06-10 18:16:26 [scrapy] DEBUG: Crawled (200) <GET https://item.taobao.com/robots.txt> (referer: None)
这个文件中规定了本站点允许的爬虫机器爬取的范围(比如你不想让百度爬取你的页面,就可以通过robot来限制),因为默认scrapy遵守robot协议,所以会先请求这个文件查看自己的权限,而我们现在访问这个url得到
User-agent: *
Disallow: /
可以看见,淘宝disallow根目录以下所有页面。。。。(似乎有新闻说淘宝关闭了爬虫对它们的爬取权限,因为涉及到用户隐私)所以scrapy就停止了之后的请求和页面解析。
我们在setting改变ROBOTSTXT_OBEY为False,让scrapy不要遵守robot协议,之后就能正常爬取了。
2016-06-10 18:27:38 [scrapy] INFO: Spider opened
2016-06-10 18:27:38 [scrapy] INFO: Crawled 0 pages (at 0 pages/min), scraped 0 items (at 0 items/min)
2016-06-10 18:27:38 [scrapy] DEBUG: Crawled (200) <GET https://item.taobao.com/xxxxxxx> (referer: None)
对于使用robot协议的站点,只需要我们的爬虫不遵守该协议,就可以了,但是对于防止爬虫爬取,站点还有检查请求头、检查ip等等手段,还需要其他的相应处理。
执行命令:scrapy crawl dmoz时,出现
[scrapy] DEBUG: Forbidden by robots.txt
修改方法:
将setting改变ROBOTSTXT_OBEY为False
setting.py-->USER_AGENT
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'