linux下使用crontab设置scrapy爬虫定时抓取数据

1. crontab设置定时执行程序

在我们的项目中,需要从门户网站上抓取新闻数据。由于网上的新闻数据更新的速率并不是太快,所以只需要设置每天执行一遍数据抓取即可。这样也可以利用新闻上面的时间便签,每次只抓取当天发布的新闻,这样就不会出现重复了。

首先我们已经建立了scrapy爬虫工程,其中只需要执行main.py函数即可正确进行数据抓取。假设main.py所在的路径是:home/myusrname/workspace/myspider/myspider/main.py

crontab文件语法

分 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-6 command

“*”代表取值范围内的数字,
“/”代表”每”,
“-”代表从某个数字到某个数字,
“,”分开几个离散的数字

那么我们可以这样来设置每天执行一边该程序:

  • $ crontab -e # 打开crontab设置文件
  • 在该设置文件中输入:0 23 * * * python home/myusrname/workspace/myspider/myspider/main.py
    每天的23点执行一次mian.py文件

2. 提示:AttributeError: ‘list’ object has no attribute ‘iteritems’错误

原本在自己的电脑上跑得挺好的程序,一放到服务器上就出错了。

ITEM_PIPELINES = ['linkedIn.pipelines.LinkedinPipeline']

上网查了一下,原来是settings中ITEM——PIPELINES 在这里若为list的话就会出错,解决方法。
所以只需要将ITEM_PIPELINES修改为字典形式即可:

ITEM_PIPELINES = {
    'myproject.pipelines.PricePipeline': 300,
    'myproject.pipelines.JsonWriterPipeline': 800,
}

这里的整数值表示的是执行的优先级,范围是0-1000,数字越小,则执行的优先级越高。

3. 使用sudo提示用户不在sudoers文件中的解决方法

有时候需要使用sudo命令来执行程序,可是用户本身的权限不够。这是就需要我们来进行用户权限修改了,可以把我们的用户增加到sudoers用户中,这时候需要修改 /etc/sudoers文件
- 首先需要使用su命令切换到root用户
- 然后修改sudoers文件,可以直接使用vi编辑器进行改写。假设我要增加的用户名叫 dabai,那么可以在sudoers文件的最后加上下面一句话:
dabai ALL=(ALL)
然后退出保存,这时提示该文件为只读文件,那么我们可以使用:qw! 来进行强制保存。
这时候就可以使用sudo命令了。

4. sudo命令运行pip安装python库提示没有pip

尽管我们已经安装好了pip,只是直接是用的话会提示权限不够。在第三步中我们已经成功地将用户修改可以使用sudo了,但是却没有办法使用pip命令,真是烦。其实这主要是路径的问题。
我们可以直接使用全路径就可以了,比如:
sudo /usr/local/bin/bin/pip install requests
当然我们可以通过修改路径来实现,不用每次都输入全路径,但是这个我也是偶尔采用,所以现在还没看具体如何修改,之后再更新吧。

5. scrapy进行翻页抓取

在进行数据抓取的过程中,我们经常需要实现翻页抓取的功能,scrapy中实现这个很简单,只需要在抓完第一页之后,返回request即可,参数中携带下一页的url和自己的解析函数。
例如:

def parse(self, response): 
    . 
    . 
    . 
    url = 下一页的url 
    yield scrapy.Request(url, callback=self.parse) 

在抓取新浪的新闻时,只有第一页的数据没有问题,而使用回调进行抓取时出现403错误,即服务器拒绝了访问,应该是headers设置的问题。我尝试着修改user-agent,但是一改就连原来的都出错了。所以应该是user-agent的问题,但是尝试了几个都没成功。
最后我只好直接在start_urls中添加了所有的页面url,然后在抓取的过程中再进行判断。这样的话效率肯定会比较低,但是由于目前对效率的要求不是太高,所以就先采用这种比较笨的方法了。

你可能感兴趣的:(linux下使用crontab设置scrapy爬虫定时抓取数据)