PyCharm调试运行Scrapy教程

PyCharm调试运行Scrapy教程

转载

一、使用scrapy创建一个项目

这里使用scrapy官方第一个示例

scrapy startproject tutorial

使用PyCharm打开项目,在tutorial/tutorial/spiders目录下创建quotes_spider.py文件并写入,以下代码

 View Code

 

二、复制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爬虫程序

 

  1. 首先得有一个Scrapy项目,我在Desktop上新建一个Scrapy的项目叫test,在Desktop目录打开命令行,键入命令:scrapy startproject test1 


    1 

    目录结构如下: 

    1 
    1 
    1 

     

  2. 打开Pycharm,选择open 


    1 

     

  3. 选择项目,ok 

    1

     

  4. 打开如下界面之后,按alt + 1, 打开project 面板 

    1
    2 
  5. 在test1/spiders/,文件夹下,新建一个爬虫spider.py, 注意代码中的name="dmoz"。这个名字后面会用到。 

    1

     

  6. 在test1目录和scrapy.cfg同级目录下面,新建一个begin.py文件(便于理解可以写成main.py),注意箭头2所指的名字和第5步中的name='dmoz' 名字是一样的。

  1. from scrapy import cmdline
  2.  
  3. cmdline.execute("scrapy crawl dmoz".split())

 

 

 

1


7. 上面把文件搞定了,下面要配置一下pycharm了。点击Run->Edit Configurations

 

 

1


8. 新建一个运行的python模块 

1


9. Name:改成spider; script:选择刚才新建的那个begin.py文件;Working Direciton:改成自己的工作目录 
1
10. 至此,大功告成了,点击下图,右上角的按钮就能运行了。 
1

 

 

 

 

调试

 

可以在其他代码中设置断点,就可以debug运行


Paste_Image.png

 

 

转载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)。

像这样:

PyCharm Scrapy调试配置

现在,您可以添加断点来调试代码。

 注意 Working directory;

 

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'





posted @ 2021-02-02 19:33  CharyGao  阅读(1156)  评论(0编辑  收藏  举报