scrapy genspider -t crawl spider名称 www.xxxx.com LinkExtractors: allow:必须要匹配这个正则表达式的URL才会被提取,如果没有给出,或为空,匹配所有。(str or list) deny:allow的反面,如果没有给出或空,不排除所有。优先级高于allow。(str or list) allow_domains :(str or list) deny_domains :(str or list) deny_extensions:(list):提取链接时,忽略的扩展名列表。 restrict_xpaths :从哪些XPATH提取 tags:(str or list):默认为('a','area') attrs :(list):默认为('href') unique :boolean 重复过滤 Rule: callback:从link_extractor中每获取到链接时,参数所指定的值作为回调函数,该回调函数接受一个response作为其第一个参数。 注意:当编写爬虫规则时,避免使用parse作为回调函数。由于CrawlSpider使用parse方法来实现其逻辑,如果覆盖了 parse方法,crawl spider将会运行失败。 follow:是否跟进。如果callback为None,follow 默认设置为True ,否则默认为False。 process_links:指定该spider中哪个的函数将会被调用,从link_extractor中获取到链接列表时将会调用该函数。该方法主要用来过滤。 process_request:指定该spider中哪个的函数将会被调用, 该规则提取到每个request时都会调用该函数。 (用来过滤request)
from scrapy.spider import Spider from scrapy.http import Request from scrapy.selector import Selector from CSDNBlog.items import CsdnblogItem
class CSDNBlogSpider(Spider): """爬虫CSDNBlogSpider"""
name = "CSDNBlog"
#减慢爬取速度 为1s
download_delay = 1
allowed_domains = ["blog.csdn.net"]
start_urls = [
#第一篇文章地址
"http://blog.csdn.net/u012150179/article/details/11749017"
]
def parse(self, response):
sel = Selector(response)
#items = []
#获得文章url和标题
item = CsdnblogItem()
article_url = str(response.url)
article_name = sel.xpath('//div[@id="article_details"]/div/h1/span/a/text()').extract()
item['article_name'] = [n.encode('utf-8') for n in article_name]
item['article_url'] = article_url.encode('utf-8')
yield item
#获得下一篇文章的url
urls = sel.xpath('//li[@class="next_article"]/a/@href').extract()
for url in urls:
print url
url = "http://blog.csdn.net" + url
print url
yield Request(url, callback=self.parse)