coolllyy 发表于 2020-6-13 00:26

scrapy里rules正则写法求助

本帖最后由 coolllyy 于 2020-6-13 00:28 编辑

想爬取一个网站所有文章页,用了scrapy CrawlSpider爬取
之前网站文章页格式是 www.某某.com/a/611037.html
于是乎我就写 Rule(LinkExtractor(allow=r'/a/\d+\.html'), callback='parse_item', follow=True),
现在网站内容页改链接格式了
换成了www.某某.com/ticai/xuxiegaixie/696037.html
ticai和 xuxiegaixie 是会变的 不同栏目不同
然后我现在只想爬新格式文章页,就是不想爬以前带了/a的文章页了。rule写了好几次都失败了,
只能来这求助了。

puppy1980 发表于 2020-6-13 06:20

那两个地方用至少一个字母正则得了呗
还有既然是栏目 也是有限的基本 搞个列表遍历?

1170 发表于 2020-6-13 08:29

本帖最后由 1170 于 2020-6-13 09:23 编辑

Rule(LinkExtractor(deny=r'/a/\d+\.html'),这样就不会爬取带了/a的文章页了

涛之雨 发表于 2020-6-13 08:41

楼上应该是没看懂吧。
楼主是之前爬过一遍了,
更新后有一部分是之前爬过的,是之前/a/下的网页。
他想过滤掉这部分。。。。
虽然我不会{:301_1008:}这个应该做不到吧
可以先用字典获取一下之前爬过的页面的数字,然后做个判断?

coolllyy 发表于 2020-6-13 10:25

之前/a/数字.html 所有网页我已经爬取过了。
现在我把 start_urls换成了www.某某.com/ticai/xuxiegaixie/696037.html
数据存在另外一个数据表里。
然后我编了一个不怎么完美的正则,Rule(LinkExtractor(allow=r'([\s\S.]*?)/([\s\S.]*?)/\d+\.html'), callback='parse_item', follow=True),
如果start_urls = ['www.某某.com/ticai/xuxiegaixie/696037.html'],整站爬取时候只会爬新格式内容页,不会爬取/a/数字的内容页。
但是出现个问题,如果start_urls = ['www.某某.com/a/611037.html'],竟然这个正则不能束缚起始页,一直抓/a/数字的内容页入库。。
所以想问问 怎么编写个完善的正则,要求就是 /一串字母/一串字母/数字.html并且/a/数字.html就不能通过。

coolllyy 发表于 2020-6-13 11:00

1170 发表于 2020-6-13 08:29
Rule(LinkExtractor(deny=r'/a/\d+\.html'),这样就不会爬取带了/a的文章页了

    rules = (
      Rule(LinkExtractor(allow=r'([\s\S.]*?)/([\s\S.]*?)/\d+\.html'), callback='parse_item', follow=True),
      Rule(LinkExtractor(deny=r'a/\d+\.html'),),
    )

这样设置了,a/数字.html还是爬取并且执行了callback='parse_item' 。困扰了{:1_936:}

1170 发表于 2020-6-13 12:58

本帖最后由 1170 于 2020-6-13 14:34 编辑

coolllyy 发表于 2020-6-13 11:00
rules = (
      Rule(LinkExtractor(allow=r'([\s\S.]*?)/([\s\S.]*?)/\d+\.html'), callback='p ...
应该这样rules = (
      Rule(LinkExtractor(allow=r'([\s\S.]*?)/([\s\S.]*?)/\d+\.html', deny=r'a/\d+\.html'), callback='parse_item', follow=True),
    )
写在一个入了里面
页: [1]
查看完整版本: scrapy里rules正则写法求助